Лучший способ разрешить отображаемое имя пользователя по SID?

Я прочитал список SID из реестра, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList.

Как можно разрешить отображаемое имя пользователя (например, DOMAIN\user, BUILT-IN\user) с учетом строки SID в C #?


person Dennis C    schedule 19.12.2008    source источник


Ответы (2)


Функция Win32 API LookupAccountSid() < / a> используется для поиска имени, соответствующего SID.

LookupAccountSid() имеет следующую подпись:

BOOL LookupAccountSid(LPCTSTR lpSystemName, PSID Sid,LPTSTR Name, LPDWORD cbName,
                       LPTSTR ReferencedDomainName, LPDWORD cbReferencedDomainName,
                       PSID_NAME_USE peUse);

MSDN Ссылка.

Вот справка по P / Invoke (с образцом кода): http://www.pinvoke.net/default.aspx/advapi32.LookupAccountSid

[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError = true)]
static extern bool LookupAccountSid (
  string lpSystemName,
  [MarshalAs(UnmanagedType.LPArray)] byte[] Sid,
  StringBuilder lpName,
  ref uint cchName,
  StringBuilder ReferencedDomainName,
  ref uint cchReferencedDomainName,
  out SID_NAME_USE peUse); 
person Mitch Wheat    schedule 19.12.2008
comment
Есть ли другой способ сделать это без использования p / invoke в C #? - person Dennis C; 19.12.2008
comment
@DennisC, вы можете сделать это без P / Invoke. См. Мой ответ: stackoverflow.com/questions/7593005/ - person Eriawan Kusumawardhono; 21.03.2017
comment
@EriawanKusumawardhono Думаю, вы не очень хорошо читаете вопросы. Потому что они прямо противоположны API - person Dennis C; 24.03.2017

Только что нашел его на pinvoke.net.

Альтернативный управляемый API: доступен в .Net 2.0:

using System.Security.Principal;

// convert the user sid to a domain\name
string account = new SecurityIdentifier(stringSid).Translate(typeof(NTAccount)).ToString();
person Dennis C    schedule 19.12.2008
comment
Это решение не во всех ситуациях надежно. Иногда встречаются идентификаторы безопасности, которые невозможно перевести, и это вызывает исключение. Я считаю, что LookupAccountSid () более надежен. - person Brian Lyttle; 03.12.2009