我得到一个问题时,试图通过一个securestring
在一个powershell脚本,但它回来了这个错误?
无法处理参数“Password”的参数转换。
无法转换“ConvertTo-SecureString”值
将类型“System.String”更改为类型“System.Security.SecureString”。
$SecureServiceAccountPassword = ConvertTo-SecureString "somethingstong!" `
-AsPlainText -Force
$AgentAccount = "myAccount"
$ServiceAccountOU = "MYOU"
POWERSHELL -COMMAND $ADAccountScript `
-ServiceAccountOU $ServiceAccountOU `
-Account $AgentAccount `
-Password $SecureAgentAccountPassword
它调用的脚本是这样的。
param(
##MasterKey for KeePass currently stored in a DB.
[Parameter(Position=0,mandatory=$true)] [string] $ServiceAccountOU,
##Account to be created in AD
[Parameter(Position=1,mandatory=$true)] [string] $Account,
[Parameter(Position=2,mandatory=$true)] [SecureString] $Password
)
NEW-ADUSER -Name $Account `
-AccountPassword $Password `
-Path $SrviceAccountOU `
-Enabled $True `
-PasswordNeverExpires $True `
-CannotChangePassword $True
2条答案
按热度按时间mwkjh3gx1#
要通过PowerShell的CLI(Windows PowerShell中的
powershell.exe
,PowerShell(Core)7+中的pwsh
)传递[securestring]
(System.Security.SecureString
)示例**,*您必须将执行(-Command
/-c
) 的命令作为script block***传递。[1][securestring]
-假设输入字符串不是通过 * 纯文本 * 表示(如问题中所示)获得的-无疑比使用纯文本密码更好,在新项目中使用[securestring]
是 * 不鼓励的*,因为它在 * 类Unix* 平台上提供 * 无 * 保护,在Windows上仅提供 * 有限 * 保护。参见this .NET platform-compatibility recommendation和this answer。请注意,此传递 * 脚本块作为执行命令仅在您从现有PowerShell会话调用 * 时有效-但是,需要通过另一个PowerShell示例 *(CLI调用创建的子进程)而不是通过 * 直接调用 *(同一会话中的进程内)调用脚本 * 是不常见的。
在您的情况下,最简单的解决方案是:
注意,这依赖于 * 位置 * 参数传递。
如果您想使用 named 参数,就像您自己尝试的那样,您必须求助于基于哈希表的splatting
[1]如果您将
-Command
/-c
参数 * 作为字符串 * 传递-这是从 * 外部 * PowerShell调用PowerShell的CLI时的唯一选项-则[securestring]
将 * 作为其字符串表示形式 * 传递,这是其 * 完整类型名称,逐字 *:'System.Security.SecureString'
;也就是说,实际的“安全”内容丢失了。相比之下,传递一个 script block 会在幕后触发基于CLIXML的序列化,其中支持传递和接收 objects 而不是 only text-有关更多信息,请参阅this answer。
nwlls2ji2#
您的密码没有作为安全字符串传递给PS。所以,你必须转换相同的并传递它。
替换如下:
收件人:
最好的方法是直接通过凭证: