У меня есть приложение C#, которое сканирует каталог и собирает некоторую информацию. Я хотел бы отобразить имя учетной записи для каждого файла. Я могу сделать это на локальной системе, получая SID для объекта FileInfo, а затем делать:Как я могу конвертировать из SID в имя учетной записи в C#
string GetNameFromSID(SecurityIdentifier sid)
{
NTAccount ntAccount = (NTAccount)sid.Translate(typeof(NTAccount));
return ntAccount.ToString();
}
Однако, это не работает для файлов в сети, по-видимому, потому что функция Перевести() работает только с локальные учетные записи пользователей. Я подумал, что я мог бы сделать поиск LDAP на SID, поэтому я попытался следующее:
string GetNameFromSID(SecurityIdentifier sid)
{
string str = "LDAP://<SID=" + sid.Value + ">";
DirectoryEntry dirEntry = new DirectoryEntry(str);
return dirEntry.Name;
}
Это кажется, что он будет работать, в том, что доступ к «dirEntry.Name» зависает на несколько секунд, как если он отключается и запрашивает сеть, но затем он генерирует System.Runtime.InteropServices.COMException
Кто-нибудь знает, как я могу получить имя учетной записи для произвольного файла или SID? Я мало знаю о сети или LDAP или что-то еще. Есть класс под названием DirectorySearcher, который, возможно, я должен использовать, но он хочет имя домена, и я не знаю, как это получить - все, что у меня есть, - путь к каталогу, который я просматриваю.
Заранее спасибо.
Есть ли специальное сообщение, которое показывает COMException? –
Это может быть групповая политика, позволяющая выполнять локальную службу каталогов, поэтому вы получаете исключение COM. Что показывает сообщение об ошибке? Попробуйте запустить filemon на сетевой машине, почему вы обращаетесь к ней и видите результаты. –
Я имел в виду «групповая политика, не позволяющая ...» –