使用PSCredential的Powershell Invoke-Command无法处理参数'Credential'上的参数转换

时间:2015-06-17 12:48:17

标签: powershell arguments transformation credentials invoke-command

我正在尝试使用PSCredential作为参数运行powershell invoke-command调用。

但是调用失败并出现错误:

  

Invoke-Command:无法处理参数的参数转换   '凭据'。的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")

1 个答案:

答案 0 :(得分:2)

调用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

在你的脚本中,你只向你的函数传递一个参数 - 它是一个对象数组,它自然不会作为-Credential cmdlet的Invoke-Command参数。 。所以,首先你必须像这样纠正你的脚本

ImpersonateSql $defaultCredential $serverInstance "SOME SQL QUERY HERE"

我甚至会说你最好在你的函数中定义Param()块,它可以让你更好地控制传递参数到函数。