我正在尝试使用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)
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)
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |