Powershell Invoke-Command with PSCredential 无法处理参数 'Credential' 的参数转换
Powershell Invoke-Command with PSCredential Cannot process argument transformation on parameter 'Credential'
我正在尝试 运行 使用 PSCredential 作为参数的 powershell 调用命令调用。
但是调用失败并出现错误:
Invoke-Command : Cannot process argument transformation on parameter
'Credential'. userName"
这是我得到的详细输出:
error 17-Jun-2015 14:33:53 Invoke-Command : Cannot process argument transformation on parameter 'Credential'. userName
error 17-Jun-2015 14:33:53 At C:\Windows\system32\config\systemprofile\AppData\Local\Temp\PRISMA-AMR-JOB1-68-ScriptBuildTask-7900604773745573277.ps1:31 char:71
error 17-Jun-2015 14:33:53 + Invoke-Command "sqlcmd -E -S "$server" -Q `"$query`" " -Credential <<<<
error 17-Jun-2015 14:33:53 ($credential)
error 17-Jun-2015 14:33:53 + CategoryInfo : InvalidData: (:) [Invoke-Command], ParentContain
error 17-Jun-2015 14:33:53 sErrorRecordException
error 17-Jun-2015 14:33:53 + FullyQualifiedErrorId : ParameterArgumentTransformationError,Microsoft.P
error 17-Jun-2015 14:33:53 owerShell.Commands.InvokeCommandCommand
基本上我只是想 运行 通过使用 PSCredential 的 Invoke-Command 调用模拟 sqlcmd。
知道这里发生了什么吗?
编辑:
这是 powershell 代码:
function GetPSCredential($userId){
$userIdFileNameWoExt = $userId.Replace("\",".")
$password = (Get-Content "somefile.pwd" | ConvertTo-SecureString -Key (Get-Content "somefile.key"))
$psCredential = New-Object `
-TypeName System.Management.Automation.PSCredential `
-ArgumentList "$userId", $password
return $psCredential
}
function ImpersonateSql ($credential, $server, $query) {
Invoke-Command "sqlcmd -E -S "$server" -Q `"$query`" " -Credential ($credential)
}
...
ImpersonateSql($defaultCredential, $serverInstance, "SOME SQL QUERY HERE")
您调用 ImpersonateSql
函数时出错。调用函数时不应该使用任何括号或逗号来指定参数(除非你有意将子表达式或数组作为参数传递),这不像你习惯的 C# 或 javascript 函数。看一个例子:
function func ($a, $b, $c) {
"a: {0}, b: {1}, c: {2}" -f $a, $b, $c
}
PS C:\Windows\system32> func(5,6,7)
a: System.Object[], b: , c:
PS C:\Windows\system32> func 5,6,7
a: System.Object[], b: , c:
PS C:\Windows\system32> func 5 6 7
a: 5, b: 6, c: 7
在您的脚本中,您只向函数传递一个参数 - 它是一个对象数组,自然不会作为 Invoke-Command
cmdlet 的 -Credential
参数。所以,首先你必须像这样更正你的脚本
ImpersonateSql $defaultCredential $serverInstance "SOME SQL QUERY HERE"
我什至会说你最好在你的函数中定义 Param()
块,它可以让你更好地控制传递给函数的参数。
我正在尝试 运行 使用 PSCredential 作为参数的 powershell 调用命令调用。
但是调用失败并出现错误:
Invoke-Command : Cannot process argument transformation on parameter 'Credential'. userName"
这是我得到的详细输出:
error 17-Jun-2015 14:33:53 Invoke-Command : Cannot process argument transformation on parameter 'Credential'. userName
error 17-Jun-2015 14:33:53 At C:\Windows\system32\config\systemprofile\AppData\Local\Temp\PRISMA-AMR-JOB1-68-ScriptBuildTask-7900604773745573277.ps1:31 char:71
error 17-Jun-2015 14:33:53 + Invoke-Command "sqlcmd -E -S "$server" -Q `"$query`" " -Credential <<<<
error 17-Jun-2015 14:33:53 ($credential)
error 17-Jun-2015 14:33:53 + CategoryInfo : InvalidData: (:) [Invoke-Command], ParentContain
error 17-Jun-2015 14:33:53 sErrorRecordException
error 17-Jun-2015 14:33:53 + FullyQualifiedErrorId : ParameterArgumentTransformationError,Microsoft.P
error 17-Jun-2015 14:33:53 owerShell.Commands.InvokeCommandCommand
基本上我只是想 运行 通过使用 PSCredential 的 Invoke-Command 调用模拟 sqlcmd。
知道这里发生了什么吗?
编辑: 这是 powershell 代码:
function GetPSCredential($userId){
$userIdFileNameWoExt = $userId.Replace("\",".")
$password = (Get-Content "somefile.pwd" | ConvertTo-SecureString -Key (Get-Content "somefile.key"))
$psCredential = New-Object `
-TypeName System.Management.Automation.PSCredential `
-ArgumentList "$userId", $password
return $psCredential
}
function ImpersonateSql ($credential, $server, $query) {
Invoke-Command "sqlcmd -E -S "$server" -Q `"$query`" " -Credential ($credential)
}
...
ImpersonateSql($defaultCredential, $serverInstance, "SOME SQL QUERY HERE")
您调用 ImpersonateSql
函数时出错。调用函数时不应该使用任何括号或逗号来指定参数(除非你有意将子表达式或数组作为参数传递),这不像你习惯的 C# 或 javascript 函数。看一个例子:
function func ($a, $b, $c) {
"a: {0}, b: {1}, c: {2}" -f $a, $b, $c
}
PS C:\Windows\system32> func(5,6,7)
a: System.Object[], b: , c:
PS C:\Windows\system32> func 5,6,7
a: System.Object[], b: , c:
PS C:\Windows\system32> func 5 6 7
a: 5, b: 6, c: 7
在您的脚本中,您只向函数传递一个参数 - 它是一个对象数组,自然不会作为 Invoke-Command
cmdlet 的 -Credential
参数。所以,首先你必须像这样更正你的脚本
ImpersonateSql $defaultCredential $serverInstance "SOME SQL QUERY HERE"
我什至会说你最好在你的函数中定义 Param()
块,它可以让你更好地控制传递给函数的参数。