Получить роль AD пользователя без использования средств удаленного администрирования сервера - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь написать команду powershell, которая проверяет, является ли пользователь частью группы AD, однако я не хочу использовать модули RSAT, так как это может оказаться сценарием входа в систему (имы не хотим, чтобы пользователи устанавливали эти модули).Это привело меня к этому вопросу, Поиск AD с PowerShell без использования модуля AD (RSAT) , однако я не могу понять, как отфильтровать результаты, чтобы проверить, есть ли там значение.

Например, ниже приведен список пользователей в форме LDAP для группы IT, но как мне тогда проверить, есть ли конкретный пользователь (с его именем пользователя, а не с отображаемым именем)?

([System.DirectoryServices.DirectorySearcher]"(&(objectCategory=group)(name=IT))").FindOne().Properties["Member"]

FindOne() несмотря на то, что он говорит, возвращает несколько строк;на самом деле FindAll() и FindOne() оба возвращают одинаковые результаты.

Должен ли я использовать другую команду для поиска в AD?В частности, я хочу либо проверить, что группа AD содержит пользователя (текущий пользователь), либо, наоборот, проверить, что пользователь (текущий пользователь) является членом определенной группы AD.

1 Ответ

1 голос
/ 20 сентября 2019

Вы можете сделать это таким образом, если вам действительно нужно (и я могу помочь вам сделать это таким образом, если вам действительно нужно), но если вы собираетесь запускать этот сценарий с учетными данными интересующего вас пользователя,тогда вы можете получить все группы из логина пользователя.Он уже содержит рекурсивный список всех групп безопасности, в которых находится пользователь. (Он не будет включать группы, в которых «Тип группы» равен «Распространение»)

Маркер входа содержит список идентификаторов безопасности, поэтомусамый быстрый способ - сравнить с использованием SID интересующей вас группы, поскольку он вообще не должен делать никаких сетевых запросов.Это особенно удобно для пользователей ноутбуков, которые могут не подключаться к сети при входе в систему - ваш скрипт все равно будет работать.

$currentIdentity = [Security.Principal.WindowsIdentity]::GetCurrent()

if ($currentIdentity.Groups.Where({$_.Value -eq "S-1-1-0"}, "First")) { #Is in "Everyone"?
    "Yes"
} else {
    "No"
}

Чтобы найти SID группы, используйте следующую команду:

(Get-ADGroup "GroupName").SID.Value

Затем скопируйте / вставьте это значение в сценарий.

Если вы предпочитаете использовать имя группы в сценарии, вы можете преобразовать его в WindowsPrincipal и использовать IsInRole.Однако для этого потребуется выполнить сетевой запрос на поиск группы по ее имени.

$currentIdentity = [Security.Principal.WindowsIdentity]::GetCurrent()
$currentPrincipal = New-Object System.Security.Principal.WindowsPrincipal($currentIdentity)

if ($currentPrincipal.IsInRole("Everyone")) {
    "Yes"
} else {
    "No"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...