ฉันจะบังคับให้แอปพลิเคชัน. NET ของฉันทำงานเป็นผู้ดูแลระบบได้อย่างไร


875

เมื่อติดตั้งโปรแกรมของฉันบนเครื่องไคลเอนต์ฉันจะบังคับให้โปรแกรมของฉันทำงานเป็นผู้ดูแลระบบในWindows 7 ได้อย่างไร


3
นอกจากนี้สิ่งที่ Binary Worrier เขียนคุณอาจต้องการที่จะเขียนรหัสบางอย่างเพื่อทดสอบว่าคุณมีสิทธิ์ผู้ดูแลระบบ .. (นั่นคือสิ่งที่คุณจะขอ?)
lexu

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

2
อเล็กซ์เป็นจุดที่มาก ถ้าเป็นไปได้ยกระดับเมื่อจำเป็นมิฉะนั้นนโยบายกลุ่ม, UAC และตัวแปรอื่น ๆ จำนวนมากจะเข้ามาเล่น อย่างน้อยที่สุดเมื่อใช้ UAC ผู้ใช้จะต้องให้สิทธิ์ในการเรียกใช้ทุกครั้งเมื่อเทียบกับการดำเนินการของผู้ใช้ที่ระบุ
Anthony Mason

วิธีที่ถูกต้องคือการฝังไฟล์รายการลงในใบสมัครของคุณ
Elmue

คำตอบ:


1144

คุณจะต้องแก้ไขรายการที่ฝังอยู่ในโปรแกรม สิ่งนี้ใช้ได้กับ Visual Studio 2008 และสูงกว่า: โครงการ + เพิ่มรายการใหม่เลือก "Application Manifest File" เปลี่ยน<requestedExecutionLevel>องค์ประกอบเป็น:

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

ผู้ใช้จะได้รับพรอมต์UACเมื่อพวกเขาเริ่มโปรแกรม ใช้อย่างชาญฉลาด ความอดทนของพวกเขาสามารถเสื่อมสภาพได้อย่างรวดเร็ว


33
หากคุณได้รับข้อผิดพลาด ClickOnce เมื่อพยายามรวบรวมดูคำตอบนี้: stackoverflow.com/questions/11023998/…
SSS

17
โครงการของคุณจะต้องตั้งค่าให้ใช้รายการแอพด้วย - ในคุณสมบัติโครงการให้ตรวจสอบแท็บ "แอปพลิเคชัน" และตรวจสอบให้แน่ใจว่า "รายการ:" ภายใต้ "ทรัพยากร" ถูกตั้งเป็น app.manifest (หรือสิ่งที่คุณตั้งชื่อ ไฟล์ประกาศ).
Victor Chelaru

7
ฉันต้องโหลดโครงการใหม่อีกครั้งก่อนที่ VS จะแจ้งให้ฉันรีสตาร์ทในโหมดผู้ดูแลระบบ
Jon

3
@Alejandro - ใช่ UAC สามารถปิดใช้งานได้ แต่เมื่อเป็นเช่นนั้นแอปจะทำงานโดยอัตโนมัติในฐานะผู้ดูแลระบบ (สมมติว่าผู้ใช้ของคุณมีสิทธิ์ผู้ดูแลระบบ) เนื่องจากการปิดใช้งาน UAC หมายถึงทุกอย่างทำงานในสิทธิ์สูงสุดที่ผู้ใช้อนุญาต มันก็เหมือนกับการบ่นว่าถ้าคุณติดตั้งกุญแจแฟนซีไว้ที่ประตูมันจะไม่ทำงานถ้าประตูถูกถอดออก
Erik Funkenbusch

4
@ErikFunkenbusch มันจะไม่ "ทำงานโดยอัตโนมัติในฐานะผู้ดูแล" มันจะทำงานภายใต้สิทธิ์ปกติของผู้ใช้ (ผู้ดูแลระบบถ้าผู้ใช้เป็นผู้ดูแลระบบหรือมาตรฐานหากผู้ใช้เป็นมาตรฐาน) ขึ้นอยู่กับกรณีนั้นแม้ว่าจะเป็นค่าเริ่มต้นก็ตามโปรแกรมที่ดีจะหลีกเลี่ยงเช่นโรคระบาด ตามการเปรียบเทียบของคุณการล็อคแฟนซีนั้นดีและทั้งหมด แต่ซอฟต์แวร์ที่ได้รับการออกแบบอย่างเหมาะสมจะต้องคาดการณ์ถึงกรณีที่ประตูทั้งหมดถูกถอดออกแม้ว่าจะเป็นเหตุการณ์ที่เกิดขึ้นได้ยากก็ตาม
Alejandro

154

การเพิ่มrequestedExecutionLevelองค์ประกอบให้กับรายการของคุณนั้นเป็นเพียงการรบเพียงครึ่งเดียวเท่านั้น คุณต้องจำไว้ว่าสามารถปิดUACได้ หากเป็นเช่นนั้นคุณจะต้องตรวจสอบวิธีการเรียนแบบเก่าและวางกล่องโต้ตอบข้อผิดพลาดหากผู้ใช้ไม่ใช่ผู้ดูแลระบบ
(เรียกIsInRole(WindowsBuiltInRole.Administrator)ใช้เธรดของคุณCurrentPrincipal)


22
คุณสามารถใช้ <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> เช่นกัน
Mark Kram

18
@ MarkKram: สิ่งที่มีให้ได้สูงสุดมีให้ทำกับสิ่งนี้ คำถามเกี่ยวกับการบังคับให้ผู้ดูแลระบบมีค่าสูงสุดน้อยกว่า requireAdministrator และจะอนุญาตให้ผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบเริ่มแอปที่ยกระดับโดยไม่มีการแจ้งเตือน UAC ผู้ดูแลระบบเท่านั้นที่จะได้รับแจ้ง ...
Anders


ฉันจำรายละเอียดที่แน่นอนไม่ได้อีกต่อไป แต่ฉันคิดว่าสิ่งนี้ขึ้นอยู่กับความหมายของคุณโดยปิดการใช้งาน การวาง "ตัวเลื่อน UAC" ลงไปด้านล่างจะไม่เหมือนกับการปิดใช้งาน UAC (ยกเว้นใน Vista) หาก UAC ถูกปิดใช้งานอย่างสมบูรณ์กลไกระดับความสมบูรณ์ทั้งหมดจะถูกปิดใช้งานและมีเพียงคุณสมบัติ runas.exe แบบคลาสสิกจาก 2000 / XP เท่านั้น การตรวจสอบบทบาทผู้ดูแลระบบจัดการกับกรณี runas.exe
เดส

1
ฉันได้ตั้งค่า EnableLUA เป็น 0 บน Server 2008 R2 และลบตัวเองออกจากกลุ่มผู้ดูแลระบบรีบูทและตอนนี้ exe ที่ระบุระดับ = "requireAdministrator" ทำงานโดยไม่ต้องแจ้งให้ทราบ
Tal Aloni

86

ขั้นตอนโดยละเอียดมีดังนี้

  1. เพิ่มไฟล์รายการแอปพลิเคชันลงในโซลูชัน
  2. เปลี่ยนการตั้งค่าแอปพลิเคชันเป็น "app.manifest"
  3. อัปเดตแท็กของ "ร้องขอExecutionLevel" เป็น requireAdministrator

การเพิ่มไฟล์ใน Solution

เลือก Application Manifest File

เลือกตัวเลือกรายการ

อัปเดตไฟล์มานิเฟสต์

โปรดทราบว่าการใช้รหัสนี้คุณต้องปิดการตั้งค่าความปลอดภัยของ ClickOnce ในการทำเช่นนี้ให้ไปที่ Properties -> Security -> ClickOnce Security


New Item...ไม่ใช่ตัวเลือกในโครงการบริการติดตั้งของฉัน ฉันจะเพิ่มการแสดงรายการแอปได้อย่างไร ฉันสามารถเพิ่มลงในโครงการหลักของฉัน แต่ไม่ใช่เป็นตัวติดตั้ง
HackSlash

61

ฉันใช้รหัสบางอย่างเพื่อทำด้วยตนเอง:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}

45
สิ่งนี้จะตรวจพบว่าบริบทกำลังทำงานเป็นผู้ดูแลระบบหรือไม่ไม่บังคับให้แอปพลิเคชันทำงานเป็นผู้ดูแลระบบตามที่ร้องขอโดย OP
Matt Wilko

5
ฉันไม่คิดว่าจะมีวิธีการเขียนโปรแกรมใด ๆ เพื่อบังคับให้แอปพลิเคชันยกระดับ perms ของตัวเอง หากมีนั่นจะค่อนข้างเสี่ยงต่อความปลอดภัยใช่ไหม
Mark Richman

6
แม้ว่าทางออกของคุณจะดี แต่คำถามก็แตกต่างกัน ;)
Yash

ดูรุ่นที่ได้รับการปรับปรุงใหม่ของวิธีนี้ได้ที่นี่stackoverflow.com/a/50186997 (ส่วนตัว)
Hakan Fıstık

นี่ไม่ได้ตอบคำถาม!
Elmue

43

คุณสามารถฝังไฟล์ Manifest ในไฟล์ EXE ซึ่งจะทำให้ Windows (7 หรือสูงกว่า) รันโปรแกรมในฐานะผู้ดูแลระบบเสมอ

คุณสามารถค้นหารายละเอียดเพิ่มเติมได้ในขั้นตอนที่ 6: สร้างและฝังแอปพลิเคชัน Manifest (UAC) (MSDN)


19

ขณะที่ทำงานใน Visual Studio 2008 คลิกขวาบนแล้วเลือกProject -> Add New ItemApplication Manifest File

ในไฟล์รายการคุณจะพบแท็กrequestedExecutionLevelและคุณสามารถตั้งค่าระดับเป็นสามค่า:

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

หรือ

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

หรือ

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

ในการตั้งค่าแอปพลิเคชันของคุณให้ทำงานในฐานะผู้ดูแลระบบคุณต้องเลือกแอปกลาง


วิธีนี้ใช้ได้ผล อย่างไรก็ตามมันทำให้หน้าต่าง cmd เปล่าปรากฏขึ้นเมื่อเรียกใช้แอปพลิเคชัน CMD (ใช้แอป c # cmd เพื่อรัน exe บางส่วนในพื้นหลัง)
WM

13

ตาม

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

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

  • จากนั้นคลิกขวาที่โครงการ
  • เพิ่มรายการใหม่
  • สุดท้ายค้นหาและคลิก Application Manifest File

12

ใน Visual Studio 2010 คลิกขวาที่ชื่อโครงการของคุณ กด "ดูการตั้งค่า Windows" สิ่งนี้จะสร้างและเปิดไฟล์ชื่อ "app.manifest" ภายในไฟล์นี้แทนที่ "asInvoker" ด้วย "requireAdministrator" ตามที่อธิบายไว้ในส่วนที่แสดงความคิดเห็นภายในไฟล์


6
คำตอบนี้เป็นเรื่องเกี่ยวกับ VB.NET :-) ไม่ใช่ VS 2010 โดยทั่วไป คำตอบ "เพิ่มรายการใหม่" นั้นเกี่ยวกับ C # ใน C ++ คุณสามารถทำได้ในการตั้งค่าโครงการ
Philm

12

อีกวิธีในการทำเช่นนี้ในรหัสเท่านั้นคือการตรวจสอบว่ากระบวนการทำงานในฐานะผู้ดูแลระบบเช่นในคำตอบโดย @NG . จากนั้นเปิดแอปพลิเคชั่นอีกครั้งแล้วปิดแอปพลิเคชั่นปัจจุบัน

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

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

แม้ว่ารหัสนี้มีข้อดีดังกล่าวข้างต้น แต่ก็จำเป็นต้องเปิดตัวอีกครั้งเป็นกระบวนการใหม่ซึ่งไม่ได้เป็นอย่างที่คุณต้องการ

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

1
+1 สำหรับวิธีใช้รหัสเท่านั้น โปรดทราบว่าคุณต้องเปิดใช้งาน UAC เพื่อให้มีโอกาสเปิดใช้งานสิ่งใด ๆrunasในฐานะผู้ดูแลระบบจากผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบมิฉะนั้นจะเปิดได้อย่างเงียบ ๆ พร้อมสิทธิ์ผู้ใช้ปัจจุบัน (ทำเครื่องหมายบน Windows 7 64 บิต) เท่าที่ฉันสามารถบอกได้สิ่งเดียวที่คุณสามารถทำได้เมื่อ UAC ถูกปิดการใช้งานและผู้ดูแลระบบที่ถูกต้องหายไปคือหยุดการทำงานในช่วงเวลาที่เหมาะสม
จริงๆ

9

คุณสามารถสร้างรายการโดยใช้การตั้งค่าความปลอดภัย ClickOnce แล้วปิดการใช้งาน:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

หลังจากที่คุณคลิกมันไฟล์จะถูกสร้างขึ้นภายใต้โฟลเดอร์คุณสมบัติของโครงการที่เรียกว่าapp.manifestเมื่อสิ่งนี้ถูกสร้างขึ้นคุณสามารถยกเลิกการEnable ClickOnce Security Settingsเลือกตัวเลือก

เปิดไฟล์นั้นและเปลี่ยนบรรทัดนี้:

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

ถึง:

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

สิ่งนี้จะทำให้โปรแกรมต้องการสิทธิ์ผู้ดูแลระบบ


7

นี่เป็นเวอร์ชั่นที่ง่ายของคำตอบนี้โดย @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

1
นี่ไม่ได้ตอบคำถาม!
Elmue

@Elue มันมีเหตุผลมากกว่าที่จะเพิ่มความคิดเห็นของคุณในคำตอบเดิมที่ฉันเพิ่ง refactored คุณสามารถค้นหาลิงค์ไปยังคำตอบในเหมือง
Hakan Fıstık

-3

คลิกขวาที่ไฟล์เรียกทำงานของคุณไปที่คุณสมบัติ> ความเข้ากันได้และทำเครื่องหมายในช่อง 'เรียกใช้โปรแกรมนี้ในฐานะผู้ดูแลระบบ'

หากคุณต้องการเรียกใช้ในฐานะผู้ดูแลระบบสำหรับผู้ใช้ทุกคนให้ทำสิ่งเดียวกันใน 'เปลี่ยนการตั้งค่าสำหรับผู้ใช้ทั้งหมด'


4
สิ่งนี้ไม่ตอบคำถาม "เมื่อติดตั้งโปรแกรมของฉันบนเครื่องไคลเอนต์" ไม่ใช่ "ฉันจะทำอย่างไร"
Joe

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

2
มันจะดีกว่าที่จะตั้งความต้องการของผู้ดูแลระบบในรายการ ฉันเถียงมันตอบคำถาม แต่เพิ่งจะ
BradleyDotNET

3
@Joe เพื่อความยุติธรรมคำตอบที่ยอมรับไม่ตอบคำถาม OPs เพราะคุณต้องติดตั้งแอปพลิเคชัน exe ใหม่ มันแทบจะเป็นทางออกสำหรับ "เมื่อติดตั้งโปรแกรมของฉัน" หากสิ่งใดคำตอบที่ downvote นี้ถูกต้องมากกว่าคำตอบที่ยอมรับดังนั้นฉันไม่เข้าใจว่าทำไมคำตอบนั้นมีคะแนนมากกว่า 400 คะแนน
NickG

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