2

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

4

3 回答 3

7

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

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

如果你NTAccount(string)用来初始化实例,并提供一个独立的名字(没有域的名字),那么解析是由调用 LsaLookupName2 的 SID 查找代码(如果你知道如何反编译的话)决定的,

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.否则,名称不翻译。

于 2013-08-20T03:17:16.723 回答
2

您的帐户名称应完全限定为 BUILTIN\xxx 或 COMPUTERNAME\xxx 或 DOMAINNAME\xxx(您也可以使用 xxx@FQDN 的 UPN 格式)。

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

Note that the translate method does have a number of ways that it can fail. Just be prepared for it to do strange things if you lose network or the domain controller.

于 2013-08-20T03:28:14.733 回答
0
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;
}

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

于 2013-08-20T03:00:02.267 回答