【问题标题】:How to export these results in a comma delimited csv file如何以逗号分隔的 csv 文件导出这些结果
【发布时间】:2019-09-24 05:00:35
【问题描述】:

我正在尝试确定是否有办法切换下面的内容并将其导出到逗号分隔的 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

【问题讨论】:

  • 你为什么使用dsquery/dsget?我认为这些结果可以通过 AD cmdlet 获得...如果可以,那么进行 CSV 导出的问题就会少得多... [grin]
  • 使用 dsquery/dsget 因为我不太清楚。我将研究 AD cmdlet,感谢您提供的信息。
  • AD* cmdlet 将返回一组基本属性。这样做是为了减少服务器上的负载。您可以使用-Properties * 获取整套产品,并查看所有可用的产品。尽量不要在生产中使用“把它们都给我”的东西,因为它会给你的 AD 服务器带来沉重的负担。 ///// 看看这个 >>> Active Directory:Get-ADUser 默认和扩展属性 - TechNet 文章 - 美国(英语) - TechNet Wiki — social.technet.microsoft.com/wiki/contents/articles/…

标签: powershell csv active-directory powershell-2.0


【解决方案1】:

我删除了您的功能,因为此过程并非完全必要。您可以轻松修改它以再次使用您的功能。我还删除了 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 选定属性是通过从Get-ADGroup 输出返回SamAccountName 属性并将结果与​​; 连接在一起来计算的。您可以更改该连接字符。默认情况下,离开连接,将加入带有空格的组,因此如果组包含空格,它可能会变得混乱。 % 只是 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

【讨论】:

  • 这并没有像我的脚本那样给我分组,但我可以完成这项工作,从你的组合方式中学到了很多,谢谢!
  • 我使用 Powershell 2.0 是否是我在此示例中看不到组的原因?我目前无法将此服务器升级到更新的版本。
  • 这绝对是一个原因。我可以尝试在 v2.0 上对此进行测试,看看会发生什么。
  • @user1904898 我在帖子底部添加了一个 2.0 版本,您可以测试一下,看看它是否有所作为?
  • 谢谢,您刚刚添加的版本在 2.0 中可以使用。我很感激。
【解决方案2】:

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,而不是创建一个函数。但这对性能没有影响,所以这只是个人喜好。

【讨论】:

  • 按原样导出到 CSV 会有问题。 dsquery 生成一个字符串数组,其中唯一的属性是 Length。所以这部分输出将在名为 Length 的列中显示为整数值。
  • 我尝试此操作时的输出示例。不知道如何编辑下面的格式。它列出了一行用户数据,然后用户组所在的位置我只看到带有三个逗号的空行 #TYPE Selected.Microsoft.ActiveDirectory.Management.ADUser "Name","SamAccountName","Enabled","LastLogon" "姓 名","用户名 1","True","5/6/2000 8:54:45 AM" ,,, ,,, ,,, ,,, ,,, ,,, ,,, ,,, ,,, ,,, "姓 名","用户名 2","True","5/6/2000 8:54:45 AM" ,,, ,,, ,,, ,, , ,,, ,,, ,,, ,,, ,,, ,,, "姓 名","用户名 3","True","5/6/2000 8:54:45 AM"
  • 查看 AdminOfThings 答案,它比我的要好。我什至没有注意到您正在使用 dsquery(您不必这样做!)
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多