Преобразование имени пользователя в SID в C #

Я пытаюсь использовать этот код для преобразования имени пользователя Windows (в классической форме .\username) в объект SID:

NTAccount account = new NTAccount(".\\MyUser");
SecurityIdentifier sid = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier));

Однако при выполнении последней инструкции я продолжаю получать следующее исключение:

System.Security.Principal.IdentityNotMappedException: «Некоторые или все ссылки на идентификационные данные не могут быть переведены».

Что я делаю неправильно?


person Master_T    schedule 23.10.2018    source источник
comment
Вероятно, ваш аккаунт с параметрами неверен. NTAccount конструктор на самом деле не проверяет, действителен ли он: источник ссылок .microsoft.com / # mscorlib / system / security /.   -  person sibel1us    schedule 23.10.2018
comment
Как насчет того, чтобы прочитать дубликат и отредактировать свой вопрос, чтобы объяснить, почему он не применяется? Дело в том, что Translate() от имени пользователя к SID или наоборот работает для учетных записей Active Directory, а не для локальных учетных записей. Неважно, в каком направлении вы хотите переводить.   -  person CodeCaster    schedule 23.10.2018
comment
@CodeCaster: на самом деле он работает, просто не поддерживает. сокращение, обозначающее локальный (машинный) домен. Замена точки на имя машины решила проблему. См. Правку в моем ответе (не могу ответить правильно, так как вы закрыли вопрос: |)   -  person Master_T    schedule 23.10.2018
comment
@ sibel1us: спасибо за подсказку, имя правильное, но явно используется расширение. поскольку сокращение для локального домена не поддерживается, вам необходимо использовать полное имя компьютера, см. мое изменение в вопросе. Спасибо, что указали мне правильное направление.   -  person Master_T    schedule 23.10.2018


Ответы (1)


Отвечая на свой вопрос после некоторых проб и ошибок:

Код правильный, но функция Translate, похоже, не поддерживает сокращение ., чтобы указать, что учетная запись является локальной, а не в домене. Поэтому, если у вас есть имя пользователя, которое начинается с .\, вам нужно заменить точку на имя компьютера. Следующий код работает правильно:

public static SecurityIdentifier usernameToSid(string user)
{
    if (user.StartsWith(@".\"))
    {
        user = user.Replace(@".\", Environment.MachineName + @"\");
    }

    NTAccount account = new NTAccount(user);
    return (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier));
}
person Master_T    schedule 23.10.2018