2009-02-03 76 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); 
相關問題