保存凭据以通过PowerShell和错误转换为安全:密钥不适合在指定状态
我正在做类似本文中描述的事情,以将凭据保存在安全文件中,以便我们的自动化过程可以使用它来通过Invoke-Command运行远程PS脚本: http ://blogs.technet.com/b/robcost/archive/2008/05/01/powershell-tip-storing-and-us---usis-password-credentials.aspx
当我在我的帐户下运行此运行时,这很有效 - 密码是从加密文件中读取的,传递给命令命令,一切都很好。
今天,当我的脚本为其黄金时间准备好时,我尝试在Windows帐户下运行它,该帐户将被自动化过程使用,并在我的脚本试图从文件中读取安全密码的情况下在下面收到此错误:
ConvertTo-SecureString : Key not valid for use in specified state.
At \\remoted\script.ps1:210 char:87
+ $password = get-content $PathToFolderWithCredentials\pass.txt | convertto-sec
urestring <<<<
+ CategoryInfo : InvalidArgument: (:) [ConvertTo-SecureString], C
ryptographicException
+ FullyQualifiedErrorId : ImportSecureString_InvalidArgument_Cryptographic
Error,Microsoft.PowerShell.Commands.ConvertToSecureStringCommand
要求我的同事运行在他的帐户下,他遇到了同样的错误。
这是我用来保存凭据的代码:
$PathToFolderWithCredentials = "\\path\removed"
write-host "Enter login as domain\login:"
read-host | out-file $PathToFolderWithCredentials\login.txt
write-host "Enter password:"
read-host -assecurestring | convertfrom-securestring | out-file $PathToFolderWithCredentials\pass.txt
write-host "*** Credentials have been saved to $pathtofolder ***"
这是脚本中的代码,该代码由自动化过程运行以读取它们在Invoke-command中使用:
$login= get-content $PathToFolderWithCredentials\login.txt
$password = get-content $PathToFolderWithCredentials\pass.txt | convertto-securestring
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $login,$password
错误发生在行$ password = get-content $ pathToFolderWithCredentials \ pass.txt |转换
有什么想法?
I was doing something like described in this post to save credentials in a secured file so our automated process can use that to run remote PS scripts via Invoke-command:
http://blogs.technet.com/b/robcost/archive/2008/05/01/powershell-tip-storing-and-using-password-credentials.aspx
This works great when I run this under my account - password is read from encrypted file, passed to Invoke-command and everything is fine.
Today, when my script was ready for its prime time, I tried to run it under windows account that will be used by automated process and got this error below while my script was trying to read secured password from a file:
ConvertTo-SecureString : Key not valid for use in specified state.
At \\remoted\script.ps1:210 char:87
+ $password = get-content $PathToFolderWithCredentials\pass.txt | convertto-sec
urestring <<<<
+ CategoryInfo : InvalidArgument: (:) [ConvertTo-SecureString], C
ryptographicException
+ FullyQualifiedErrorId : ImportSecureString_InvalidArgument_Cryptographic
Error,Microsoft.PowerShell.Commands.ConvertToSecureStringCommand
Asked my workmate to run under his account and he got the same error.
This is the code I am using to save credentials:
$PathToFolderWithCredentials = "\\path\removed"
write-host "Enter login as domain\login:"
read-host | out-file $PathToFolderWithCredentials\login.txt
write-host "Enter password:"
read-host -assecurestring | convertfrom-securestring | out-file $PathToFolderWithCredentials\pass.txt
write-host "*** Credentials have been saved to $pathtofolder ***"
This is the code in the script to run by automated process to read them to use in Invoke-command:
$login= get-content $PathToFolderWithCredentials\login.txt
$password = get-content $PathToFolderWithCredentials\pass.txt | convertto-securestring
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $login,$password
Error happens on line $password = get-content $PathToFolderWithCredentials\pass.txt | convertto-securestring
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您必须在同一台计算机上创建密码字符串,并且使用与运行它相同的登录名。
You have to create the password string on the same computer and with the same login that you will use to run it.
convertfrom-securestring
采用键
(securekey
)参数。您可以指定保存加密标准字符串的键,然后在convertto-securestring
中再次使用键以恢复安全字符串,而与用户帐户无关。http://technet.microsoft.microsoft.com/en-us/en-us/library/library/library/dd31556.aspx
在一个项目中,我实施了不对称的加密,人们使用公共密钥对密码进行加密,并且自动化过程具有解密密码的私钥:自动部署中生产配置中的处理密码
ConvertFrom-SecureString
takes aKey
( andSecureKey
) parameter. You can specify the key to save the encrypted standard string and then use the key again inConvertTo-SecureString
to get back the secure string, irrespective of the user account.http://technet.microsoft.com/en-us/library/dd315356.aspx
In a project, I have implemented asymmetric encryption, whereby people encrypt the password using the public key and the automation process has the private key to decrypt passwords: Handling passwords in production config for automated deployment
以下将允许将凭据保存为文件,然后由其他用户运行的另一个脚本使用这些凭据。
该代码摘自David Lee发表的一篇很棒的文章,只有我自己的一些较小的调整 https://blog.kloud.com.au/2016/04/21/ususe-saved-credentials-securelys-securely-in-powershell-scripts/
第一步是使用AE将AA安全密码保存到文件。以下将作为独立脚本运行:
然后在您需要使用凭据的脚本中使用以下内容:
请注意,如果用户可以访问密码文件和密钥文件,他们可以解密该密码的密码用户。
The below will allow credentials to be saved as a file, then those credentials to be used by another script being run by a different user, remotely.
The code was taken from a great article produced by David Lee, with only some minor adjustments from myself https://blog.kloud.com.au/2016/04/21/using-saved-credentials-securely-in-powershell-scripts/
First step is to save a a secure password to a file using AES. The below will run as a stand alone script:
Then in your script where you need to use credentials use the following:
Please be aware that if the user can get access to the password file and the key file, they can decrypt the password for the user.
另一种方法是使用范围“ LocalMachine”而不是“ Currentuser”来保护数据,而“ Currentuser”是转换式搜索的范围。
加密的字符串可以通过使用范围“ CurrentUser”的转换式搜索来使用。
Another approach would be to protect the data using scope 'LocalMachine' instead of 'CurrentUser' which is the one used by ConvertFrom-SecureString.
The encrypted string can be used by ConvertTo-SecureString which is using scope 'CurrentUser'.
假设您有一个已知的n个用户列表,这些用户将使用凭据(例如,一个开发人员
userme
和System/Service用户Usersys ),则可以(将这些用户获取)制作
pass.txt
文件的n副本:每个用户一个。因此,
userx
的密码将导致Eg 2*。pass.txt
文件:userx.userme.pass.txt
userx。 userys.pass.txt
userme想要读取的信用时,他/她读
userx.userme.pass.txt
等。Assuming you have a known list of N users who will use the credentials (e.g. one developer
userMe
and a system/service useruserSys
) you can just (get those users to) make N copies of thepass.txt
file: one for each user.So the password of
userX
will result in e.g. 2*.pass.txt
files:userX.userMe.pass.txt
userX.userSys.pass.txt
When userMe wants the creds he/she reads
userX.userMe.pass.txt
etc.