“ ClickOnce ไม่รองรับระดับการดำเนินการตามคำขอ 'requireAdministrator'”


95

ดังนั้นฉันจึงเขียนแอปพลิเคชันที่ต้องการเข้าถึงรีจิสทรี ฉันไม่ได้แตะการตั้งค่าการสร้างใด ๆ เลยอยากให้สิ่งนั้นทำงานได้ก่อนที่ฉันจะเพิ่มการสัมผัสอื่น ๆ เช่นคำอธิบายหรือชื่อ

ฉันได้รับข้อผิดพลาดที่จะไม่หายไปจากสีน้ำเงิน ClickOnce does not support the request execution level 'requireAdministrator'.ตอนนี้ฉันไม่ได้แตะ ClickOnce ในแอปพลิเคชันนี้ สิ่งที่ฉันทำคือรวมไฟล์รายการที่ขอสิทธิ์เหล่านี้

ปัญหาของฉันตอนนี้คือข้อผิดพลาดนี้จะไม่หายไปและฉันไม่สามารถรวบรวมโปรแกรมของฉันได้ มีคำแนะนำว่าต้องทำอย่างไร? (หมายเหตุด้านข้าง: ฉันกำลังจะเข้านอนดังนั้นฉันจะตรวจสอบในบ่ายวันพรุ่งนี้)


4
ฉันเกลียดที่จะระบุชัดเจนที่นี่ แต่คุณเพิ่มขออย่างชัดแจ้งrequireAdministratorสิทธิ์และClickOnce requireAdministratorเริ่มบ่นว่ามันไม่ได้รับการสนับสนุน ปัญหาควรมีความชัดเจนอย่างยิ่ง ClickOnce เห็นความจำเป็นในการยกระดับในรายการของคุณ (ซึ่งกลายเป็นส่วนหนึ่งของแอปพลิเคชันของคุณ) ฉันไม่แน่ใจว่าคุณต้องการอะไรอีกที่นี่ ...
Ken White

4
@KenWhite: อย่างไรก็ตามบางทีอาจไม่ชัดเจนหรือเป็นเหตุผลที่ข้อกำหนดของผู้ดูแลระบบร่วมกับการคลิกครั้งเดียวจะป้องกันไม่ให้คุณรวบรวมโปรเจ็กต์ไม่ใช่แค่เรียกใช้งานเท่านั้น แต่เป็นเช่นนั้น
500 - ข้อผิดพลาดภายในเซิร์ฟเวอร์

@ 500-InternalServerError ตรรกะควรบอกคุณว่าความสัมพันธ์เชิงสาเหตุเกิดขึ้นเพียงแค่การเพิ่ม "ต้องใช้ผู้ดูแลระบบ" ทำให้ไม่สามารถคอมไพล์ได้เนื่องจากมีบางอย่างที่เกี่ยวข้องกับ "ต้องไม่รองรับผู้ดูแลระบบ", IMO :-)
Ken White

1
ปัญหาไม่ได้อยู่ที่ฉันต้องการใช้ ClickOnce และสิทธิ์ของผู้ดูแลระบบปัญหาคือฉันต้องการใช้สิทธิ์ของผู้ดูแลระบบและได้รวบรวมไว้ก่อนหน้านี้ (ประมาณ 10 ครั้ง) กับพวกเขา แต่คราวนี้ ClickOnce บอกว่าเข้ากันไม่ได้
LMS

10
@KenWhite ปัญหาไม่ชัดเจนเท่าที่คุณแนะนำ ปัญหาเกิดขึ้นเมื่อคุณคลิกปุ่ม "เผยแพร่" (อย่างน้อยก็ทำเพื่อฉัน) ฉันเพิ่มรายการและเลือก "requireAdministrator" หลังจากนั้นโปรแกรมก็ทำงานได้อย่างไม่มีที่ติ เมื่อฉันคลิกเผยแพร่เท่านั้นที่ฉันเริ่มได้รับข้อผิดพลาดนี้และไม่สามารถล้างได้จนกว่าฉันจะเข้าไปที่การตั้งค่าและปิดใช้งาน "ClickOnce" ดังนั้นวิธีแก้ปัญหาจึงไม่ใช่ว่าไม่รองรับ "requireAdministrator" แต่ไม่สามารถเปิดใช้งาน "ClickOnce" และคุณไม่สามารถคลิก "เผยแพร่" ได้หากคุณตั้งค่า "requireAdministrator" ไว้
Gavin Coates

คำตอบ:


148

แก้ไข:ความคิดเห็นนี้ให้คำตอบที่ดีเช่นกัน

คลิกครั้งเดียวเพื่อเปิดใช้งานเมื่อใดก็ตามที่คุณคลิก "เผยแพร่" ไม่ว่าคุณจะต้องการหรือไม่ก็ตาม! หากคุณใช้ "requireAdministrator" ปรากฏว่าคุณไม่สามารถใช้ ClickOnce ได้ดังนั้นจึงไม่สามารถ "เผยแพร่" โครงการของคุณได้


ต้นฉบับ:

ปรากฎว่าภายใต้แท็บความปลอดภัยมีการเลือก "เปิดใช้งานการตั้งค่าความปลอดภัย ClickOnce" ทั้งที่ไม่ได้ตรวจเลย. อย่างไรก็ตามการยกเลิกการเลือกที่หยุด ClickO เมื่อให้ข้อผิดพลาดแก่ฉัน ที่ใช้เวลาค้นหา ...


3
อาฉันคิดว่ามันชัดเจนจากข้อความแสดงข้อผิดพลาดที่คุณได้รับ;)
500 - ข้อผิดพลาดภายในเซิร์ฟเวอร์

3
สิ่งที่ทำให้ฉันสับสนคือฉันไม่ได้เปิดใช้งาน ClickOnce
LMS

คำถามและคำตอบที่ดีมันช่วยฉันได้ขอบคุณ!
Moh

29
คลิกครั้งเดียวเพื่อเปิดใช้งานทุกครั้งที่คุณคลิก "เผยแพร่" ไม่ว่าคุณจะต้องการหรือไม่ก็ตาม! หากคุณใช้ "requireAdministrator" ปรากฏว่าคุณไม่สามารถใช้ ClickOnce ได้ดังนั้นจึงไม่สามารถ "เผยแพร่" โครงการของคุณได้
Gavin Coates

1
สิ่งที่ @GavinCoates พูดนั้นถูกต้อง เหตุผลก็คือแอปพลิเคชัน ClickOnce มักจะติดตั้งต่อผู้ใช้ในAppDataโฟลเดอร์ การยกระดับสิทธิ์จะทำให้เกิดการสลับบริบทของผู้ใช้โดยที่แอปพลิเคชัน ClickOnce ยังไม่ได้ติดตั้ง
bertl

44

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันมาที่นี่ในอีกสองปีต่อมา:

คุณสามารถปิดใช้งาน ClicKOnce ได้จากแท็บความปลอดภัยบนความเหมาะสมของโครงการเพื่อช่วยในการแก้ปัญหา ดูด้านล่าง:

ป้อนคำอธิบายภาพที่นี่


3
และเมื่อคุณจะเผยแพร่แอปพลิเคชันของคุณช่องทำเครื่องหมายนี้จะถูกเลือกอีกครั้ง
dikkini

@dikkini เป๊ะ! วิธีปิดการใช้งานใครมีคำตอบ?
saidfagan

@saidfagan ไม่มีคำตอบหรือทางออกสำหรับกรณีนี้ ฉันใช้ util ULMerge เพื่อรวมไฟล์ exe และ dll
dikkini

สิ่งนี้ใช้ได้ผลสำหรับฉันไม่สำคัญว่าฉันจะต้องปิดการใช้งานช่องทำเครื่องหมายตลอดเวลา
ศาสตราจารย์ซูม

18

หากคุณเคยใช้วิซาร์ดการเผยแพร่หรือ "เผยแพร่ทันที" ช่องทำเครื่องหมายคลิกหนึ่งครั้งจะถูกเลือกโดยอัตโนมัติ ...


16

ฉันรู้ว่ามันเก่า แต่ฉันก็เจอมันเพื่อหาคำตอบ ในกรณีของฉันฉันใช้ฟังก์ชันการเผยแพร่และฉันจำเป็นต้องใช้มันต่อไป ฉันต้องการเข้าถึงความสามารถของผู้ดูแลระบบด้วย ด้วยเหตุนี้คำตอบข้างต้นจึงไม่เหมาะกับฉัน

ฉันลงเอยด้วยการเพิ่มวิธีการในการเริ่มต้นแอปพลิเคชันของฉันที่ตรวจสอบว่ามีการเรียกใช้ในฐานะผู้ดูแลระบบหรือไม่และหากไม่เป็นเช่นนั้นให้เปิดตัวเองใหม่ในฐานะผู้ดูแลระบบ ในการดำเนินการนี้คุณต้องเพิ่มการอ้างอิงต่อไปนี้

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;

จากนั้นคุณจะต้องวางไว้ที่ใดที่หนึ่งที่วิธีการหลักของคุณสามารถเข้าถึงได้สะดวก ฉันใช้ WPF ดังนั้นฉันจึงเพิ่มลงใน MainWindow.xaml.cs แต่คุณสามารถเพิ่มได้ทุกที่ในช่วงต้นของรหัสของคุณ อย่าลืมเพิ่ม "คงที่" ในวิธีการเหล่านี้หากคุณต้องการ

private void AdminRelauncher()
{
    if (!IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
            Application.Current.Shutdown();
        }
        catch(Exception ex)
        {
            Console.WriteLine("This program must be run as an administrator! \n\n" + ex.ToString());
        }
    }
}

private bool IsRunAsAdmin()
{
    try
    {
        WindowsIdentity id = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(id);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (Exception)
    {
        return false;
    }
}

สุดท้ายเมื่อเริ่มโปรแกรมของคุณให้เพิ่มการอ้างอิงไปยังวิธีการ ในกรณีของฉันฉันเพิ่มลงใน MainWindow แต่เพิ่มไปที่ Main ก็ใช้ได้เช่นกัน

public MainWindow()
{
    InitializeComponent();
    AdminRelauncher(); //This is the only important line here, add it to a place it gets run early on.
}

หวังว่านี่จะช่วยได้!


มันเริ่มต้นอินสแตนซ์ใหม่ซึ่งโดยการกำหนดจะไม่เชื่อมต่อกับดีบักเกอร์ .. (คุณเรียกใช้อินสแตนซ์ใหม่ (ไม่ได้เชื่อมต่อ) ใหม่และปิดอินสแตนซ์ที่แนบมากับดีบักเกอร์)
deadManN

1
@deadManN จริงมาก. ฉันเข้าใจมันตั้งแต่ฉันไม่ต้องการดีบักเกอร์เมื่อถึงจุดนั้น แต่ฉันคิดว่าคุณสามารถเรียกใช้ VS ในฐานะผู้ดูแลระบบจากนั้นโปรแกรมจะเปิดตัวในโหมดผู้ดูแลระบบด้วย ข้ามการรีสตาร์ท ฉันจะทดสอบให้แน่ใจ
Tyler C

1
สำหรับใครก็ตามที่สะดุดกับสิ่งนี้สิ่งที่กล่าวมาข้างต้นได้ผลจริง
Tyler C

>> ไม่มีชื่อ 'Application' ในบริบทปัจจุบัน error
vee

รหัสนี้เริ่มกระบวนการใหม่เท่านั้น แต่แอปของฉันเป็นคอนโซลดังนั้นอาร์กิวเมนต์จึงว่างเปล่า
vee

5

การดำเนินการนี้สามารถทำได้โดยเลือก "เปิดใช้งานการตั้งค่าความปลอดภัย ClickOnce" (เนื่องจากไม่สามารถ "ยกเลิกการเลือก" ในระหว่างการเผยแพร่ได้ตามที่ระบุไว้) จากนั้นเลือก "นี่คือแอปพลิเคชันความน่าเชื่อถือบางส่วน" "อินทราเน็ตเฉพาะที่" จะถูกเลือกโดยอัตโนมัติในเมนูแบบเลื่อนลงซึ่งดีมาก

บันทึกการเปลี่ยนแปลงของคุณเผยแพร่แอปพลิเคชันสกีสำเร็จรูป :-)ข้อมูลโค้ดการตั้งค่าความปลอดภัย


2

ลองดูในแอปของคุณไฟล์สำแดงแล้วคุณจะเห็นสิ่งนี้:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

มีคำแนะนำอยู่ในความคิดเห็น แต่เพียงแค่ลบ "requireAdministrator" และใส่สิ่งนี้เข้าไปก็ช่วยแก้ปัญหาให้ฉันได้:

 <requestedExecutionLevel  level="asInvoker" uiAccess="false" />

2
OP กล่าวว่าพวกเขาต้องการการเข้าถึงรีจิสทรีในแอปพลิเคชันดังนั้นนี่จึงไม่ใช่ทางเลือก
LeeCambl

requireAdministratorจำเป็นต้องมีสิทธิ์ในการเขียนลงในรีจิสทรีดังนั้นนี่จึงเป็นข้อกำหนด
SkiSharp

ClickOnce ไม่รองรับระดับการดำเนินการตามคำขอasInvoke
SkiSharp

2

ฉันมีปัญหาเดียวกันฉันแก้ไขได้โดยยกเลิกการเลือก " เปิดใช้งานการตั้งค่าความปลอดภัย ClickOnce" เพื่อค้นหาตัวเลือกนี้ใน Visual Studio คลิกขวาที่โครงการ ==> คุณสมบัติ ==> เลือกความปลอดภัย ==> เปิดใช้งานการตั้งค่าความปลอดภัย ClickOnce (ตัวเลือกนี้คือ ตรวจสอบแล้วดังนั้นฉันจึงยกเลิกการเลือกและปัญหาของฉันได้รับการแก้ไข)


2

นี่คือข้อมูลโค้ดสำหรับ VB.NET

If Not New WindowsPrincipal(WindowsIdentity.GetCurrent).IsInRole(WindowsBuiltInRole.Administrator) Then
            Process.Start(New ProcessStartInfo With { _
                                                     .UseShellExecute = True, _
                                                     .WorkingDirectory = Environment.CurrentDirectory, _
                                                     .FileName = Assembly.GetEntryAssembly.CodeBase, _
                                                     .Verb = "runas"})

แก้ไข: แต่ถ้าคุณปรับใช้ด้วยวิธีนี้ซอฟต์แวร์ AV บางตัวจะบล็อกโค้ดของคุณ


1

สำหรับผู้ที่ใช้การยกเลิกการเลือก "เปิดใช้งานการตั้งค่าความปลอดภัย ClickOnce" ไม่สามารถใช้งานได้ให้ลองใช้วิธีที่ฉันพบ

ขั้นแรกปล่อยให้รายการ app.manifest ร้องขอ ExecutionLevel ตามที่เป็นอยู่:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

จากนั้นคุณแก้ไขไฟล์ Program.cs ของคุณดังนี้:

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;
using System.Windows.Forms;

ปรับโครงสร้างวิธีการหลักเช่น:

    static void Main()
        {
            var wi = WindowsIdentity.GetCurrent();
            var wp = new WindowsPrincipal(wi);

            bool runAsAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator);

            if (!runAsAdmin)
            {
                // It is not possible to launch a ClickOnce app as administrator directly,
                // so instead we launch the app as administrator in a new process.
                var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);

                // The following properties run the new process as administrator
                processInfo.UseShellExecute = true;
                processInfo.Verb = "runas";

                // Start the new process
                try
                {
                    Process.Start(processInfo);
                }
                catch (Exception)
                {
                    // The user did not allow the application to run as administrator
                    MessageBox.Show("Sorry, but I don't seem to be able to start " + 
                       "this program with administrator rights!");
                }

                // Shut down the current process
                Application.Exit();
            }
            else
            {
                // We are running as administrator
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

ใช้งานได้กับ Windows 10 และ Visual Studio 2019!


1

สำหรับใครก็ตามที่ประสบปัญหานี้ฉันคิดว่าฉันจะมีส่วนช่วยในสิ่งที่ได้ผลสำหรับฉัน

อ๋อ 'เปิดใช้งาน ClickOnce ตั้งค่าความปลอดภัย' ตัวเลือกอัตโนมัติได้รับการตรวจสอบอีกครั้งถ้าคุณยกเลิกการตรวจสอบมันเมื่อคุณทำรูปร่าง> เผยแพร่

สำหรับฉันฉันไม่จำเป็นต้อง 'เผยแพร่' - มันเป็น. exe แบบพกพาที่ใช้งานง่ายที่สร้างงานตามกำหนดการสำหรับผู้ใช้ของฉันและฉันต้องการให้แน่ใจว่ามันยกระดับแม้ว่าจะเข้าสู่ระบบในฐานะผู้ดูแลระบบก็ตาม

ดังนั้นฉันจึงเพิ่งคว้า. exe ล่าสุดของฉันจาก\ bin \ Releaseและนั่นคือสิ่งที่นำไปใช้กับระบบของลูกค้าของฉัน

ทำงานได้ตามที่คาดไว้นั่นคือเมื่อฉันวางไว้ในระบบที่เปิดใช้งาน UAC / ที่ค่าสูงสุด. exe จะมี 'โล่' อยู่และเมื่อฉันเรียกใช้แม้ว่าจะเข้าสู่ระบบในฐานะผู้ดูแลระบบก็ตาม มันยกระดับและฉันได้รับพรอมต์ UAC

ตอนนี้แอปตัวกำหนดตารางเวลางานเล็ก ๆ ของฉันสามารถสร้างงานได้โดยไม่ได้รับข้อผิดพลาด 'Access Denied' (ซึ่งก่อนหน้านี้สามารถแก้ไขได้โดยคลิกขวาที่. exe และคลิก Run as Administrator)


1
ฉันมีปัญหาเดียวกันนี้และคำตอบข้างต้นไม่ได้ผล ฉันหวังว่าพวกเขาจะทำงานคลิกอีกครั้งเมื่อตั้งค่าความปลอดภัย จำเป็นอย่างยิ่งและเป็นคุณสมบัติที่ดีในกรณีส่วนใหญ่โดยเฉพาะอย่างยิ่งสำหรับแอปที่เผยแพร่ทางออนไลน์อย่างไรก็ตามฉันหวังว่าจะมีตัวเลือกที่ดีกว่า / หลีกเลี่ยงปัญหาสำหรับสิ่งพิมพ์ในท้องถิ่นเท่านั้น
SkiSharp

-12

แค่

Imports System.security

และคุณจะไม่ได้รับข้อผิดพลาดใด ๆ และแอปพลิเคชันของคุณจะทำงานในฐานะผู้ดูแลระบบ


1
การกำหนดข้อมูลอ้างอิงให้กับแอสเซมบลีเพียงอย่างเดียวจะไม่รันโค้ดใด ๆ ในทุกกรณี หากไม่มีการโพสต์เพิ่มเติมสิ่งนี้จะไม่บอกอะไรเรา โพสต์นี้เกี่ยวข้องกับข้อกำหนดในการแก้ไขรีจิสทรีของผู้ดูแลระบบและการปรับใช้โดยเฉพาะผ่านทางตัวเลือก Visual Studio Publish ซึ่งสร้างแอสเซมบลี ClickOnce ถูกลงคะแนนเนื่องจากขาดความชัดเจนหรือไม่ชัดเจน
Anthony Mason

นี่ ... นี่คือไม่ สิ่งนี้จะไม่ทำอะไรเลยนอกจากเพิ่มจำนวนบรรทัดของคุณโดย 1 การอ้างอิงแอสเซมบลีโดยไม่มีการอ้างอิงถึงอ็อบเจ็กต์หรือวิธีการเรียกภายในแอสเซมบลีนั้นจะไม่ทำอะไรเลย เช่นเดียวกับความคิดเห็นก่อนหน้านี้ระบุไว้
SkiSharp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.