【问题标题】:Need help using a variable to define -Properties for Get-ADUser需要帮助使用变量来定义 Get-ADUser 的 -Properties
【发布时间】:2022-01-12 17:46:03
【问题描述】:

我有一个用于获取各种 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 个属性,这似乎在尝试阶段有效,但在最后阶段失败。如果我输入多个属性,例如标题、办公室,那么这两个阶段都会失败。

输入其他属性时出现的错误如下。我的假设是它不喜欢这个字符串并且更喜欢数组?老实说,我不确定如何处理这个问题。

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 块将失败,它目前仅用于我的测试。

【问题讨论】:

  • $Prop = Read-Host -Prompt 'Enter any additional properties needed:' 中的不同属性如何区分?您应该向输入数据的用户说明这一点。然后在您的函数中,将$Properties 中的给定字符串拆分为该分隔符。 (请记住,有人可以在 Read-Host 中输入几乎 任何内容,因此您需要内置检查以查看输入是否可行。)
  • 在我的测试中,我用逗号分隔它们,我认为这应该可以工作,因为如果我对属性进行硬编码,它们用逗号分隔并且可以正常工作。我会确保将其添加到有关如何将它们分开的提示中。
  • 那你只需要用逗号分开我猜-Properties ($Properties -split ',')

标签: powershell active-directory


【解决方案1】:

我可以在您的代码中看到三个问题,第一个,-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

无法将 System.Object[] 转换为以下类型之一 {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

第三个问题是Theo on his comment 指出的问题,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

【讨论】:

  • 我实际上只是做了所有这些更改,并且正要评论分辨率是多少,但我没有在数组拆分后进行修剪,我会添加!
  • @Caleb AD 模块可能足够聪明,可以忽略数组每个元素上的前导和尾随空格,但为了确保我认为值得添加它,呵呵
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2013-01-11
  • 1970-01-01
相关资源
最近更新 更多