我对 powershell 比较陌生,在 cmd 行上有两个语句:
get-adgroupmember <group name> | select-object name,samaccountname
制作一个格式良好的表格,其中有两列,分别是人员的真实姓名和用户名。
get-adgroupmember <group name> | get-adprincipalgroupmembership | select-object name
生成命名组中每个用户所属的组列表。
我想把它们结合起来,这样我就有了一个用户的真实姓名+用户名,然后是每个用户所属的组,例如
name samaccountname memberof
---- -------------- --------
joe bloggs jbloggs group1
group2
groupq
bob laithwaite blaithwaite group2
groupm
groupp
groupq
或者可能
joe bloggs jbloggs
group1
group2
groupq
bob laithwaite blaithwaite
group2
groupm
groupp
groupq
有没有什么简单的方法可以实现这个?我并不太在意它是否美观。
如果没有简单的方法,有人能给我指点一下如何用困难的方式创造这种东西吗?如果只有困难的方法,那么虽然一个可行的答案会很好,但我还是希望有指示可以开始,看看我是否可以自己制作一些东西。毕竟我还在学习。
我最初的 Google 搜索发现https://gallery.technet.microsoft.com/scriptcenter/Powershell-Get-users-who-b0420fe1但无法通过用硬编码字符串替换变量来使其在命令行上工作。这是我最终想要实现的,但只有 2 个组,然而,在第一个实例中,我希望从类似上面的输出开始。
我还发现如何生成一组用户所属的安全组列表?在编写这个问题的过程中,但这似乎只产生了与我在第二行中创建的使用 get-adprincipalgroupmembership 的列表类似的列表。
答案1
没有一行代码或一个命令可以满足您的需求,但只需编写一些脚本即可。我在下面起草了一个脚本,可以实现这个功能,它非常简单,您应该能够理解它的作用并根据您的需要进行修改。
ipmo activedirectory
$searchBase = "OU=someOU,DC=yourdomain,DC=com"
$userlist = Get-ADUser -Filter * -SearchBase $searchBase -Properties memberOf
$report = @()
Foreach ($user in $userlist)
{
$name = $user.Name
$SAM = $user.SAMAccountName
$memberOf = $user.memberOf
$i = 0 #if you only want the user and SAMAccountName to appear once you will need a counter like this, it'se easier to just display it on every row
Foreach($Group in $memberOf)
{
$GroupName = $Group.Replace('CN=','')
$rowGroup = $GroupName -replace ",.*"
if($i -eq 0) #if you're happy to have username and SAMAccountName on each row you can skip this bit
{
$rowName = $name
$rowSAM = $SAM
}
else
{
$rowName = ""
$rowSAM = ""
}
$objRow = New-Object System.Object
$objRow | Add-Member -MemberType NoteProperty -Name Name -Value $rowName
$objRow | Add-Member -MemberType NoteProperty -Name SAMAccountName -Value $rowSAM
$objRow | Add-Member -MemberType NoteProperty -Name GroupName -Value $rowGroup
$report += $objRow
$i++
}
}
$report | ft
答案2
在您的帖子中,您没有指定用户列表的来源。看起来您获取了一个群组的用户,并查看他们还属于哪个群组。这与解决方案基本无关,因此我假设您有一个列表,然后$users
从那里开始。
您想要做的是将两个命令的属性组合成一个输出流。这可以通过利用计算属性就像这样……
$Users | %{Select DisplayName,SamAccountName,@{N="Groups";E={(Get-ADuser $_.SamAccountName -Properties memberof).memberof}}}
您还可以使用类似以下方法:
Get-ADGroupMember $GroupName | %{Get-ADUser $_.SamAccountName -Properties memberof | Select Name, SamAccountName, memberof}
答案3
您可以尝试这种方式,这将为您提供所有组的用户列表
$users = get-content \\filepath.txt
foreach($u in $users){
$report += Get-Aduser $u -properties memberof| Get-ADGroup |select-object @{N="GroupName";E={$_.samaccountname}},@{N="username";E={$u}}
}
$report | Export-csv \\filepath.csv