[英]From SID get user@domain not domain\user
這有點模糊不清:我需要獲取用戶/組的用戶@域形式,但我不想要域\\用戶表單。 我遇到一個問題,一個長的Windows 2003+名稱,其中兩個是不同的,因為域\\用戶長度限制,因為新的表單沒有限制。
我在C#下,雖然我可以做以下事情:
string GetUserName(SecurityIdentifier SID)
{
NTAccount account = SID.Translate(typeof(NTAccount));
string [] splits = string.Split("\\", account.Value);
return splits[1] + @"@" + splits[0];
}
這並不總是正確的,正如我在我的介紹中所說,用戶名@ domain與用戶名的舊Windows NT形式不一樣。 如果您不相信我,請進入2k3 +盒子上的AD用戶和計算機,看看舊NT用戶名與新用戶名的區別。
那么我如何保證從SID獲得正確的用戶名@ domain? 除此之外,我還需要這種類型的東西為本地用戶/組工作。
用於獲取此功能的Windows API稱為DsCrackNames
- http://msdn.microsoft.com/en-us/library/ms675970 。 它將根據您提供的標志以任意數量的格式提供輸出。
你不能使用System.DirectoryServices.AccountManagement.Principal和UPN(你的name@domain.com)來查找Sid(也是主體上的屬性)?
http://msdn.microsoft.com/en-us/library/bb340707.aspx
這是一個TechNet代碼段,它使用DirectorySearcher通過UPN搜索用戶
http://gallery.technet.microsoft.com/ScriptCenter/de2cb677-f930-40a5-867d-ea0326ccbcdb/
獲取主體后,您應該能夠獲得Sid屬性。
我發布了一些用於從SID中檢索用戶數據的 C#代碼,這與您的問題相同:
/* Retreiving object from SID
*/
string SidLDAPURLForm = "LDAP://WM2008R2ENT:389/<SID={0}>";
System.Security.Principal.SecurityIdentifier sidToFind = new System.Security.Principal.SecurityIdentifier("S-1-5-21-3115856885-816991240-3296679909-1106");
DirectoryEntry userEntry = new DirectoryEntry(string.Format(SidLDAPURLForm, sidToFind.Value));
string name = userEntry.Properties["userPrincipalName"].Value.ToString();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.