System.Security.Principal.NTAccount.Translate()如何将指定用户解析为SID

时间:2013-08-20 02:49:49

标签: .net

我想知道,如果有一个具有指定帐户名的本地用户帐户,是否会在具有相同名称的任何域帐户之前或之后解析?

3 个答案:

答案 0 :(得分:6)

在调用Translate方法时完成SID解析,

http://msdn.microsoft.com/en-us/library/system.security.principal.ntaccount.translate.aspx

如果使用NTAccount(string)初始化实例,并提供隔离的名称(不带域的名称),则解析由SID查找代码(如果您知道如何反编译)确定,该代码调用LsaLookupName2,

http://msdn.microsoft.com/en-us/library/windows/desktop/ms721798(v=vs.85).aspx

  

翻译隔离的名称

     

1.如果名称是众所周知的名称,例如Local或Interactive,则该函数返回相应的已知安全标识符   (SID)。

     

2.如果名称是内置域的名称,则该函数返回该域的SID。

     

3.如果名称是帐户域的名称,则该函数返回该域的SID。

     

4.如果名称是主域名,则该函数返回该域的SID。

     

5.如果名称是受信任域的名称之一,则该函数返回该域的SID。

     

6.如果该名称是内置域中的用户,组或本地组帐户,则该函数将返回该帐户的SID。

     

7.如果该名称是本地系统上帐户域中的用户,组或本地组帐户,则该函数将返回该帐户的SID   帐户。

     

8.如果名称是主域中的用户,组或本地组,则该函数返回该帐户的SID。

     

9.查看主域后,该功能会查找每个主域的可信域。

     

10.否则,名称不会翻译。

答案 1 :(得分:2)

您的帐户名称应完全符合BUILTIN \ xxx或COMPUTERNAME \ xxx或DOMAINNAME \ xxx(您也可以使用UPN格式xxx@F.Q.D.N)。

这将决定当您尝试获取SID(本地计算机用户/组或通过LSA的域)时窗口的外观。

请注意,translate方法确实有很多失败的方法。如果丢失网络或域控制器,请准备好做一些奇怪的事情。

答案 2 :(得分:1)

public NTAccount(string domainName, string accountName)
{
  if (accountName == null)
    throw new ArgumentNullException("accountName");
  if (accountName.Length == 0)
    throw new ArgumentException(Environment.GetResourceString("Argument_StringZeroLength"), "accountName");
  if (accountName.Length > 256)
    throw new ArgumentException(Environment.GetResourceString("IdentityReference_AccountNameTooLong"), "accountName");
  if (domainName != null && domainName.Length > (int) byte.MaxValue)
    throw new ArgumentException(Environment.GetResourceString("IdentityReference_DomainNameTooLong"), "domainName");
  if (domainName == null || domainName.Length == 0)
    this._Name = accountName;
  else
    this._Name = domainName + "\\" + accountName;
}

除了验证尺寸等之外,显然没有任何检查。在构造函数中没有完成解析。