Saving credentials for reuse by powershell and error ConvertTo-SecureString : Key not valid for use in specified state

前端 未结 5 2124
长情又很酷
长情又很酷 2020-11-29 07:07

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: ht

5条回答
  •  栀梦
    栀梦 (楼主)
    2020-11-29 07:48

    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:

                # Prompt you to enter the username and password
                $credObject = Get-Credential
    
                # The credObject now holds the password in a ‘securestring’ format
                $passwordSecureString = $credObject.password
    
                # Define a location to store the AESKey
                $AESKeyFilePath = “aeskey.txt”
                # Define a location to store the file that hosts the encrypted password
                $credentialFilePath = “credpassword.txt”
    
                # Generate a random AES Encryption Key.
                $AESKey = New-Object Byte[] 32
                [Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey)
    
                # Store the AESKey into a file. This file should be protected! (e.g. ACL on the file to allow only select people to read)
    
                Set-Content $AESKeyFilePath $AESKey # Any existing AES Key file will be overwritten
    
                $password = $passwordSecureString | ConvertFrom-SecureString -Key $AESKey
    
                Add-Content $credentialFilePath $password
    

    Then in your script where you need to use credentials use the following:

                #set up path and user variables
                $AESKeyFilePath = “aeskey.txt” # location of the AESKey                
                $SecurePwdFilePath = “credpassword.txt” # location of the file that hosts the encrypted password                
                $userUPN = "domain\userName" # User account login 
    
                #use key and password to create local secure password
                $AESKey = Get-Content -Path $AESKeyFilePath 
                $pwdTxt = Get-Content -Path $SecurePwdFilePath
                $securePass = $pwdTxt | ConvertTo-SecureString -Key $AESKey
    
                #crete a new psCredential object with required username and password
                $adminCreds = New-Object System.Management.Automation.PSCredential($userUPN, $securePass)
    
                #use the $adminCreds for some task
                some-Task-that-needs-credentials -Credential $adminCreds
    

    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.

提交回复
热议问题