PowerShell secret vault
The secret vault modules allow you to securely store secrets using the Windows DPAPI to
keep a byte[], string, SecureString, pscredential, or hashtable to be able to access later.
It also allows annotating secrets with a hashtable of string names to values of type string, int,
or datetime, so you can provide context like where the secret is used, how to update it, when it
was generated, or when it expires.
Installing and setting up
You probably just want a single store with a simple name.
There are a number of configuration options you can set with Set-SecretStoreConfiguration,
which you may want to investigate fully to use effectively for automation, or to fit whatever your needs are for your environment.
$VaultName = 'SecretVault' # whatever name you want
Install-Module Microsoft.PowerShell.SecretManagement,Microsoft.PowerShell.SecretStore -Force
Register-SecretVault -Name $VaultName -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
Set-SecretStoreConfiguration -Interaction Prompt
Test-SecretVault $VaultName
Setting a secret
All you really need to save is a name and a value, but providing more context may save you some effort later.
# assuming the secret is currently on the clipboard
Set-Secret -Name GitHubToken -Secret "$(Get-Clipboard)" -Vault $VaultName -Metadata @{
Description = 'A GitHub classic token'
TokenName = 'PowerShell token'
Url = 'https://github.com/settings/tokens'
Generated = Get-Date
Expires = (Get-Date).AddDays(90)
}
Listing secrets
You can also specify a vault name if you have more than one.
Get-SecretInfo
Getting a secret value
You'll also need to provide the vault name if there are secrets with the same name in separate vaults.
# to get the encrypted value, when you can use a secure string or pscredential, &c
$value = Get-Secret -Name $secretname
# to get the unencrypted value, if you have to use a plaintext string, &c
$value = Get-Secret -Name $secretname -AsPlainText
Getting a secret's metadata
You'll also need to provide the vault name if there are secrets with the same name in separate vaults.
Get-SecretInfo -Name $secretname |Select-Object -ExpandProperty Metadata
Deleting a secret
Remove-Secret -Name $secretname -Vault $VaultName