PowerShell中PSCustomObject处理Manager字段空值问题求助
解决AD用户Manager字段空值处理问题
问题场景
需要实现的工作流程:
- 若AD用户的Manager字段不为空,获取该经理的显示名称并添加到PSCustomObject中
- 若Manager字段为空,则添加
NULL关键字
原代码处理Manager字段时触发报错,报错信息如下:
Get-ADUser : Cannot validate argument on parameter 'Identity'. The argument is null. Provide a valid value for the argument, and then try running the command again. At line:18 char:45 + manager = if ((Get-ADuser -identity $obj.Manager)) {(Get-ADus ... + ~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Get-ADUser], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADUser
报错原因
原代码直接在if条件中调用Get-ADUser -identity $obj.Manager,当$obj.Manager为空时,会将空值传递给Get-ADUser的Identity参数,而该参数不接受空值,因此触发参数验证错误。
解决方案
先判断$obj.Manager是否为空,再决定是否执行AD查询,同时优化查询逻辑避免重复调用:
修改后的完整脚本:
$Objects = Get-ADUser -identity user01 -properties * $logging = @() # 初始化数组,避免空值类型拼接问题 foreach ($obj in $Objects) { $LogonDate = (Get-LastLogon -Identity $obj.SamAccountName).DateTime # 单独处理Manager字段逻辑 $managerDisplayName = 'NULL' if ($obj.Manager) { # 先判断Manager字段是否非空 $managerUser = Get-ADUser -Identity $obj.Manager -Properties DisplayName $managerDisplayName = $managerUser.DisplayName } $logging += [PSCustomObject]@{ DisplayName = $obj.Name samaccountname = $obj.samaccountname mail = $obj.mail title = $obj.title department = $obj.department manager = $managerDisplayName physicalDeliveryOfficeName = $obj.physicalDeliveryOfficeName postalCode = $obj.postalCode State = $obj.St description = $obj.description Country = $obj.c company = $obj.company homephone = $obj.homephone telephoneNumber = $obj.telephoneNumber mobile = $obj.mobile Location = $obj.l LastLogon = $LogonDate } } $logging
关键修改说明
- 先校验
$obj.Manager是否存在,仅当非空时才调用Get-ADUser,避免空参数报错 - 将Manager查询逻辑单独提取,避免原代码中重复调用AD查询的资源浪费
- 初始化
$logging为数组,解决默认空值导致的类型拼接异常 - 当Manager为空时,直接设置值为
'NULL'字符串,符合需求
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

