เมื่อติดตั้งโปรแกรมของฉันบนเครื่องไคลเอนต์ฉันจะบังคับให้โปรแกรมของฉันทำงานเป็นผู้ดูแลระบบในWindows 7 ได้อย่างไร
เมื่อติดตั้งโปรแกรมของฉันบนเครื่องไคลเอนต์ฉันจะบังคับให้โปรแกรมของฉันทำงานเป็นผู้ดูแลระบบในWindows 7 ได้อย่างไร
คำตอบ:
คุณจะต้องแก้ไขรายการที่ฝังอยู่ในโปรแกรม สิ่งนี้ใช้ได้กับ Visual Studio 2008 และสูงกว่า: โครงการ + เพิ่มรายการใหม่เลือก "Application Manifest File" เปลี่ยน<requestedExecutionLevel>
องค์ประกอบเป็น:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
ผู้ใช้จะได้รับพรอมต์UACเมื่อพวกเขาเริ่มโปรแกรม ใช้อย่างชาญฉลาด ความอดทนของพวกเขาสามารถเสื่อมสภาพได้อย่างรวดเร็ว
การเพิ่มrequestedExecutionLevel
องค์ประกอบให้กับรายการของคุณนั้นเป็นเพียงการรบเพียงครึ่งเดียวเท่านั้น คุณต้องจำไว้ว่าสามารถปิดUACได้ หากเป็นเช่นนั้นคุณจะต้องตรวจสอบวิธีการเรียนแบบเก่าและวางกล่องโต้ตอบข้อผิดพลาดหากผู้ใช้ไม่ใช่ผู้ดูแลระบบ
(เรียกIsInRole(WindowsBuiltInRole.Administrator)
ใช้เธรดของคุณCurrentPrincipal
)
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
เช่นกัน
IsInRole
Anders พูดถึง
ขั้นตอนโดยละเอียดมีดังนี้
โปรดทราบว่าการใช้รหัสนี้คุณต้องปิดการตั้งค่าความปลอดภัยของ ClickOnce ในการทำเช่นนี้ให้ไปที่ Properties -> Security -> ClickOnce Security
New Item...
ไม่ใช่ตัวเลือกในโครงการบริการติดตั้งของฉัน ฉันจะเพิ่มการแสดงรายการแอปได้อย่างไร ฉันสามารถเพิ่มลงในโครงการหลักของฉัน แต่ไม่ใช่เป็นตัวติดตั้ง
ฉันใช้รหัสบางอย่างเพื่อทำด้วยตนเอง:
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;
}
คุณสามารถฝังไฟล์ Manifest ในไฟล์ EXE ซึ่งจะทำให้ Windows (7 หรือสูงกว่า) รันโปรแกรมในฐานะผู้ดูแลระบบเสมอ
คุณสามารถค้นหารายละเอียดเพิ่มเติมได้ในขั้นตอนที่ 6: สร้างและฝังแอปพลิเคชัน Manifest (UAC) (MSDN)
ขณะที่ทำงานใน Visual Studio 2008 คลิกขวาบนแล้วเลือกProject -> Add New Item
Application Manifest File
ในไฟล์รายการคุณจะพบแท็กrequestedExecutionLevel
และคุณสามารถตั้งค่าระดับเป็นสามค่า:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
หรือ
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
หรือ
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
ในการตั้งค่าแอปพลิเคชันของคุณให้ทำงานในฐานะผู้ดูแลระบบคุณต้องเลือกแอปกลาง
ตาม
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
คุณจะต้องเพิ่มรายการแอปพลิเคชันหากคุณยังไม่มีหรือไม่ทราบวิธีเพิ่มรายการ เนื่องจากบางโครงการไม่ได้เพิ่มไฟล์รายการแยกกันโดยอัตโนมัติก่อนอื่นให้ไปที่คุณสมบัติโครงการนำทางไปที่แท็บแอปพลิเคชันและตรวจสอบเพื่อให้แน่ใจว่าโครงการของคุณไม่รวมรายการที่ด้านล่างของการแตะ
ใน Visual Studio 2010 คลิกขวาที่ชื่อโครงการของคุณ กด "ดูการตั้งค่า Windows" สิ่งนี้จะสร้างและเปิดไฟล์ชื่อ "app.manifest" ภายในไฟล์นี้แทนที่ "asInvoker" ด้วย "requireAdministrator" ตามที่อธิบายไว้ในส่วนที่แสดงความคิดเห็นภายในไฟล์
อีกวิธีในการทำเช่นนี้ในรหัสเท่านั้นคือการตรวจสอบว่ากระบวนการทำงานในฐานะผู้ดูแลระบบเช่นในคำตอบโดย @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);
}
runas
ในฐานะผู้ดูแลระบบจากผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบมิฉะนั้นจะเปิดได้อย่างเงียบ ๆ พร้อมสิทธิ์ผู้ใช้ปัจจุบัน (ทำเครื่องหมายบน Windows 7 64 บิต) เท่าที่ฉันสามารถบอกได้สิ่งเดียวที่คุณสามารถทำได้เมื่อ UAC ถูกปิดการใช้งานและผู้ดูแลระบบที่ถูกต้องหายไปคือหยุดการทำงานในช่วงเวลาที่เหมาะสม
คุณสามารถสร้างรายการโดยใช้การตั้งค่าความปลอดภัย 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" />
สิ่งนี้จะทำให้โปรแกรมต้องการสิทธิ์ผู้ดูแลระบบ
นี่เป็นเวอร์ชั่นที่ง่ายของคำตอบนี้โดย @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
คลิกขวาที่ไฟล์เรียกทำงานของคุณไปที่คุณสมบัติ> ความเข้ากันได้และทำเครื่องหมายในช่อง 'เรียกใช้โปรแกรมนี้ในฐานะผู้ดูแลระบบ'
หากคุณต้องการเรียกใช้ในฐานะผู้ดูแลระบบสำหรับผู้ใช้ทุกคนให้ทำสิ่งเดียวกันใน 'เปลี่ยนการตั้งค่าสำหรับผู้ใช้ทั้งหมด'