You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 09:06:07