2011-03-01 69 views
0

使用.NET,我想以編程方式獲取Windows用戶所屬的所有組的列表以及表示登錄用戶的所有其他SID(安全標識符)。產生的清單應該包含:如何獲取與Windows用戶匹配的所有安全標識符(SID)?

  1. 用戶自己。
  2. 爲此他是一個直接構件
  3. 爲此他是一種間接的用戶
  4. WellKnownSidType s表示匹配的嵌套組的基團。例如:
    • 大家
    • NT AUTHORITY \ Authenticated用戶
    • ...

的第一項是微不足道的,我可以用System.DirectoryServices和已經檢索點2和3代表我的用戶this exampleDirectoryEntry上的屬性tokenGroups

有人能找到一個(簡單)的方式來做到這一點

回答

2

如果你想要一個簡單的方法,我會說UserPrincipal.GetAuthorizationGroups是很容易的。唯一的問題是你只能在.NET 3.5或更高版本中找到它。

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "yourdomain.com")) 
{ 
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "YourUser")) 
    { 
     foreach (Principal p in user.GetAuthorizationGroups()) 
     { 
      Console.WriteLine(p.Name); 
     } 
    } 
} 

GetAuthorizationGroups返回所有嵌套組,包括衆所周知的SID。它嘗試檢索嵌套組信息的不同方式。事實上,它使用的方法之一是使用DirectoryEntry來訪問tokenGroups屬性。

UPDATE

要檢查當前用戶是否在NT AUTHORITY\INTERACTIVELOCAL,我們可以使用WindowsIdentity.Groups,其中令牌直接檢索當前登錄。請注意,NT AUTHORITY\INTERACTIVELOCAL的成員資格是在運行時確定的。基於您現在登錄到該系統的事實將用戶分配到這些組。同樣,在我的Windows 7上,我可以看到我當前的登錄用戶也是NT AUTHORITY\REMOTE INTERACTIVE LOGON的成員,因爲我是通過遠程桌面登錄的。

WindowsIdentity id = WindowsIdentity.GetCurrent(); 
foreach (var group in id.Groups) 
{ 
    Console.WriteLine(((NTAccount)group.Translate(typeof(NTAccount))).Value); 
} 

我很抱歉,我不知道有什麼辦法讓NT AUTHORITY\INTERACTIVE會員資格任何任意用戶。我懷疑沒有這樣的方式,因爲這種類型的組成員資格只有在該用戶真正登錄時纔在運行時確定。

+0

感謝哈維,您的解決方案几乎囊括了一切。它仍然缺少一些SID(雖然LOCAL,CONSOLE LOGON,NT AUTHORITY \ INTERACTIVE ...)但我仍然不知道是否需要它們。任何想法如何獲得這些? – 2011-03-01 16:53:14

+0

@Marcel請檢查我的更新回答 – 2011-03-01 17:57:47

+0

感謝哈維,你的例子和解釋都不是完美的。 – 2011-03-01 18:44:30

相關問題