2011-10-11 109 views
4

我已被分配到修改WinForms應用程序以基本檢查登錄的用戶是否屬於特定的域。 這是我想出迄今:是否有更好(更簡單)的方法來獲取特定域名的SID?

byte[] domainSid; 

var directoryContext = 
    new DirectoryContext(DirectoryContextType.Domain, "domain.se"); 

using (var domain = Domain.GetDomain(directoryContext)) 
using (var directoryEntry = domain.GetDirectoryEntry()) 
    domainSid = (byte[])directoryEntry.Properties["objectSid"].Value; 

var sid = new SecurityIdentifier(domainSid, 0); 
bool validUser = UserPrincipal.Current.Sid.IsEqualDomainSid(sid); 

有沒有更好/更簡單的方法來做到這一點? 對我來說,似乎可以使用PrincipalContext或System.Security.Principal中的其他類以某種方式訪問​​domainSid。

我已經考慮過使用硬編碼的SID字符串,但我不知道如何「正確」,這將是。

+0

請注意,在Windows的本地化版本中,管理員的名稱可能不同。 例如,在俄語Windows中,沒有「管理員」用戶,而是「Администратор」,因此硬編碼管理員的名字不是一個好主意。 – user2513541

回答

4

你在做什麼看起來像是我最好的選擇。硬編碼字符串肯定不是一個好主意。

3

每個域都有一個內置賬戶domainName \ administrator,因此您可以使用該名稱創建一個賬戶,將其轉換爲SecurityIdentifier並讀取AccountDomainSid屬性。

的這樣的一個例子是:

public static class SecurityEx 
{ 
    public static SecurityIdentifier DomainSId 
    { 
     get 
     {    
      var administratorAcount = new NTAccount(GetDomainName(), "administrator"); 
      var administratorSId = (SecurityIdentifier) administratorAcount.Translate(typeof (SecurityIdentifier)); 
      return administratorSId.AccountDomainSid; 
     } 
    } 

    internal static string GetDomainName() 
    { 
     //could be other way to get the domain name through Environment.UserDomainName etc... 
     return IPGlobalProperties.GetIPGlobalProperties().DomainName; 
    } 
} 

您也可以找到其他的解決方案,以實現通過WMI或LSA相同的結果。這對我來說似乎是最優雅的方式。

+1

並非所有的域都有「管理員」帳戶。組策略可以將默認的「管理員」重命名爲其他內容。實際上,出於安全原因,建議將其重命名。 –

相關問題