我有一个用户列表,我需要查询它们是否在特定的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
答案 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