بمجرد تثبيت البرنامج على جهاز عميل ، كيف أجبر البرنامج على العمل كمسؤول على نظام التشغيل Windows 7؟
ستحتاج إلى تعديل البيان الذي يتم تضمينه في البرنامج. هذا يعمل على Visual Studio 2008 والإصدارات الأحدث: Project + إضافة عنصر جديد ، حدد "ملف بيان التطبيق". تغيير عنصر <requestedExecutionLevel>
إلى:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
يحصل المستخدم على UAC موجه عند بدء تشغيل البرنامج. استخدم بحكمة؛ صبرهم يمكن أن تبلى بسرعة.
إضافة عنصر requestedExecutionLevel
إلى البيان الخاص بك هو نصف المعركة فقط ؛ عليك أن تتذكر أنه يمكن إيقاف تشغيل UAC . إذا كان الأمر كذلك ، يجب عليك إجراء التحقق من طريقة المدرسة القديمة ووضع مربع حوار خطأ إذا لم يكن المستخدم مسؤولاً
(استدعاء IsInRole(WindowsBuiltInRole.Administrator)
في سلسلة الرسائل CurrentPrincipal
).
قمت بتنفيذ بعض التعليمات البرمجية للقيام بذلك يدويًا:
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;
}
الخطوات التفصيلية هي على النحو التالي.
لاحظ أنه باستخدام هذا الرمز ، تحتاج إلى إيقاف تشغيل إعدادات الأمان في ClickOnce ، للقيام بذلك ، انتقل إلى خصائص -> الأمان -> ClickOnce Security
يمكنك تضمين ملف بيان في ملف EXE ، مما يؤدي إلى تشغيل Windows (7 أو أعلى) للبرنامج دائمًا كمسؤول.
يمكنك العثور على مزيد من التفاصيل فيالخطوة 6: إنشاء وضمّن بيان تطبيق (UAC)(MSDN).
أثناء العمل على Visual Studio 2008 ، انقر بزر الماوس الأيمن على Project -> Add New Item
ثم اختر Application Manifest File
.
في ملف البيان ، ستجد العلامة requestedExecutionLevel
، ويمكنك ضبط المستوى على ثلاث قيم:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
OR
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
OR
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
لتعيين التطبيق الخاص بك لتشغيله كمسؤول ، يجب عليك اختيار التطبيق الأوسط.
حسب
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
ستحتاج إلى إضافة بيان تطبيق ما إذا لم يكن لديك بالفعل بيان أو لا تعرف كيفية إضافة ملف. نظرًا لأن بعض المشروعات لا تضيف تلقائيًا ملف بيان منفصل ، انتقل أولاً إلى خصائص المشروع ، وانتقل إلى التطبيق علامة التبويب وتحقق للتأكد من أن مشروعك لا يستبعد البيان في أسفل الصنبور.
في Visual Studio 2010 ، انقر بزر الماوس الأيمن على اسم مشروعك. اضغط على "عرض إعدادات ويندوز" ، وهذا يولد ويفتح ملف يسمى "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);
}
يمكنك إنشاء البيان باستخدام ClickOnce Security Settings ، ثم تعطيله:
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" />
هذا سيجعل البرنامج يتطلب امتيازات المسؤول.
هذه نسخة مبسطة من هذا answer ، أعلاه بواسطةNG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}