การยกระดับสิทธิ์ของกระบวนการโดยทางโปรแกรม?


147

ฉันพยายามที่จะติดตั้งใช้บริการ InstallUtil.exe Process.Startแต่เรียกใช้ผ่าน นี่คือรหัส:

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

ที่ใดm_strInstallUtilคือพา ธ แบบเต็มและ exe ไปที่ "InstallUtil.exe" และstrExePathเป็นพา ธ / ชื่อแบบเต็มไปยังบริการของฉัน

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

นี่คือทั้งหมดใน Windows Vista ฉันใช้กระบวนการในตัวดีบัก VS2008 ที่ยกระดับเป็นสิทธิ์ผู้ดูแลระบบ

ฉันลองตั้งค่าแล้วstartInfo.Verb = "runas";แต่ดูเหมือนจะไม่สามารถแก้ปัญหาได้


หลังจากที่ฉันได้เพิ่มstartInfo.UseShellExecute = true;นอกจากนี้startInfo.Verb = "runas";มันทำงานได้ดีสำหรับฉัน
แมตต์

คำตอบ:


172

คุณสามารถระบุว่ากระบวนการใหม่ควรเริ่มต้นด้วยการยกระดับสิทธิ์โดยการตั้งค่าคุณสมบัติกริยาของวัตถุ startInfo ของคุณเป็น 'runas' ดังต่อไปนี้:

startInfo.Verb = "runas";

สิ่งนี้จะทำให้ Windows ทำงานราวกับว่ากระบวนการนั้นเริ่มต้นจาก Explorer ด้วยคำสั่งเมนู "Run as Administrator"

นี่หมายถึงการแจ้งเตือน UAC จะเกิดขึ้นและจะต้องได้รับการยอมรับจากผู้ใช้: หากไม่พึงประสงค์ (เช่นเพราะมันจะเกิดขึ้นในช่วงกลางของกระบวนการที่ยาว) คุณจะต้องใช้กระบวนการโฮสต์ทั้งหมดของคุณด้วย การยกระดับสิทธิ์โดยสร้างและฝังแอปพลิเคชัน Manifest (UAC)เพื่อกำหนดระดับการดำเนินการ 'maximumAvailable': สิ่งนี้จะทำให้ UAC พรอมต์ปรากฏขึ้นทันทีที่แอปของคุณเริ่มต้นและทำให้กระบวนการลูกทั้งหมดทำงานด้วยสิทธิ์ยกระดับ .

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


9
"runas" ไม่ได้ผลสำหรับฉันเช่นกัน เป็นไปได้หรือไม่ว่าจะใช้งานได้กับ UAC เท่านั้น
Dirk Vollmar

18
@LukePuplett ฉันขอขอบคุณพวกเขา มันเป็นวิธีที่ยอดเยี่ยมในการลดการติดตั้งชุดอุปกรณ์รูทโดยไม่แยกบทบาทผู้ใช้ออกจากกันโดยสิ้นเชิง
Colton

6
@Sparksis แต่ก็มีมุมมองอีกอย่างหนึ่ง คนที่รู้วิธีปกป้องระบบปฏิบัติการของพวกเขาพวกเขารู้วิธีทำโดยไม่ใช้ UAC และผู้ใช้ที่ไม่รู้จักการป้องกันพวกเขาคลิก 'ใช่' ทุกครั้งที่เห็นหน้าต่าง UAC ยังไม่มีสิ่งใดที่สามารถป้องกันไม่ให้แฮ็กเกอร์ - ไวรัส - ผู้เขียนใช้การหาช่องโหว่เพื่อหลีกเลี่ยง;) ดังนั้นฉันจึงเห็นด้วยกับ LukePuplett =)
Jet

24
ดูเหมือนว่าคุณต้องตั้งค่าstartInfo.ShellExecute=trueเช่นนี้เพื่อให้ทำงาน ... และฉันไม่สามารถรับวิธีนี้เพื่อทำงานกับไฟล์ปฏิบัติการที่อยู่บนเครือข่ายแชร์ (ต้องคัดลอกไปยังไดเรกทอรีชั่วคราวในเครื่องก่อนที่จะทำงาน) ..
TCC

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

46

รหัสนี้รวมทั้งหมดข้างต้นเข้าด้วยกันและรีสตาร์ทแอป wpf ปัจจุบันด้วย privs ผู้ดูแลระบบ:

if (IsAdministrator() == false)
{
    // Restart program and run as admin
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
    startInfo.Verb = "runas";
    System.Diagnostics.Process.Start(startInfo);
    Application.Current.Shutdown();
    return;
}

private static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}


// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)

อัปเดต: ต้องการวิธีการแสดงรายการแอป

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

ปัญหาเกี่ยวกับวิธีการดั้งเดิม: หากคุณใส่รหัสเริ่มต้นใหม่ใน app.xaml.cs OnStartup ก็ยังอาจเริ่มต้นหน้าต่างหลักสั้น ๆ แม้ว่าจะมีการเรียกปิด หน้าต่างหลักของฉันพังถ้า app.xaml.cs init ไม่ทำงานและในสภาพการแข่งขันบางอย่างมันจะทำเช่นนี้


ดูการปรับปรุงด้านล่าง
JCCyC

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

สิ่งนี้ใช้ได้สำหรับฉัน ฉันยังส่งต้นฉบับstring[] argsไปยังกระบวนการที่เกิดใหม่
DotNetPadawan

21

อ้างอิงจากบทความChris Corio: สอนแอพของคุณให้เล่นอย่างดีด้วยการควบคุมบัญชีผู้ใช้ Windows Vista, นิตยสาร MSDN, 2007 มกราคมShellExecuteตรวจสอบรายการที่ฝังตัวเท่านั้นและแจ้งให้ผู้ใช้ทราบถึงระดับความสูงหากจำเป็นขณะที่CreateProcessและ API อื่น ๆ หวังว่ามันจะช่วย

ดูเพิ่มเติม: บทความเดียวกับ .chm


7
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

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


3
การใช้รหัสนี้ฉันได้รับข้อผิดพลาดในการอนุญาต: "คำขอสิทธิ์การรักษาความปลอดภัยขององค์กรล้มเหลว" :(
Leonardo

อาจเป็น "หากผู้ใช้ที่ทำงานอยู่เป็นผู้ดูแลระบบของ" *
hB0

1
ที่น่าสนใจ - วิธีนี้สามารถทำได้ทุกวิธีไม่ใช่แค่วิธีการกระทำ (ฉันลองใช้กับวิธีที่กำหนดไว้ในหน้า ASPX)
Simon_Weaver

1

คุณควรใช้การเลียนแบบเพื่อยกระดับสถานะ

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

อย่าลืมยกเลิกบริบทที่ไม่มีบทบาทเมื่อคุณทำเสร็จแล้ว


28
คุณยังไม่ได้พูดถึงวิธีการเข้าใช้ Token LogonUser จะให้บริบทความปลอดภัยที่ จำกัด ของผู้ใช้เมื่อเปิดใช้งาน UAC
cwa

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