2011-10-11 139 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

并非所有的域都有“管理员”帐户。组策略可以将默认的“管理员”重命名为其他内容。实际上,出于安全原因,建议将其重命名。 –

相关问题