Powershell 查询代码

Powershell 查询代码

我在编写一些 PowerShell 代码时遇到了问题。

我正在尝试针对 Active Directory 运行查询,它将所有组、组成员、电子邮件地址和每个用户的 SID 导出到 CSV 文件。

它必须是递归的,以便能够在组内搜索组。

非常感谢你的帮助!我是新手。

我当前的代码仅显示特定组的名称:

Import-Module ActiveDirectory

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

$Group = Get-ADGroupMember -identity “Group distinguishedname” -Recursive
$Group | get-aduser -Properties mail |select name,samaccountname,mail |export-csv -path $scriptPath\Members.csv -NoTypeInformation

答案1

由于时间紧迫,我将这样回答:

您可以按照以下思路进行操作:首先将所有组都找出来放入类似于以下的变量中:

$Groups = Get-ADGroup ...

$Groups然后以类似的方式迭代该对象:

$Groups | Foreach-Object `
{
        $CurrentGroup = $_
    $Members = Get-ADGroupMember -Identity $CurrentGroup ...

    # Build CSV string here with output from both
    # both $CurrentGroup and $Members
    # and additional data you might want to pull

    # Write CSV string to file here or add it to an array
    # to print to file after the looping.
}

希望这能推动您朝着可行的方向前进,我会看看您取得的进展并在时间允许的情况下为您提供帮助。

答案2

这样做的问题是,您的结果不能保证是唯一的。您可能确实有属于多个组的用户。如果发生这种情况,您会发现报告中有重复的条目。

另一个问题是,您的结果中最终会出现其他对象,例如计算机和组。可以过滤掉这些对象。总的来说,尝试在同一行上显示当前组和用户信息会变得相当复杂。

AD 用户对象具有memberOf属性。如果您仅列出所有 AD 用户和您所需的相关属性(包括属性memberOf),您将获得更清晰的报告,并且生成速度会更快。

因此你的脚本看起来更像这样:

# Only required if using Powershell 2.0
Import-Module Active Directory

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

Get-ADUser -Filter * -Properties mail,memberOf |
    Select Name,SamAccountName,Mail,SID,memberOf |
    Export-CSV $script_path\members.tsv -NoTypeInformation -Delimiter "`t"

此解决方案的唯一问题是,memberOf 字段给出了组的 DN(每个组包含逗号,每个组也用逗号分隔),因此这是一个制表符分隔的文档。一旦您有了 TSV,您就可以根据需要对其进行排序和过滤。

这不是最好的解决方案,但否则会变得相当复杂。由于您是新手,最好尽可能保持简单。

答案3

通过使用 add-member cmdlet,我们可以保留 PsObject 并添加需要导出的组信息。将数据保存在 PsObject 中可轻松输出。

$adGroups = Get-ADGroup -Filter *

foreach ($grp in $adGroups){
    Write-Host "Processing $($grp.DistinguishedName)"

    #get the memebers of the group
    $grpMembers = Get-ADGroupMember $grp | where {$_.ObjectClass -eq "user"} | select -ExpandProperty SamAccountName

   foreach ($member in $grpMembers){
        #Get user information
        $user = get-aduser $member -Properties mail

        #Add group name and DN to the object
        Add-Member -InputObject $user -MemberType NoteProperty -Name Group -Value $grp.Name -Force
        Add-Member -InputObject $user -MemberType NoteProperty -Name GroupDn -Value $grp.DistinguishedName -Force

        #Output user to CSV
        $user | select name, samAccountName, SID, distinguishedName, Group, GroupDn | Export-Csv "c:\Windows\temp\groupMembership.csv" -NoTypeInformation -Append
    }
}

注意:这仅输出用户对象

相关内容