Csv Powershell:强制计算添加成员的-value选项中的代码块

Csv Powershell:强制计算添加成员的-value选项中的代码块,csv,powershell,Csv,Powershell,我正在尝试使用CSV文件和powershell脚本将用户导入active directory。我使用通常与广告对象关联的标题创建CSV: 邮件、姓名、givenName、中间名、姓氏、公司、部门、标题、明文密码、路径、说明、用户名 …然后加满了 现在我想使用Powershell的新aduser cmmdlet为该工作表中的每个项目生成用户-我遇到的问题是,新aduser需要SecureString,而不仅仅是帐户密码的普通字符串。跳过此转换将导致正确创建“我的用户”,但没有密码,并且禁用了他们的

我正在尝试使用CSV文件和powershell脚本将用户导入active directory。我使用通常与广告对象关联的标题创建CSV:

邮件、姓名、givenName、中间名、姓氏、公司、部门、标题、明文密码、路径、说明、用户名

…然后加满了

现在我想使用Powershell的新aduser cmmdlet为该工作表中的每个项目生成用户-我遇到的问题是,新aduser需要SecureString,而不仅仅是帐户密码的普通字符串。跳过此转换将导致正确创建“我的用户”,但没有密码,并且禁用了他们的帐户

我使用的命令如下所示:

import-csv .\users.csv | add-member -passthru -memberType NoteProperty -value {$_ | select plaintextPassword | ConvertTo-SecureString -fromplaintext -force}
结果是用户记录如下所示:

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}
将明文密码转换为SecureString时应计算的代码位正在逐字传递,而不是内联执行

强制计算代码块并将其结果用作新成员值的参数的正确方法是什么

尝试: 将脚本块包含在$…-结果在对象中添加了null NoteProperty 将{…}替换为$…-结果在对象中添加了null NoteProperty
如管道化获取成员的整个命令所示,我发现的一个解决方案是不用添加成员,而是使用计算属性,如下所示:

import-csv .\users.csv | 
    select -Property *, @{
        n="encodedPassword"; 
        e={$_.plaintestPassword | ConvertTo-SecureString -fromplaintext -force}}

从@PetSerAl中删除了注释后损坏的add member,我发现一个解决方案是不必为add member操心,而是使用如下计算属性:

import-csv .\users.csv | 
    select -Property *, @{
        n="encodedPassword"; 
        e={$_.plaintestPassword | ConvertTo-SecureString -fromplaintext -force}}
删除了@PetSerAl

中的“在注释后添加断开的成员”,但要回答为什么它对您不起作用,这是因为$不适用于任何旧的脚本块。它是特殊的,只在特定的上下文中使用

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

相反,您可以添加一个ScriptProperty,如下所示:

import-csv .\users.csv | 
    select -Property *, @{
        n="encodedPassword"; 
        e={$_.plaintestPassword | ConvertTo-SecureString -fromplaintext -force}}
例如,在这种情况下,甚至不使用$;必须使用$this来引用父对象

但这确实会导致每次访问属性时都会处理脚本。如果您不希望这样做,并且希望执行按对象计算的静态值赋值,则必须枚举您自己:

import-csv .\users.csv | ForEach-Object {
    $val = $_ | select plaintextPassword | ConvertTo-SecureString -fromplaintext -force
    $_ | add-member -passthru -memberType NoteProperty -value $val -Force
}
,但要回答为什么它对您不起作用,这是因为$\u不适用于任何旧的脚本块。它是特殊的,只在特定的上下文中使用

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

相反,您可以添加一个ScriptProperty,如下所示:

import-csv .\users.csv | 
    select -Property *, @{
        n="encodedPassword"; 
        e={$_.plaintestPassword | ConvertTo-SecureString -fromplaintext -force}}
例如,在这种情况下,甚至不使用$;必须使用$this来引用父对象

但这确实会导致每次访问属性时都会处理脚本。如果您不希望这样做,并且希望执行按对象计算的静态值赋值,则必须枚举您自己:

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

您是在寻找ScriptProperty还是只在赋值时求值?我认为它只需要求值,因为进入New Aduser的所有其他输出都是NoteProperty类型@ErisUse-Value$。。。而不是-Value{..}?这会导致添加null属性。您是在寻找ScriptProperty还是只在赋值时求值?我认为只需要求值,因为进入新Aduser的所有其他输出都是NoteProperty类型@ErisUse-Value$。。。而不是-Value{..},这将导致添加null属性。使用$。。。要强制立即求值,脚本块文字仍然求值到脚本块对象,但不会求值到脚本块调用的结果。这就是我不喜欢在powershell 3+中添加成员的原因。这个答案非常有效。事实证明,我已经运行了正确版本的Powershell。如果您运行的是旧版本,那么看起来您就是SOL了-无论您如何使用该命令,添加成员似乎都不起作用。使用$。。。要强制立即求值,脚本块文字仍然求值到脚本块对象,但不会求值到脚本块调用的结果。这就是我不喜欢在powershell 3+中添加成员的原因。这个答案非常有效。事实证明,我已经运行了正确版本的Powershell。如果您运行的是旧版本,那么看起来您就是SOL了-无论您如何表达命令,添加成员似乎都不起作用。我已经完成了编写这段代码的工作,但是当您传递某个ScriptProperty而它需要NoteProperty时,这不会导致问题,或者我误解了类型系统的工作方式吗?@MikeyT.K。我想你可能误解了。读取属性的代码通常不知道或不关心它是什么类型的属性。它可以通过点访问。表示法或select或其他,但必须专门编写代码来确定属性类型,所以这不太可能有什么关系。有时重要的是生成值的脚本块是否昂贵或耗时,或者是否有副作用
这里使用的ScriptProperty的一个特点是,如果您更新.plaintextPassword后面的属性,则ScriptProperty中的值在上下文中总是正确的。是的,绝对正确,@ChrisDent所说的!它使它成为一个活的财产,无论是好是坏。在本例中,您必须确定这是否是您的特定情况所需要的特性,这很可能是。我已经完成了编写这段代码的工作,但当您在某个对象需要NoteProperty时传递ScriptProperty,或者我误解了类型系统的工作方式时,这不会导致问题吗?@MikeyT.K。我想你可能误解了。读取属性的代码通常不知道或不关心它是什么类型的属性。它可以通过点访问。表示法或select或其他,但必须专门编写代码来确定属性类型,所以这不太可能有什么关系。有时重要的是生成值的scriptblock是否昂贵、耗时或有副作用。此处使用的ScriptProperty的一个有用的优点是,如果您更新后面的属性。plaintextPassword,则ScriptProperty中的值在上下文中总是正确的。是的,绝对正确,“克里斯登”说了些什么!它使它成为一个活的财产,无论是好是坏。在这种情况下,你必须根据你的具体情况来确定这是否是一种可取的特质,很可能是。