在必须在每台用户计算机上运行的服务器上获得一个脚本,问题是实际上我已经加密了用户名/密码,我需要一种从管理员用户获取凭据(没有提示)的方法访问sql server,以便用户名和密码不会在脚本上获得“Hardcoded”,然后将活动用户的用户名作为字符串($env:username
)获取。我可以在批处理文件上使用Run As
命令来完成第一部分,但由于我的经验不足,无法获得自动化整个任务的安全解决方案。
我正在使用Invoke-SqlCmd
cmdlet来获取有关表的信息,如下所示:
Invoke-Sqlcmd -Query $query -ServerInstance $server -Username $credentials.getnetworkcredential().Username -Password $credentials.getnetworkcredential().Password -database $DB
那里的凭证是ADMIN用户的凭证。我确实加密了密码,但它可以解密。所以我需要一种使用凭证的方法,而不是将它们存储在.txt或代码中。
答案 0 :(得分:0)
我没有完全了解你在这里尝试做的事情,但我想解决一下关于powershell中的凭据的问题。
$cred = Get-Credential
$cred | Export-Clixml -Path C:\path\to\store\creds.xml
执行此操作将存储在xml文件中加密的凭据。
$cred = Import-Clixml -Path C:\path\to\store\creds.xml
这将以可用的形式从文件中读回来。
你的问题似乎是它可以被解密,这对我来说意味着你认为任何人可以成功读取和解密凭证,但事实并非如此。
使用基于用户和计算机的密钥对凭据进行加密。没有其他用户可以阅读它,并且它不会被另一台计算机上的任何用户读取。如果脚本始终由同一台计算机上的同一用户运行,那么这实际上很好。当你有多台电脑时会崩溃。
您可以使用ConvertTo-SecureString -Key $key
提供的密钥创建加密字符串,但之后您又回到原点,因为您需要将密钥存储在某处。
如果您想尝试这种方法,请查看Storing Passwords to Disk in PowerShell with Machine-key Encryption。
您也可以尝试使用cmdkey
作为凭证管理员,但您仍然必须在每台计算机上预先填充它,如果您要这样做,您可能会并为您运行它的每台机器生成一个存储的凭证文件。
如果您可以更清楚地分解工作流程,那么弄清楚如何安全地存储凭据会更容易。