Из SID получите user @ domain, а не domain \ user - PullRequest
2 голосов
/ 22 сентября 2011

Это немного неясно: мне нужно получить форму user @ domain для пользователя / группы, но мне НЕ нужна форма 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. Если вы мне не верите, зайдите в AD Users и компьютеры на коробке 2k3 + и посмотрите, чем отличаются поля для старого имени пользователя NT от нового.

Так как же мне гарантировать, что я получу правильное имя пользователя @ домен из SID? Добавьте к этому, мне также нужно, чтобы этот тип вещей работал для локальных пользователей / групп.

Ответы [ 3 ]

5 голосов
/ 22 сентября 2011

Windows API, чтобы получить это, называется DsCrackNames - http://msdn.microsoft.com/en-us/library/ms675970.. Он даст вам вывод в любом количестве форматов в зависимости от предоставленных вами флагов.

3 голосов
/ 22 сентября 2011

Разве вы не можете использовать 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.

0 голосов
/ 23 сентября 2011

У меня есть несколько кодов C # для получения пользовательских данных из SID , вот то же самое относится к вашему вопросу:

/* 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(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...