需要帮助使用变量来定义 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