安全字符串Powershell

6l7fqoea  于 2023-06-23  发布在  Shell
关注(0)|答案(2)|浏览(181)

我得到一个问题时,试图通过一个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
mwkjh3gx

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 recommendationthis answer

请注意,此传递 * 脚本块作为执行命令仅在您从现有PowerShell会话调用 * 时有效-但是,需要通过另一个PowerShell示例 *(CLI调用创建的子进程)而不是通过 * 直接调用 *(同一会话中的进程内)调用脚本 * 是不常见的。
在您的情况下,最简单的解决方案是:

powershell -c { 
  $scriptFile, $passThruArgs = $args
  & $scriptFile @passThruArgs
} -args $ADAccountScript, $ServiceAccountOU, $AgentAccount, $SecureServiceAccountPassword

注意,这依赖于 * 位置 * 参数传递。
如果您想使用 named 参数,就像您自己尝试的那样,您必须求助于基于哈希表的splatting

# Create the hashtable whose entries map onto the target
# script's parameters.
$htArgs = @{
    ServiceAccountOU = 'foo'
    Account          = 'bar'
    Password         = ConvertTo-SecureString  "somethingstrong!" -AsPlainText -Force
}

powershell -c { 
  $scriptFile, $passThruArgs = $args
  & $scriptFile @passThruArgs
} -args $ADAccountScript, $htArgs

[1]如果您将-Command/-c参数 * 作为字符串 * 传递-这是从 * 外部 * PowerShell调用PowerShell的CLI时的唯一选项-则[securestring]将 * 作为其字符串表示形式 * 传递,这是其 * 完整类型名称,逐字 *:'System.Security.SecureString' ;也就是说,实际的“安全”内容丢失了。
相比之下,传递一个 script block 会在幕后触发基于CLIXML的序列化,其中支持传递和接收 objects 而不是 only text-有关更多信息,请参阅this answer

nwlls2ji

nwlls2ji2#

您的密码没有作为安全字符串传递给PS。所以,你必须转换相同的并传递它。
替换如下:

NEW-ADUSER -Name $Account -AccountPassword $Password -Path $SrviceAccountOU -Enabled $True -PasswordNeverExpires $True -CannotChangePassword $True

收件人:

NEW-ADUSER -Name $Account -AccountPassword (ConvertTo-SecureString "$password" -AsPlainText -Force) -Path $SrviceAccountOU -Enabled $True -PasswordNeverExpires $True -CannotChangePassword $True

最好的方法是直接通过凭证:

$User = "MyUserName"
$File = "C:\Temp 2\Password.txt"
$password = Get-Content "C:\Passwords\password.txt" | ConvertTo-SecureString 
$credential = New-Object System.Management.Automation.PsCredential("Luke",$password)
$MyCredential=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)

New-ADUser -credential $MyCredential # Followed by whatever you need except the username and password.

相关问题