Powershell:如何从 C# 代码中获取凭据?

Posted

技术标签:

【中文标题】Powershell:如何从 C# 代码中获取凭据?【英文标题】:Powershell: How do i get credentials from C# code? 【发布时间】:2009-10-26 12:04:20 【问题描述】:

我尝试调用“Get-Credential”CMDlet,但没有成功。阅读 Powershell SDK 我发现抽象方法“PSHostUserInterface.PromptForCredential Method (String, String, String, String)”。有没有实现这个方法的对象?

还有其他解决方案吗?

问候

【问题讨论】:

【参考方案1】:

遍历当前主机的 UI 对象以提示用户输入凭据,如下所示:

PSCredential cred = this.Host.UI.PromptForCredential("Enter username/password",
                                                     "", "", "");

但是,如果您正在创建一个 cmdlet 并采用此方法而不是创建 Credential 参数,则用户将无法以自动方式提供凭据(即通过 Credential 参数的参数)。

顺便说一句,如果您的程序知道凭据并且您不想提示最终用户,那么您可以直接创建一个新的 PSCredential,例如:

var password = new SecureString();
Array.ForEach("opensesame".ToCharArray(), password.AppendChar);
var cred = new PSCredential("john", password);

但是我不会在 EXE 中硬编码密码。我会使用 DPAPI 或类似的东西。

【讨论】:

请记住,您需要从 PSCmdlet 而不是 Cmdlet 继承才能使其工作。【参考方案2】:

您正在编写自定义 PSHost 吗?如果是这样,那么您的自定义主机将需要提供您自己的 PSHostUserInterface 实现,然后在其中实现 PromptForCredential()。

如果您需要自己实现这一点,并且想要使用 PowerShell 默认使用的标准 Windows 凭据对话框,那么您可以使用 CredUIPromptForCredentials() api。有一些关于如何从 .NET here 和 here 调用它的代码。

【讨论】:

感谢您的回答!我希望我不必编写自定义主机。我只需要提示输入凭据并取回 PSCredential 对象。不应验证凭据,因为我需要为工作组中的远程计算机传递用户名密码。有没有办法获取运行空间的默认 PShost 对象?然后像这里描述的那样调用 PromtForCredential msdn.microsoft.com/en-us/library/… 那么我不确定我是否理解你在做什么。您在什么情况下尝试获取这些凭据?在 PowerShell 脚本中?如果是这样,那么调用 Get-Credential 确实是可行的方法,并且由于这是 PSHostUserInterface.PromptForCredential() 之上的一个非常薄的包装,如果 Get-Credential 不起作用,另一个也不会。你的脚本在哪里运行? 如果您正在编写一个使用 powershell cmdlet 的 C# 应用程序,那么您基本上是在编写一个主机,并且必须自己实现它。如果您正在编写一个 cmdlet ...您应该只添加一个接受用户凭据的参数,而不是尝试自己获取它们。

以上是关于Powershell:如何从 C# 代码中获取凭据?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用不同的凭据调用远程 powershell 脚本

c# - 如何在运行时从模块代码中获取 PowerShell 模块版本

从PowerShell中使用参数和凭据启动.ps1脚本并从中获取输出

在不提示的情况下在 Powershell 中获取当前用户的凭据对象

如何使用带有 powershell 的凭据获取远程计算机的每个子目录的大小?

如何从 C# 中的 powershell 脚本中捕获退出代码