2009-02-03 131 views
31

我想在进程以管理员身份运行时显示一些额外的UI元素,而不是在Visual Studio 2008以admin身份运行时在其标题栏中显示“管理员”的方式。我怎么知道?如何判断我的进程是否以管理员身份运行?

+0

的回答是一样的: http://stackoverflow.com/questions/95912/how-can-i-detect-if-my-process-is-running-uac-elevated-or-而不是 – DSO 2009-02-03 22:53:02

+0

也看看这里http://www.blackwasp.co.uk/CheckAdmin.aspx – 2012-04-27 13:44:52

回答

33

从技术上讲,如果你想看看如果成员是本地管理员帐户,那么你可以通过User propertyWindowsIdentity class获取当前用户的security identifier (SID),像这样(静态GetCurrent method获取当前的Windows用户):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); 

string sid = windowsIdentity.User.ToString(); 

User属性返回用户哪个has a number of predefined values for various groups and users的SID。

那么你会检查是否the SID has the following pattern, indicating it is the local administrator account (which is a well-known SID)

S-1-5- {其他SID部分} -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); 

Howeve r,我怀疑你真的想知道的是,如果当前用户是本地机器的管理员的成员。您可以使用WellKnownSidTypeBuiltinAdministratorsSid的得到这个SID:

// Get the SID of the admin group on the local machine. 
var localAdminGroupSid = new SecurityIdentifier(
    WellKnownSidType.BuiltinAdministratorsSid, null); 

然后你就可以检查用户的WindowsIdentityGroups property,看看用户是本地管理员组的成员,像这样:

bool isLocalAdmin = windowsIdentity.Groups. 
    Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))). 
    Any(s => s == localAdminGroupSid); 
19

我认为这是一个很好的简单机制。

using System.Security.Principal; 

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator); 
0

我觉得重要的是要注意我有尝试使用上面WellKnownSidType.BuiltinAdministratorsSid每casperOne的答案的难度。根据WellKnownSiDType MSDN,BuiltinAdministratorsSid“表示与管理员帐户匹配的SID”。所以我希望casperOne的代码能够工作,并且猜测它可能会在某些环境中使用。不幸的是,它没有在我的Windows 2003上使用.NET 2.0(遗留代码)。它实际上返回了S-1-5-32-544,根据this article是管理员的sid。因此,我的比较失败了。我将不得不对自己的字符串进行比较,以便开始使用“S-1-5-21”(kb243330表示包含“21”,尽管上面引用的博客没有)并以“500”结尾。

2

这是一个单线程来做到这一点。

using System.Security.Principal; 

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); 
相关问题