Как получить имя локальной группы для гостей/администраторов?
Вопрос:
Я использую код, найденный в
http://support.microsoft.com/kb/306273
чтобы добавить пользователя Windows.
Проблема в том, что мне нужно добавить пользователя в группу, но имена групп локализованы.
например. в примере MS используется английский компьютер, что означает, что вы можете получить гостевую группу следующим образом:
grp = AD.Children.Find( "Гости", "группа" )
Но на неанглийском компьютере имя группы "Guest" локализовано, например, на моей немецкой ОС, имя группы для гостей - "Gäste".
Что означает, что для примера поддержки для запуска на моем компьютере мне нужно изменить эту строку на
grp = AD.Children.Find( "Gäste", "group" )
тогда он работает.
Теперь, если ОС - какой-либо другой язык, как я могу найти имя для гостевого пользователя?
Или как я могу получить гостевое имя пользователя из sid?
Примечание:.NET 2.0, а не 3.0 или 3.5
Ответы
Ответ 1
Как вы указали, имена групп локализуются в зависимости от системного языка.
Для "хорошо известных" групп, таких как "Администраторы" и "Гости", вы должны получить на основе SID. SID для гостей:
S-1-5-32-546
Здесь есть список известных SID:
http://support.microsoft.com/kb/243330
Код, чтобы получить имя группы из SID, можно найти здесь
Ответ 2
Вы можете использовать этот код, возвращаемое значение верно для неанглийских систем:
var guestsGroup = new SecurityIdentifier(WellKnownSidType.BuiltinGuestsSid, null).Translate(typeof(NTAccount)).Value;
Ответ 3
Поиск учетной записи по SID - лучший способ. Это немного надуманно, но способ, которым это работает, заключается в следующем:
-
Идентификатор учетной записи Администратор всегда начинается с S-1-5-21
и заканчивается на -500
. Все остальное промежуточное является случайным (SID домена).
-
Идентификатор учетной записи Гость всегда начинается с S-1-5-21
и заканчивается на -501
.
Статья Microsoft KB, описывающая это, доступна здесь.
Чтобы найти эти учетные записи, вам нужно будет перечислить все учетные записи на локальном компьютере и найти, с каких SID начинать и заканчивать эти номера. Как только они совпадут, у вас есть встроенные учетные записи. Не самый приятный способ сделать это, но он работает.
Существует также параметр групповой политики в разделе Параметры безопасности\Локальные политики\Параметры безопасности, называемые Учетные записи: переименование учетной записи администратора и Учетные записи: переименование гостевой учетной записи strong > . Я не смог найти, где в реестре эти параметры сохранены, но если вы сможете узнать, и вы посмотрите их, вы, скорее всего, сможете получить "официальные" имена этих двух учетных записей.
Ответ 4
Эта страница содержит код для получения сведений о пользователе и проверки их.
Этот код:
public IdentityReferenceCollection GetUserGroups()
{
System.Security.Principal.WindowsIdentity currentUser =
System.Security.Principal.WindowsIdentity.GetCurrent();
return currentUser.Groups;
}
возвращает текущие группы пользователей.
Подробнее о классе WindowsIdentity
в целом можно найти здесь, с свойством Groups
здесь.
Ответ 5
Вы должны использовать классы WindowsIdentity и WindowsPrincipal:
Dim currentIdentity as WindowsIdentity = WindowsIdentity.GetCurrent()
Dim currentPrincipal as WindowsPrincipal = New WindowsPrincipal(currentIdentity)
If currentPrincipal.IsInRole(WindowsBuiltInRole.Guest) Then
Foobar()
End If
Nevermind, я вижу, вы на самом деле пытались добавить пользователя в группу.