Powershell:强制评估Add-member的-value选项中的代码块

Mik*_*.K. 1 csv powershell

我正在尝试使用CSV文件和powershell脚本将用户导入活动目录.我使用通常与AD对象关联的标头创建CSV:

mail,name,givenName,middleName,surname,company,department,title,plaintextPassword,path,description,userPrincipalName

......并填补了它.

现在我想使用Powershell的new-adusercmmdlet为这个表中的每个项生成用户 - 我遇到的问题是new-aduser需要一个SecureString,而不仅仅是一个帐户密码的普通字符串.跳过此转化会导致我的用户被正确创建,但没有密码并禁用了他们的帐户.

我正在使用的命令如下:

import-csv .\users.csv | add-member -passthru -memberType NoteProperty -value {$_ | select plaintextPassword | ConvertTo-SecureString -fromplaintext -force}
Run Code Online (Sandbox Code Playgroud)

结果是用户记录如下:

mail              : tom.fubar@contoso.com
name              : tom.fubar
givenName         : Tom
middleName        :
surname           : Fubar
company           : Contoso
department        : IT
title             : Technician
accountPassword   : LongPasswordThatFitsADComplexityRequirements123!
path              : OU=UserAccounts,OU=IT,OU=employees,DC=contoso,DC=com
description       : 
userPrincipalName : tom.fubar@contoso.com
encodedPassword   : {$_ | select accountPassword | ConvertTo-SecureString -asplaintext -force}
Run Code Online (Sandbox Code Playgroud)

应该评估将明文密码转换为SecureString的代码位是逐字传递的,而不是内联执行的.

强制对代码块进行求值的正确方法是什么,并将其结果用作参数New-Member -value

尝试:

  • 将脚本块括起来$(...) - 导致添加到对象的null NoteProperty
  • 替换{...}with $(...)- 结果添加到对象中的null NoteProperty

(如通过管道整个命令所示Get-Member)

bri*_*ist 5

Eris发布了一个非常有效的解决方法,但要回答为什么它不适合你,这是因为$_不适用于任何旧的脚本块.它是"特殊的",仅在某些情况下使用.

此外,-NotePropertyValue需要一个静态值.

相反,您可以添加ScriptProperty如下:

import-csv .\users.csv | 
    add-member -passthru -memberType ScriptProperty -value {$this.plaintextPassword | ConvertTo-SecureString -fromplaintext -force}
Run Code Online (Sandbox Code Playgroud)

例如,在这种情况下,$_甚至没有使用过; 你必须用来$this引用父对象.

这确实导致每次访问属性时都会处理脚本.如果您不想这样做,并且想要执行每个对象计算的静态值赋值,那么您必须枚举自己:

import-csv .\users.csv | ForEach-Object {
    $val = $_ | select plaintextPassword | ConvertTo-SecureString -fromplaintext -force
    $_ | add-member -passthru -memberType NoteProperty -value $val -Force
}
Run Code Online (Sandbox Code Playgroud)

  • 此处使用的 ScriptProperty 的一个有用优点是,如果您更新 (.plaintextPassword) 后面的属性,则 ScriptProperty 中的值始终在上下文中正确。 (2认同)