如何将这些结果导出到以逗号分隔的csv文件中

时间:2019-05-06 14:29:08

标签: powershell csv active-directory powershell-v2.0

我正在尝试确定是否有办法切换下面的内容并将其导出到以逗号分隔的csv文件中。

该脚本可以正常工作并返回我关心的数据,只是不是可用的格式。

该脚本将用户分配到特定的组,并在用户列表中循环,以获取每个用户的其他信息。我不熟悉powershell,因此可能由于缺乏知识而使此操作变得比必要的难。

Import-module activedirectory

Function Process-Members($MemberList)
{
    foreach ($member in $MemberList)
    {
        Get-ADUser -Identity $member.samaccountname -Properties * | select Name, SamAccountName, Enabled, @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}}
        dsquery user -samid $member.samaccountname | dsget user -memberof | dsget group -samid
    }
}

$members = Get-ADGroupMember "MyGroupName" -recursive | Select-Object name, SamAccountName

Process-Members $members

2 个答案:

答案 0 :(得分:3)

我删除了您的功能,因为此过程并非完全必要。您可以轻松地对其进行修改以再次使用您的功能。我还删除了dsquery和dsget命令,因为ActiveDirectory模块具有可以获取此信息的命令。

$members = Get-ADGroupMember "MyGroupName" -recursive | Select-Object name, SamAccountName

$Output = foreach ($member in $members) {

    Get-ADUser -Identity $member.SamAccountName -Properties * |
       select Name, SamAccountName, Enabled,
       @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}},
       @{n='MemberOf';e={($_.MemberOf |% {Get-ADGroup $_}).SamAccountName -join "; "}}
}

$Output | Export-Csv -Path output.csv -NoTypeInformation

通过从MemberOf输出返回SamAccountName属性并将结果与​​Get-ADGroup合并在一起来计算;所选属性。您可以更改该联接字符。默认情况下,不使用连接,将使用空格连接组,因此,如果组中包含空格,则可能会造成混淆。 %只是ForEach-Object的别名。 Export-Csv用于创建以逗号分隔的CSV输出文件(output.csv)。

对于所有版本的PowerShell(2.0及更高版本),您可以使用以下内容:

$members = Get-ADGroupMember "MyGroupName" -recursive | Select-Object name, SamAccountName

$Output = foreach ($member in $members) {

    Get-ADUser -Identity $member.SamAccountName -Properties * |
       select Name, SamAccountName, Enabled,
       @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}},
       @{n='MemberOf';e={($_.MemberOf |% {Get-ADGroup $_ | Select -Expand SamAccountName}) -join "; "}}
}

$Output | Export-Csv -Path output.csv -NoTypeInformation

答案 1 :(得分:0)

Powershell使超级简单。

您的$ members是PSCollection,因此您可以使用管道运算符从字面上将Process-Members传递到Export-Csv。

Process-Members $members | Export-Csv -Path {Your Desired CSV Location}

应该可以解决问题。

在此处查看手册页: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv?view=powershell-6

就改进该脚本而言;我认为,您应该乍一看应该做的最有意义的事情。 Powershell提供了各种工具来进行花哨的技巧。您可能可以使用漂亮的单层衬套来执行此操作,但是如果您看一下代码并开始流口水,因为无法确定一个衬套的作用,那就不好了。

就个人而言,除非我打算重复使用它们的功能,否则我不喜欢在powershell中声明函数。我只是将您的成员处理成一个变量,然后可以将该变量传递给export-csv,而不是创建一个函数。但这对性能没有影响,所以这只是个人喜好。