无需提示即可在Powershell中获取当前用户的凭据对象

时间:2010-10-12 18:26:40

标签: powershell credentials remote-access sharpssh

我有一个Powershell脚本,它将通过针对多个服务器的自动化工具运行。它在Windows机器上运行正常,因为远程调用使用工具的服务帐户,而无需在代码中提示或公开任何凭据。该脚本还使用SharpSSH软件包通过SSH对Linux机器运行。 SharpSSH不会自动使用Powershell用户的凭据,但需要用户名和密码,RSA密钥文件或PSCredential对象。我无法使用Get-Credential提示凭据,因为它是通过自动化工具运行的。我不想在代码中公开用户名和密码,或者在那里放置一个RSA密钥。我想从当前的Powershell用户(服务帐户)构造一个PSCredential对象。尝试[System.Net.CredentialCache] :: DefaultNetworkCredentials显示空白,[System.Security.Principal.WindowsIdentity] :: GetCurrent()不提供我需要的对象或信息。

有没有人有从当前用户创建PSCredential对象的方法?或者可能是这个问题完全不同的替代方案?

非常感谢!

4 个答案:

答案 0 :(得分:14)

Windows API不会公开您需要的信息,这就是Powershell无法访问它们的原因。它是安全子系统的故意特征。这种方法的唯一方法是让Linux机器信任调用机器,例如将它们连接到Active Directory(或者真正的任何kerberos设置)。

除此之外,你需要以某种方式存储和传递这些信息。

您可以将RSA密钥存储在用户的密钥库中并在运行时(使用.NET Crypto / Keystore库)将其解压缩,因此您不会使用代码存储密钥。这样,密钥本身将受到操作系统的保护,并且仅在主叫用户通过身份验证时才可用。你还有一件事需要安装,但可能是实现你的目标的唯一方法。

答案 1 :(得分:4)

如何使用服务帐户的加密密钥加密密码?

一个简单的例子:

将PowerShell作为服务帐户运行,运行以下命令并将输出保存到文本文件(或将其嵌入计划任务调用中):

$String = '<PASSWORD>'
ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $String -AsPlainText -Force)

在计划任务中使用以下内容以解密和使用密码:

 $EncryptedString = '<ENCRYPTED PASSWORD FROM ABOVE>'
 [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $EncryptedString)))

这应该可以解决问题。但是,您不能在其他计算机上重复使用加密密码,或者如果您因任何原因破坏了本地密钥存储区:)

答案 2 :(得分:3)

由于你可以从凭证对象获得明文密码,我怀疑你可以在没有提示的情况下得到这个密码。

答案 3 :(得分:0)

“尝试[System.Net.CredentialCache] :: DefaultNetworkCredentials显示空白,并且[System.Security.Principal.WindowsIdentity] :: GetCurrent()不提供我需要的对象或信息。”

您已经有了答案。我使用它来通过几个脚本传递当前登录的用户凭据:

$Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$Username = $Credentials.UserName
$Password = $Credentials.Password

如果您尝试将它们转储到任何类型的可读输出中,则在转储它们时这些值将为空(出于明显的安全原因),但是在需要PSCredential对象的情况下它们仍然起作用。