"Cannot process argument transformation" 创建 PSCredential 时
"Cannot process argument transformation" when creating PSCredential
我正在尝试通过使用以下代码从 C# 调用 PowerShell 来创建 Windows 凭据:
using var securePassword = new SecureString();
foreach (char c in clearTextPassword)
securePassword.AppendChar(c);
securePassword.MakeReadOnly();
var credential = PowerShell.Create().AddCommand("New-Object")
.AddParameter("TypeName", "System.Management.Automation.PSCredential")
.AddParameter("ArgumentList", new object[] { "mydomain\myuser", securePassword }) // String, SecureString
.Invoke();
当执行上面的凭据行时,我得到这个异常:
无法处理参数 'Credential' 的参数转换。用户名
我很困惑为什么并且找不到任何相关的 C# 示例来执行此操作(或者至少 none 展示了如何以不同的方式执行此操作)。我猜这是相当简单的事情,比如命名参数,但不确定是如何完成的。
编辑 1:
运行 PowerShell 中的以下内容(使用 New-Object
):
$user = "MyDomain\MyAccount"
$pass = ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $pass
New-PSDrive -Name X -PSProvider FileSystem -Root "\server\share" -Credential $cred -Persist
失败并出现此错误:
New-PSDrive: 指定的网络密码不正确
但是当我修改提示用户输入相同的密码时(使用Get-Credential
):
$user = "MyDomain\MyAccount"
$cred = Get-Credential -Credential $user
New-PSDrive -Name X -PSProvider FileSystem -Root "\server\share" -Credential $cred -Persist
有效。请注意,在这两种情况下,我都指定了相同的纯文本密码。我只能假设 ConvertTo-SecureString
没有按预期工作。
编辑 2:
终于在编辑 1 中找出了脚本问题。我改用单引号 (') 围绕纯文本密码而不是双引号 (")。用单引号括起来的字符串是一个 verbatim 字符串。该字符串完全按照您键入的方式传递给命令。不执行任何替换。我的真实密码(与我在此处显示的不同)包含美元符号字符我认为它被解释为变量。
关于此的更多信息here。
尽管如此,仍然没有解决我最初关于 C# 代码的问题。
下面的代码似乎有效:
var pw = PowerShell.Create().AddCommand("ConvertTo-SecureString")
.AddParameter("String", MyPassword)
.AddParameter("AsPlainText")
.AddParameter("Force")
.Invoke();
var credential = PowerShell.Create().AddCommand("New-Object")
.AddParameter("TypeName", "System.Management.Automation.PSCredential")
.AddParameter("ArgumentList", new object[] { @"MyDomain\MyAccount", pw[0] }) // String, SecureString
.Invoke();
//var credential = new PSCredential(@"MyDomain\MyAccount, securePassword); // Another way
var r = PowerShell.Create().AddCommand("New-PSDrive")
.AddParameter("Name", "X")
.AddParameter("PSProvider", "FileSystem")
.AddParameter("Root", @"\MyServer\MyShare")
.AddParameter("Credential", credential[0])
.AddParameter("Persist")
.Invoke();
他们使用的密钥是 pw[0]
和 credential[0]
。
现在我剩下的问题是以上只在我的信誉下有效。如果我尝试获取不同帐户的凭据并以此方式映射驱动器,则会失败。不过,这可能是 Windows 的限制。会一直玩下去的。
我正在尝试通过使用以下代码从 C# 调用 PowerShell 来创建 Windows 凭据:
using var securePassword = new SecureString();
foreach (char c in clearTextPassword)
securePassword.AppendChar(c);
securePassword.MakeReadOnly();
var credential = PowerShell.Create().AddCommand("New-Object")
.AddParameter("TypeName", "System.Management.Automation.PSCredential")
.AddParameter("ArgumentList", new object[] { "mydomain\myuser", securePassword }) // String, SecureString
.Invoke();
当执行上面的凭据行时,我得到这个异常:
无法处理参数 'Credential' 的参数转换。用户名
我很困惑为什么并且找不到任何相关的 C# 示例来执行此操作(或者至少 none 展示了如何以不同的方式执行此操作)。我猜这是相当简单的事情,比如命名参数,但不确定是如何完成的。
编辑 1:
运行 PowerShell 中的以下内容(使用 New-Object
):
$user = "MyDomain\MyAccount"
$pass = ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $pass
New-PSDrive -Name X -PSProvider FileSystem -Root "\server\share" -Credential $cred -Persist
失败并出现此错误:
New-PSDrive: 指定的网络密码不正确
但是当我修改提示用户输入相同的密码时(使用Get-Credential
):
$user = "MyDomain\MyAccount"
$cred = Get-Credential -Credential $user
New-PSDrive -Name X -PSProvider FileSystem -Root "\server\share" -Credential $cred -Persist
有效。请注意,在这两种情况下,我都指定了相同的纯文本密码。我只能假设 ConvertTo-SecureString
没有按预期工作。
编辑 2:
终于在编辑 1 中找出了脚本问题。我改用单引号 (') 围绕纯文本密码而不是双引号 (")。用单引号括起来的字符串是一个 verbatim 字符串。该字符串完全按照您键入的方式传递给命令。不执行任何替换。我的真实密码(与我在此处显示的不同)包含美元符号字符我认为它被解释为变量。
关于此的更多信息here。
尽管如此,仍然没有解决我最初关于 C# 代码的问题。
下面的代码似乎有效:
var pw = PowerShell.Create().AddCommand("ConvertTo-SecureString")
.AddParameter("String", MyPassword)
.AddParameter("AsPlainText")
.AddParameter("Force")
.Invoke();
var credential = PowerShell.Create().AddCommand("New-Object")
.AddParameter("TypeName", "System.Management.Automation.PSCredential")
.AddParameter("ArgumentList", new object[] { @"MyDomain\MyAccount", pw[0] }) // String, SecureString
.Invoke();
//var credential = new PSCredential(@"MyDomain\MyAccount, securePassword); // Another way
var r = PowerShell.Create().AddCommand("New-PSDrive")
.AddParameter("Name", "X")
.AddParameter("PSProvider", "FileSystem")
.AddParameter("Root", @"\MyServer\MyShare")
.AddParameter("Credential", credential[0])
.AddParameter("Persist")
.Invoke();
他们使用的密钥是 pw[0]
和 credential[0]
。
现在我剩下的问题是以上只在我的信誉下有效。如果我尝试获取不同帐户的凭据并以此方式映射驱动器,则会失败。不过,这可能是 Windows 的限制。会一直玩下去的。