Как я могу получить название локальной группы для гостей / администраторов? - PullRequest
15 голосов
/ 09 июля 2010

Вопрос:

Я использую код, найденный на http://support.microsoft.com/kb/306273

чтобы добавить пользователя Windows. Проблема в том, что мне нужно добавить пользователя в группу, но имена групп локализованы.

например. MS-пример использует английский компьютер, что означает, что вы можете получить гостевую группу следующим образом: grp = AD.Children.Find ("Гости", "группа")

Но на неанглийском компьютере имя группы «Гость» локализовано, то есть, например, в моей немецкой языковой ОС имя группы «Гости» - «Gäste».

Что означает, что для поддержки пример должен работать на моем компьютере, мне нужно изменить эту строку на grp = AD.Children.Find ("Gäste", "group")

тогда это работает.

Теперь, если в ОС используется какой-либо другой язык, как я могу найти имя для гостевого пользователя? Или как я могу получить имя гостя из sid?

Примечание: .NET 2.0, а не 3.0 или 3.5

Ответы [ 5 ]

12 голосов
/ 09 июля 2010

Как вы указали, названия групп локализуются в зависимости от языка системы.

Для «хорошо известных» групп, таких как «Администраторы» и «Гости», вы должны получать данные на основе SID. SID для гостей:

S-1-5-32-546

Здесь есть список известных SID:

http://support.microsoft.com/kb/243330

Код для получения имени группы из SID можно найти здесь

9 голосов
/ 11 апреля 2013

Вы можете использовать этот код, возвращаемое значение является правильным для неанглийских систем:

var guestsGroup = new SecurityIdentifier(WellKnownSidType.BuiltinGuestsSid, null).Translate(typeof(NTAccount)).Value;
3 голосов
/ 09 июля 2010

Поиск учетной записи по SID - лучший способ.Это немного надумано, но способ работы таков:

  • SID Администратор учетной записи всегда начинается с S-1-5-21 и заканчивается на-500.Все остальное промежуточное является случайным (SID домена).

  • SID Guest учетной записи всегда начинается с S-1-5-21 и заканчивается на-501.

Статья Microsoft KB, описывающая это, доступна здесь .

Чтобы найти эти учетные записи, вам нужно перечислить всеучетных записей на локальном компьютере и найдите, какие идентификаторы безопасности начинаются и заканчиваются этими номерами.Как только они совпадают, у вас есть встроенные учетные записи.Не самый лучший способ сделать это, но он работает.

Существует также параметр групповой политики в разделе Параметры безопасности \ Локальные политики \ Параметры безопасности под названием Учетные записи: переименование учетной записи администратора и Учетные записи: переименование гостевой учетной записи .Я не смог найти, где в реестре хранятся эти настройки, но если вы сможете найти и посмотреть их, вы, скорее всего, сможете получить «официальные» имена этих двух учетных записей.

1 голос
/ 09 июля 2010

На этой странице есть код для получения и проверки пользовательских данных.

Этот код:

public IdentityReferenceCollection GetUserGroups()
{
    System.Security.Principal.WindowsIdentity currentUser =
                      System.Security.Principal.WindowsIdentity.GetCurrent();
    return currentUser.Groups;
}

возвращает группы текущего пользователя.

Более подробную информацию о классе WindowsIdentity в целом можно найти здесь , свойство Groups здесь .

0 голосов
/ 09 июля 2010

Вы должны иметь возможность использовать классы WindowsIdentity и WindowsPrincipal:

Dim currentIdentity as WindowsIdentity = WindowsIdentity.GetCurrent()
Dim currentPrincipal as WindowsPrincipal = New WindowsPrincipal(currentIdentity)

If currentPrincipal.IsInRole(WindowsBuiltInRole.Guest) Then
   Foobar()
End If

Неважно, я вижу, что вы на самом деле пытались добавить пользователя в группу.

...