需要帮助使用变量来定义 Get-ADUser 的属性
Need help using a variable to define -Properties for Get-ADUser
我有一个用于获取各种 AD 组的所有成员的脚本,但最近我们需要获取的不仅仅是成员的姓名,还需要获取各种属性,例如 Title 或 Office。我尝试调整我的脚本,以便您可以输入您需要定义的属性,但它没有像我希望的那样工作,所以我希望有人可以提供帮助。
这是我的原始脚本:
$EndDate = (Get-Date).ToString("yyyy-MM-dd_HHmm")
$FileName = $ADGroup + '_' + $EndDate + '_ADGroupReport.csv'
$FilePath = 'P:\Information Technology\IT Reports\' + $FileName
function Get-Members {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true, HelpMessage="Enter a valid AD Group.")]
[string]$ADGroup,
[Parameter(Mandatory=$false, HelpMessage="Enter valid AD Properties seperated by a comma.")]
$Properties
)
process {
if (!$Properties) {
Get-ADGroupmember -identity $ADGroup | select name | Export-Csv -Path $FilePath
} else {
Get-ADGroupmember -identity $ADGroup | where{$_.ObjectClass -eq "user"} | Get-ADUser -Properties '$Properties' | select name, $Properties | Export-Csv -Path $FilePath
}
}
}
$Group = Read-Host -Prompt 'Enter a valid AD Group:'
$Prop = Read-Host -Prompt 'Enter any additional properties needed:'
Get-Members -ADGroup $Group -Properties $Prop
如果我只输入 1 属性,这似乎在 try 阶段有效,但在 finally 阶段失败。如果我输入多个属性,例如 title,office,那么它在两个阶段都会失败。
输入附加属性时出现的错误如下。我的假设是它不喜欢把它当作一个字符串,而更喜欢一个数组?老实说,我不确定如何处理这个问题。
Get-ADUser : One or more properties are invalid.
Parameter name: $Properties
At line:10 char:79
+ ... bjectClass -eq "user"} | Get-ADUser -Properties '$Properties' | selec ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (REDACTED) [Get-ADUser], ArgumentException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
在任何人说什么之前,我知道如果没有输入任何属性,try 块将失败,它目前仅用于我的测试。
我可以在您的代码中看到三个问题,第一个,-Properties '$Properties'
上的单引号不允许扩展变量 $Properties
, 就像通过文字字符串.
应该是:
Get-ADUser -Properties $Properties
第二个问题,这样做Select-Object Name, $Properties
会抛出以下异常(假设$Properties
本来是array
):
$properties = 'email', 'title'
[PSCustomObject]@{
Name = 'User'
Email = 'user@domain.com'
Title = 'Administrator'
} | Select-Object Name, $properties
Cannot convert System.Object[]
to one of the following types {System.String
, System.Management.Automation.ScriptBlock
}.
您可以这样做,以便 Name
始终包含在 $Properties
变量中:
$properties = ,'name' # => This is hardcoded
$properties += 'email', 'title' # => This is user input
[PSCustomObject]@{
Name = 'User'
Email = 'user@domain.com'
Title = 'Administrator'
} | Select-Object $properties
Name Email Title
---- ----- -----
User user@domain.com Administrator
第三个问题是 指出的问题,Read-Host
会将用户输入存储为 string
,因此,假设用户实际使用 ,
作为每个 属性 的分隔符,您可以使用 -split
或 .split()
:
将输入转换为 array
$prop = ,'name'
$prop += (
Read-Host -Prompt 'Enter any additional properties needed'
).Split(',').ForEach('Trim')
假设输入是 email, title
:
Enter any additional properties needed: email, title
name
email
title
我有一个用于获取各种 AD 组的所有成员的脚本,但最近我们需要获取的不仅仅是成员的姓名,还需要获取各种属性,例如 Title 或 Office。我尝试调整我的脚本,以便您可以输入您需要定义的属性,但它没有像我希望的那样工作,所以我希望有人可以提供帮助。
这是我的原始脚本:
$EndDate = (Get-Date).ToString("yyyy-MM-dd_HHmm")
$FileName = $ADGroup + '_' + $EndDate + '_ADGroupReport.csv'
$FilePath = 'P:\Information Technology\IT Reports\' + $FileName
function Get-Members {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true, HelpMessage="Enter a valid AD Group.")]
[string]$ADGroup,
[Parameter(Mandatory=$false, HelpMessage="Enter valid AD Properties seperated by a comma.")]
$Properties
)
process {
if (!$Properties) {
Get-ADGroupmember -identity $ADGroup | select name | Export-Csv -Path $FilePath
} else {
Get-ADGroupmember -identity $ADGroup | where{$_.ObjectClass -eq "user"} | Get-ADUser -Properties '$Properties' | select name, $Properties | Export-Csv -Path $FilePath
}
}
}
$Group = Read-Host -Prompt 'Enter a valid AD Group:'
$Prop = Read-Host -Prompt 'Enter any additional properties needed:'
Get-Members -ADGroup $Group -Properties $Prop
如果我只输入 1 属性,这似乎在 try 阶段有效,但在 finally 阶段失败。如果我输入多个属性,例如 title,office,那么它在两个阶段都会失败。
输入附加属性时出现的错误如下。我的假设是它不喜欢把它当作一个字符串,而更喜欢一个数组?老实说,我不确定如何处理这个问题。
Get-ADUser : One or more properties are invalid.
Parameter name: $Properties
At line:10 char:79
+ ... bjectClass -eq "user"} | Get-ADUser -Properties '$Properties' | selec ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (REDACTED) [Get-ADUser], ArgumentException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
在任何人说什么之前,我知道如果没有输入任何属性,try 块将失败,它目前仅用于我的测试。
我可以在您的代码中看到三个问题,第一个,-Properties '$Properties'
上的单引号不允许扩展变量 $Properties
, 就像通过文字字符串.
应该是:
Get-ADUser -Properties $Properties
第二个问题,这样做Select-Object Name, $Properties
会抛出以下异常(假设$Properties
本来是array
):
$properties = 'email', 'title'
[PSCustomObject]@{
Name = 'User'
Email = 'user@domain.com'
Title = 'Administrator'
} | Select-Object Name, $properties
Cannot convert
System.Object[]
to one of the following types {System.String
,System.Management.Automation.ScriptBlock
}.
您可以这样做,以便 Name
始终包含在 $Properties
变量中:
$properties = ,'name' # => This is hardcoded
$properties += 'email', 'title' # => This is user input
[PSCustomObject]@{
Name = 'User'
Email = 'user@domain.com'
Title = 'Administrator'
} | Select-Object $properties
Name Email Title
---- ----- -----
User user@domain.com Administrator
第三个问题是 Read-Host
会将用户输入存储为 string
,因此,假设用户实际使用 ,
作为每个 属性 的分隔符,您可以使用 -split
或 .split()
:
array
$prop = ,'name'
$prop += (
Read-Host -Prompt 'Enter any additional properties needed'
).Split(',').ForEach('Trim')
假设输入是 email, title
:
Enter any additional properties needed: email, title
name
email
title