1

我正在学习 powershell,并希望查询几个 AD 组并确定用户是否是 AD 组的成员。

  • 第 1 部分:查询具有 10 个嵌套 AD 组的 AD 组
  • 第二部分:查询用户的AD组并拉出列表
  • 第 3 部分:未发布,但比较第 1 部分和第 2 部分的输出

在网上搜索,发现了一些山雀和比特。我知道 Active Directory 模块,但请避免使用它,因为此脚本将由非技术用户执行,并且避免为此安装 RSAT。

我有 Powershell 版本 2 和 Windows 7

第1部分

group1 是具有 10 个嵌套 AD 组的 AD 组。

Write-Host "Fetching information from groups.Please wait.."
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain
$group=[System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity  ($ct,'group1')
$group1 = $group.GetMembers | Where {$_.StructuralObjectClass -eq "group"} | Select    SamAccountName
$group1 = $group1 -replace("=", " ") -replace("{", " ") -replace("@", " ") -replace ("}", " ") -replace("SamAccountname", " ")  -replace '\s+', ' '
$ADGroups = foreach ($l in group1) {$l.trim()}

确保AD组信息被程序获取或退出脚本

if (($ADgroups | out-string) -like $null) {
  Write-Host "Unable to fetch AD groups information" -foreground "red"
  Start-sleep 10
  break 
}

第2部分

可以写入文件的临时位置

$location = "C:\AD"
$ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain
$user = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($ct, $username)
If ($user -like $null) {
  Write-host "User does not exist in AD" -foreground "magenta"
  start-sleep 10
  break
}
Write-Host "Please wait...Looking user group membership..."
$usergroups = $user.GetGroups()

删除文件(如果存在)。

Remove-Item $location\useradgroups.txt
$usergroups | select SamAccountName | Out-File $location\useradgroups.txt -append
$testr = gc $location\useradgroups.txt
if (($testr | out-string) -like $null) {
  Write-Host "Unable to fetch user AD groups   information" -foreground "red"
  Start-sleep 10
  Remove-Item $location\useradgroups.txt
  break
}
$useradgroups = foreach ($l in $testr ) {$l.trim()}
$useradgroups | Select-String -Pattern "\w" | out-file $location\useradgroups.txt
$useradgroups = gc $location\useradgroups.txt

问题:

除非我修剪输出,否则无法比较它。所以只好编写如上图所示的脚本:

  1. 避免将输出写入文本文件
  2. -replace("=", " ") -replace("{", " ")在第 1 部分中避免
  3. 简化代码。

Powershell 大师的任何建议都将受到欢迎。这将有助于我的学习过程

4

2 回答 2

0

未经测试,但你不能在第 1 部分使用类似的东西吗?

Import-Module ActiveDirectory

Get-ADGroupMember "group1" | select sAMAccountName
于 2013-07-25T19:49:52.317 回答
0

那么你想要做的是递归获取 ADGroupMembers?有点像这样还是这样?做事的方法总是不止一种。您可以使用[ASDI]类型加速器

$groups = [adsi]'LDAP://CN=GroupName,OU=Groups,OU=Place,DC=Tomorrow,DC=Today'
$group | Get-Member 
foreach($group in $groups){
    $members = $group.member
    foreach($member in $members){
        #Is this a group or a user?
        #If group Get the Group members
        #If a user say the user is part of the group
    }
}

您是否尝试格式化用户的 distinctName ?

$user = "CN=Huck Finn,OU=Users,OU=Today,OU=Tomorrow,DC=Yesterday,DC=com"
$splits = ($user -split ',')
[PSCustomObject]@{Username=$splits[0].substring(3);OUPath=($splits[1..($splits.Count-1)] | % {$_.substring(3)}) -join '\'}

希望我有所帮助。

于 2013-07-25T21:19:37.160 回答