Выполните следующие шаги:
Надеюсь, это поможет
Объект SecurityReference Переводит метод, действительно работает над нелокальным SIDs, но только для учетных записей домена. Для учетных записей, локальных для другой машины или в недоменной установке, Вам был бы нужен к PInvoke функциональный LookupAccountSid, указывающий определенное название машины, на котором должен быть выполнен взгляд.
Получить текущий домен:
System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain();
Получить запись каталога от ldap и имя домена:
DirectoryEntry de = new DirectoryEntry(string.Format("LDAP://{0}", domain));
Получить sid от ActiveDirectoryMembershipProvider ActiveDirectoryMembershipUser:
ActiveDirectoryMembershipUser user = (ActiveDirectoryMembershipUser)Membership.GetUser();
var sid = (SecurityIdentifier)user.ProviderUserKey;
Получить имя пользователя из SecurityIdentifier:
(NTAccount)sid.Translate(typeof(NTAccount));
Выполните поиск в каталоге ActiveDirectory с записью в каталоге домена и именем пользователя:
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = string.Format("(SAMAccountName={0})", username);
search.PropertiesToLoad.Add("Name");
search.PropertiesToLoad.Add("displayName");
search.PropertiesToLoad.Add("company");
search.PropertiesToLoad.Add("homePhone");
search.PropertiesToLoad.Add("mail");
search.PropertiesToLoad.Add("givenName");
search.PropertiesToLoad.Add("lastLogon");
search.PropertiesToLoad.Add("userPrincipalName");
search.PropertiesToLoad.Add("st");
search.PropertiesToLoad.Add("sn");
search.PropertiesToLoad.Add("telephoneNumber");
search.PropertiesToLoad.Add("postalCode");
SearchResult result = search.FindOne();
if (result != null)
{
foreach (string key in result.Properties.PropertyNames)
{
// Each property contains a collection of its own
// that may contain multiple values
foreach (Object propValue in result.Properties[key])
{
outputString += key + " = " + propValue + ".<br/>";
}
}
}
В зависимости от данных в вашем активном каталоге вы получите различные ответы на выходе.
Вот сайт, на котором есть все необходимые мне пользовательские свойства:
Посмотрите здесь для хорошего ответа:
лучший способ разрешить имя пользователя дисплея SID?
суть его является этим битом:
string sid="S-1-5-21-789336058-507921405-854245398-9938";
string account = new System.Security.Principal.SecurityIdentifier(sid).Translate(typeof(System.Security.Principal.NTAccount)).ToString();
Этот подход работает на меня для нелокального SID по активному каталогу.
Ох, затем возможно, что вызов LDAP не работает, потому что Вы не могли бы быть в среде Active Directory. Если это верно, затем каждая из Ваших машин ответственна за свое собственное хранилище идентификационных данных. И Ваш первый пример кода не работает по сети, потому что машина, на которой Вы выполняете свой код, не знает, как разрешить SID, который только имеет смысл на удаленной машине.
действительно необходимо проверить, являются ли машины частью Active Directory. Вы знали бы это во время процесса входа в систему. Или можно проверить щелчок правой кнопкой по "My Computer", выбрать "Свойства", вкладку "Computer Name", затем видеть, является ли компьютер частью домена.
Большой. Я запер некоторый LookupAccountSid () код отсюда:
http://www.pinvoke.net/default.aspx/advapi32.LookupAccountSid
И это работало, хотя я должен был обеспечить имя хоста сам. В случае пути UNC я могу просто взять первый компонент его. Когда это - сетевой диск, я использую этот код для преобразования пути к UNC один:
http://www.wiredprairie.us/blog/index.php/archives/22
Это, кажется, работает, таким образом, это - то, как я сделаю это, если кто-то не придумает ситуацию, в которой первый компонент пути UNC не является именем хоста...
Спасибо всем за Вашу справку.
Я совершенно уверен, что Вы сможете использовать принятый ответ отсюда: Определяют имя учетной записи LocalSystem с помощью C#
В основном, можно перевести экземпляр класса SecurityIdentifier для ввода NTAccount, от которого можно получить имя пользователя. В коде:
using System.Security.Principal;
SecurityIdentifier sid = new SecurityIdentifier("S-1-5-18");
NTAccount acct = (NTAccount)sid.Translate(typeof(NTAccount));
Console.WriteLine(acct.Value);
Этот - stumper. Вы находитесь в праве среды Active Directory? Просто проверка:)
Во всяком случае, вместо того, чтобы связать с sid. Значение,
string str = "LDAP://<SID=" + sid.Value + ">";
я попытался бы преобразовать массив байтов SID в Строка Октета и связал бы с этим вместо этого.
существует сладкий пример здесь на странице 78. Это получит Вас ближе. Честно говоря, я не попытался связать с SID прежде. Но у меня была привязка успеха с GUID пользователя, хотя :)
Удача и сообщила мне, как это идет.