Отвечая на мой вопрос после проб и ошибок:
Код правильный, но функция 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));
}