我想知道,如果有一个具有指定帐户名的本地用户帐户,它会在任何具有相同名称的域帐户之前或之后得到解决吗?
3 回答
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.否则,名称不翻译。
您的帐户名称应完全限定为 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.
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;
}
除了验证大小等之外,它显然没有任何检查。没有在构造函数中完成解析。