1

基本上,在我们的环境中,我们有大量的安全组。嵌套其他团体等内的所以这是一个真正的PITA找出为什么设置应用到用户安全组,因为嵌套的群体之一,他们可能会或可能不会是通过嵌套AD组查找用户和AD组关系

对于例如一部分如果您将用户添加到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 

这工作正常,但似乎每一个输出安全组,反对连接的。当然,朝着正确的方向迈出一步!如果我找到源,我也会发布信用。

+0

我编辑了我的上面的帖子,基本上需要一些触摸的解决方案! – user3317623

回答

1

下面的版本不会少冗长(可能会写更多简洁,但我希望脚本至少是半可读的),但它会搜索组并返回Active Directory组沿着发现该组的分支上的每个组的对象。

function Get-GroupConnection 
{ 
    [CmdletBinding()] 
    PARAM (
     $Username, 
     $GroupName 
    ) 

    $User = Get-AdUser -Identity $Username -Properties MemberOf 
    if (-Not ($User)) 
    { 
     return; 
    } 

    $SearchedGroups = @() 

    function Find-GroupBranches 
    { 
     [CmdletBinding()] 
     PARAM (
      $GroupNameList, 
      $SearchForGroupName 
     ) 

     $ADGroups = $GroupNameList | Foreach { Get-ADGroup -Identity $_ -Properties MemberOf } 

     foreach($group in $ADGroups) 
     { 
      Write-Verbose "Testing if either '$($Group.SamAccountName)' or '$($Group.DistinguishedName)' are equal to '$SearchForGroupName'" 
      if ($Group.SamAccountName -eq $SearchForGroupName -OR $Group.DistinguishedName -eq $SearchForGroupName) 
      { 
       Write-Verbose "Found $($Group.DistinguishedName)" 
       Write-Output $Group 
       return 
      } 
     } 

     Write-Verbose "No match in current collection, checking children" 
     foreach ($currentGroup in $ADGroups) 
     { 
      if ($SearchedGroups -Contains $currentGroup.DistinguishedName) 
      { 
       Write-Verbose "Already checked children of '$($currentGroup.DistinguishedName)', ignoring it to avoid endless loops" 
       continue 
      } 
      $SearchedGroups += $currentGroup.DistinguishedName 

      if ($currentGroup.MemberOf) 
      { 
       Write-Verbose "Checking groups which $($currentGroup.DistinguishedName) is member of" 

       $foundGroupInTree = Find-GroupBranches -GroupNameList $currentGroup.MemberOf -SearchForGroupName $SearchForGroupName 
       if ($foundGroupInTree) 
       { 
        Write-Output $currentGroup 
        Write-Output $foundGroupInTree 
        break 
       } 
      } 
      else 
      { 
       Write-Verbose "$($currentGroup.DistinguishedName) is not member of any group, branch ignored" 
      } 
     } 
    } 

    Write-Verbose "Searching immediate group membership" 
    Find-GroupBranches -GroupNameList $User.MemberOf -SearchForGroupName $GroupName 
} 

Get-GroupConnection -Username MyUser -GroupName SubSubGroup -Verbose 

关于它如何搜索的描述如下。

考虑下面的Active Directory结构:

MyUser 
    Domain Admins 
     AnotherSubGroup 
    Other Group 
    DirectMemberGroup 
     Domain Admins (same group as MyUser is direct member of, above) 
      AnotherSubGroup (which is of course the same as above too) 
     SubGroup 
      SubSubGroup 
    Some Other Group 

如果我们搜索MYUSER和“SubSubGroup”脚本会先搜索MYUSER用户的直接成员之间的连接,即“域管理员”,“其他集团“,”DirectMemberGroup“和”其他集团“。这些都不符合我们搜索的'SubSubGroup',因此它开始检查'child'groups。

'Domain Admins'是'AnotherSubGroup'的成员,但与'SubSubGroup'不匹配。 'AnotherSubGroup'不是任何组的成员,因此该分支被忽略。

“其他组”不是任何组的成员,因此该分支被忽略。

'DirectMemberGroup'是其他组的成员,因此它遍历这些组。它已经为儿童检查了“域管理员”,因此该组被跳过以避免陷入循环搜索。因此它检查'SubGroup'。

'SubGroup'与'SubSubGroup'不匹配,因此它检查'SubGroup'所属的组。 'SubGroup'是'SubSubGroup'的成员,所以它检查该组。

'SubSubGroup'确实匹配'SubSubGroup',因此将被选为匹配。

在上面的例子中,输出组对象将是其导致“SubSubGroup”组分支,按以下顺序:

DirectMemberGroup 
SubGroup 
SubSubGroup 

观察,该方法将返回它的之间找到的第一个连接用户和组。例如,如果'Some Other Group'组也是'SubSubGroup'的成员,则不会更改上面提到的输出和搜索过程。

+0

谢谢你的伟大的职位:)。 – user3317623