我想知道,如果有一个具有指定帐户名的本地用户帐户,是否会在具有相同名称的任何域帐户之前或之后解析?
答案 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;
}
除了验证尺寸等之外,显然没有任何检查。在构造函数中没有完成解析。