كيف يمكنني معرفة ما إذا كان بلدي عملية تشغيل كمسؤول?
-
21-08-2019 - |
سؤال
أود أن عرض المزيد من عناصر واجهة المستخدم عند عملية يتم تشغيل كمسؤول بدلا من عندما لا يكون مماثلة إلى كيف Visual Studio 2008 يعرض 'المسؤول' في شريط العنوان عند تشغيل كمسؤول.كيف يمكنني أن أعرف ؟
المحلول
من الناحية الفنية, إذا كنت تريد أن ترى إذا كان العضو هو المسؤول المحلي الحساب, ثم يمكنك الحصول على معرف الأمان (SID) المستخدم الحالي من خلال User
الملكية على WindowsIdentity
الدرجة, مثل (ثابت GetCurrent
طريقة يحصل مستخدم ويندوز الحالي):
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
string sid = windowsIdentity.User.ToString();
على User
الخاصية بإرجاع SID المستخدم الذي لديها عدد من القيم المعرفة مسبقا لمختلف مجموعات المستخدمين.
ثم يمكنك أن تحقق لمعرفة ما إذا كان SID النمط التالي ، مشيرا إلى أنه هو حساب المسؤول المحلي (وهو معروف SID):
S-1-5-{الأخرى سيد أجزاء}-500
أو إذا كنت لا ترغب في تحليل السلاسل ، يمكنك استخدام SecurityIdentifier
الدرجة:
// Get the built-in administrator account.
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid,
null);
// Compare to the current user.
bool isBuiltInAdmin = (windowsIdentity.User == sid);
ومع ذلك أنا أعتقد أن ما كنت حقا تريد أن تعرف إذا كان المستخدم الحالي هو عضو من المسؤولين المجموعة على الجهاز المحلي.يمكنك الحصول على هذا SID باستخدام WellKnownSidType
من BuiltinAdministratorsSid
:
// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
WellKnownSidType.BuiltinAdministratorsSid, null);
ثم يمكنك التحقق من Groups
الملكية على WindowsIdentity
المستخدم لمعرفة ما إذا كان المستخدم عضوا المحلية مشرف الفريق مثل ذلك:
bool isLocalAdmin = windowsIdentity.Groups.
Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
Any(s => s == localAdminGroupSid);
نصائح أخرى
وأنا أعتقد أن هذا هو آلية بسيطة جيدة.
using System.Security.Principal;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
وفيما يلي الخطوط الملاحية المنتظمة واحدة للقيام بذلك.
using System.Security.Principal;
static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
وشعرت أنه من المهم أن نلاحظ صعوبة كان لي مع محاولة استخدام WellKnownSidType.BuiltinAdministratorsSid في الإجابة casperOne في أعلاه. وفقا ل WellKnownSiDType MSDN ، BuiltinAdministratorsSid "يشير إلى SID يطابق حساب المسؤول." لذلك أتوقع كود casperOne على العمل، واعتقد انه من المرجح الحال في بعض البيئات. للأسف، لم يفعل ذلك على بلدي ويندوز 2003 مع NET 2.0 (رمز القديمة). عادت فعلا S-1-5-32-544 التي، وفقا ل هذه المقالة هو سيد للمشرفين <م> المجموعة م>. وهكذا، فشل مقارنة بالنسبة لي. وسوف تضطر إلى القيام مقارنة سلسلة بلدي لstartswith "S-1-5-21" (أي كيلوبايت 243330 يشير يتم تضمين "21" على الرغم من أن بلوق المشار إليها أعلاه لا) وendswith "500".