PowerShell脚本仅读取单个用户 无法批量处理用户列表问题求助
问题根因
Get-Content读取多用户的txt文件时返回的是字符串数组,原脚本直接将整个数组放入Get-AzureADUser的过滤条件中,userPrincipalName eq '$list'只能在单用户场景下匹配成功,多用户时过滤条件不合法,无返回结果。- 结果数组
$Users_report未提前初始化,直接使用+=拼接内容会触发空值错误,导致输出丢失。 - 多设备信息拼接逻辑中使用了未定义的
$owner变量,判断逻辑完全失效,多设备信息末尾会多出空行。 - 导出CSV时未使用提前定义的
$logfile绝对路径,使用相对路径可能出现目录找不到的报错,且未设置编码容易出现中文乱码。
调整后的完整脚本
#Variables $Inputfile = $env:HOMEDRIVE+"\temp\Users.txt" $logfile = $env:HOMEDRIVE+"\temp\MachineMatch.csv" #初始化结果数组 $Users_report = @() #删除旧文件 $testpath = Test-Path $logfile if($testpath){Remove-Item $logfile -Force} $testpath = Test-Path $Inputfile if($testpath){Remove-Item $Inputfile -Force} #打开记事本录入用户 Write-Host "Opening Notepad...`n" Start-Sleep 2 Try { New-Item $Inputfile -ItemType file -ErrorAction Stop | Out-Null Invoke-Item $Inputfile -ErrorAction Stop } catch { Write-Warning $_ Break } Write-Host "Do you wish to Proceed (Y/N): " -NoNewline $choice = Read-Host if($choice -ne "Y"){Break} $list = Get-Content $Inputfile -ErrorAction Stop #遍历每个用户逐一查询 ForEach($upn in $list) { #跳过空行 if([string]::IsNullOrWhiteSpace($upn)){ continue } $User = Get-AzureADUser -Filter "userPrincipalName eq '$upn'" if(-not $User){ #未匹配到用户的记录逻辑,不需要可以直接删除这段 $User_Owner_Obj = New-Object PSObject $User_Owner_Obj | Add-Member NoteProperty -Name "User Name" -Value "未匹配到用户" $User_Owner_Obj | Add-Member NoteProperty -Name "User Mail" -Value $upn -force $User_Owner_Obj | Add-Member NoteProperty -Name "User OU" -Value "-" -force $User_Owner_Obj | Add-Member NoteProperty -Name "Account enabled ?" -Value "-" $User_Owner_Obj | Add-Member NoteProperty -Name "Devices count" -Value 0 -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device name" -Value "-" -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device last logon" -Value "-" -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device OS type" -Value "-" -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device OS version" -Value "-" -force $Users_report += $User_Owner_Obj continue } $User_ObjectID = $User.ObjectID $User_DisplayName = $User.DisplayName $User_Mail = $User.UserPrincipalName $User_Mobile = $User.Mobile $User_OU = $User.extensionproperty.onPremisesDistinguishedName $User_Account_Status = $User.AccountEnabled $Get_User_Devices = (Get-AzureADUserRegisteredDevice -ObjectId $User_ObjectID) $Count_User_Devices = $Get_User_Devices.count $User_Owner_Obj = New-Object PSObject $User_Owner_Obj | Add-Member NoteProperty -Name "User Name" -Value $User_DisplayName $User_Owner_Obj | Add-Member NoteProperty -Name "User Mail" -Value $User_Mail -force $User_Owner_Obj | Add-Member NoteProperty -Name "User OU" -Value $User_OU -force $User_Owner_Obj | Add-Member NoteProperty -Name "Account enabled ?" -Value $User_Account_Status $User_Owner_Obj | Add-Member NoteProperty -Name "Devices count" -Value $Count_User_Devices -force If($Count_User_Devices -eq 0) { $User_Owner_Obj | Add-Member NoteProperty -Name "Device name" -Value "No device" -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device last logon" -Value "No device" -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device OS type" -Value "No device" -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device OS version" -Value "No device" -force } ElseIf($Count_User_Devices -gt 1) { $Devices_LastLogon = "" $Devices_OSType = "" $Devices_OSVersion = "" $Devices_DisplayName = "" For($i=0;$i -lt $Get_User_Devices.Count;$i++) { $Device = $Get_User_Devices[$i] $Device_LastLogon = $Device.ApproximateLastLogonTimeStamp $Device_OSType = $Device.DeviceOSType $Device_OSVersion = $Device.DeviceOSVersion $Device_DisplayName = $Device.DisplayName If ($i -eq $Get_User_Devices.Count-1) { $Devices_LastLogon += "$Device_LastLogon" $Devices_OSType += "$Device_OSType" $Devices_OSVersion += "$Device_OSVersion" $Devices_DisplayName += "$Device_DisplayName" } Else { $Devices_LastLogon += "$Device_LastLogon`n" $Devices_OSType += "$Device_OSType`n" $Devices_OSVersion += "$Device_OSVersion`n" $Devices_DisplayName += "$Device_DisplayName`n" } } $User_Owner_Obj | Add-Member NoteProperty -Name "Device name" -Value $Devices_DisplayName -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device last logon" -Value $Devices_LastLogon -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device OS type" -Value $Devices_OSType -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device OS version" -Value $Devices_OSVersion -force } Else { $Device_LastLogon = $Get_User_Devices.ApproximateLastLogonTimeStamp $Device_OSType = $Get_User_Devices.DeviceOSType $Device_OSVersion = $Get_User_Devices.DeviceOSVersion $Device_DisplayName = $Get_User_Devices.DisplayName $User_Owner_Obj | Add-Member NoteProperty -Name "Device name" -Value $Device_DisplayName -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device last logon" -Value $Device_LastLogon -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device OS type" -Value $Device_OSType -force $User_Owner_Obj | Add-Member NoteProperty -Name "Device OS version" -Value $Device_OSVersion -force } $Users_report += $User_Owner_Obj } #输出结果 $Users_report | Out-GridView $Users_report | Export-Csv $logfile -NoTypeInformation -Delimiter ";" -Encoding UTF8
内容的提问来源于stack exchange,提问作者jinfusion
相关产品推荐
相关产品推荐

