"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 的限制。会一直玩下去的。