Powershell将结果输出到特定OU的AD查询的CSV

时间:2015-04-16 00:29:28

标签: powershell csv active-directory

我有一个用户列表,我需要查询它们是否在特定的OU中。我有一个Powershell,它在控制台中提供了我想要的几乎所有结果,但我希望它写入CSV文件。有人可以帮我解释一下语法。

$Usernames = Get-Content -path .\Usernames.txt

# Running against user list
ForEach ($Username in $Usernames)
{
$ADuser = Get-ADUser -identity $Username –properties *
$UserOU = $ADuser.CanonicalName.ToString().Split('/')[2]

        if ($userOU -match "OUName_A") {
            $OU = "FriendlyOUName_A"
            write-host $Username $OU -foregroundcolor green
        }
        elseif ($userOU -match "OUName_B") {
            $OU = "FriendlyOUName_B"
            write-host $Username $OU
        }
        else {
            write-host $Username "Disabled" -foregroundcolor red
        }
}

所以屏幕输出现在看起来像:

username#1 FriendlyOUName_A
username#2 FriendlyOUName_B
username#3 disabled
Get-ADUser : Cannot find an object with identity: 'username#4' under: 'DC=subdomain,DC=company,DC=com'.
At C:\temp\FindOUofUsers.ps1:8 char:11
+ $ADuser = Get-ADUser -identity $Username –properties *
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (username#4:username#4) [Get-ADUser], ADIdentityNotFoundException
    + FullyQualifiedErrorId : Cannot find an object with identity: 'username#4' under: 'DC=subdomain,DC=company,DC=com'.,Microsoft.ActiveDirectory.Management.Commands.GetADUser

将错误状态捕获为username#4 Deleted

会很有帮助

1 个答案:

答案 0 :(得分:1)

正如TheMadTechnician指出的那样,你只是在屏幕上输出文字(而不是 stdout)。这是Write-Host的工作。如果要写入stdout,则应使用Write-Output,或者只输出字符串。

但是,更好的更好的方式是输出对象而不是字符串。这就是PowerShell管道的亮点。一旦你有了实际的对象,你可以随心所欲地做任何事情 - 打印,排序,是的,甚至把它们写成CSV文件。

这应该做你想要的。请注意,该脚本使用两个属性(UserName和OU)创建自定义对象。然后将对象返回到管道,然后管道通过管道传递给Export-Csv命令行开关。我敦促你先尝试没有Export-Csv部分的脚本 - 这会将输出转储到屏幕上,你会看到发生了什么。

$Usernames = Get-Content -path .\Usernames.txt
$Usernames | ForEach-Object {
    $Username = $_

    $returnObj = New-Object PSCustomObject
    $returnObj | Add-Member -MemberType NoteProperty -Name UserName -Value $Username
    $returnObj | Add-Member -MemberType NoteProperty -Name OU       -Value 'Deleted'

    try {
        $ADuser = Get-ADUser -Identity $Username -Properties CanonicalName -ErrorAction Stop
        $UserOU = $ADuser.CanonicalName.ToString().Split('/')[2]

        if ($userOU -match "OUName_A") {
            $returnObj.OU = "FriendlyOUName_A"
        }
        elseif ($userOU -match "OUName_B") {
            $returnObj.OU = "FriendlyOUName_B"
        }
        else {
            $returnObj.OU = "Disabled"
        }
    }
    catch { }

    $returnObj  # This returns the object to the pipeline

} | Export-Csv '.\myFile.csv' -Encoding ASCII -NoTypeInformation