По сути, в нашей среде у нас есть масса групп безопасности. Группы безопасности, которые вложены в другие группы и т. д. Таким образом, это настоящая PITA, чтобы выяснить, почему параметр применяется к пользователю, из-за одной из вложенных групп, в которую они могут быть или не быть частью
Например, Если вы добавите пользователя в группу X, у него внезапно появится опубликованное приложение в Citrix. Citrix настроен для группы безопасности Y. Попытка найти связь между X и Y занимает очень много времени, но ее можно автоматизировать.
Я хочу создать сценарий, в котором вы вводите пользователя и конечную группу безопасности (группа Y сверху), а сценарий выводит промежуточные группы, которые соединяют пользователя с конечной группой. Если это имеет смысл?
Что-то вроде этого:
function get-grouprelationship($username, $knownsecuritygroup)
{
$getallgroups = get-adgroupmember $knownsecuritygroup | where-object {$_.ObjectClass -eq "Group" | select-object SamAccountName | foreach-object {get-adgroupmember $_.SamAccountName}
}
(Переменная выше берет вашу группу и перебирает всех членов этой группы, печатая их членов)
$usergroups = (get-aduser -identity $username -Properties memberof | select-object memberof).memberof
(Вышеприведенное получает все группы, в которых находится пользователь)
$usergroups1 = $usergroups.split(",")
$usergroups2 = $usergroups1[0]
$usergroups3 = $usergroups2.substring(3)
(приведенное выше форматирует текст красиво)
if ($usergroups3 -contains $groupname){write-host "$username is directly in $groupname}
Отсюда я совершенно застрял, так как мне в основном нужно вложить несколько циклов for, в зависимости от того, сколько групп в каждой группе. Затем выполните проверку условия, что
if ($groupname -eq $currentgroup){write-host "connected by $groupname and $currentgroup}
Я также застрял с переменной $getallgroups
, потому что она проверяет только 1 уровень вниз. Затем внутри него потребуется еще один цикл foreach
, для которого потребуется еще один внутри него и т. д.
Не имея опыта программирования, я действительно изо всех сил пытаюсь найти простой способ достичь своей цели.
РЕДАКТИРОВАТЬ:
Я нашел этот скрипт здесь - script. Ниже в основном работает, за исключением того, что это слишком многословно:
import-module activedirectory
$username = read-host "What's their username?"
Function RecurseUsersInGroup {
Param ([string]$object = "", [int]$level = 0)
$indent = "-" * $level
$x = Get-ADObject -Identity $object -Properties SamAccountName
if ($x.ObjectClass -eq "group") {
Write-Host "# $($x.SamAccountName)"
$y = Get-ADGroup -Identity $object -Properties Members
$y.Members | %{
$o = Get-ADObject -Identity $_ -Properties SamAccountName
if ($o.ObjectClass -eq "user" -and $o.SamAccountName -eq $username) {
Write-Host "-> $($o.SamAccountName)"
} elseif ($o.ObjectClass -eq "group") {
RecurseUsersInGroup $o.DistinguishedName ($level + 1)
}
}
} else {
Write-Host "$($object) is not a group, it is a $($x.ObjectClass)"
}
}
$thegroup = read-host "What's the Group?"
RecurseUsersInGroup (get-adgroup $thegroup).DistinguishedName
Это отлично работает, но, похоже, выводит каждую группу безопасности, в отличие от подключающихся. Хотя, конечно, шаг в правильном направлении! Если я найду источник, я также опубликую кредит.