Publish Pre-release #1
69
src/Store/Get-CredentialStore.ps1
Normal file
69
src/Store/Get-CredentialStore.ps1
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
function Get-CredentialStore {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Reads the complete content of the credential store and returns it as a new object.
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
The content is in a raw format. It means there is no transformation to the different credential types.
|
||||||
|
You can not use the object properties to connect with remote host. Therefore please use
|
||||||
|
Get-CredentialStoreItem.
|
||||||
|
|
||||||
|
.PARAMETER Path
|
||||||
|
Define a custom path to a shared CredentialStore.
|
||||||
|
|
||||||
|
.PARAMETER Shared
|
||||||
|
Switch to shared mode with this param. This enforces the command to work with a shared CredentialStore which
|
||||||
|
can be decrypted across systems.
|
||||||
|
|
||||||
|
.INPUTS
|
||||||
|
[None]
|
||||||
|
|
||||||
|
.OUTPUTS
|
||||||
|
[PSObject] Returns the credential store content as PSObject.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
$CSContent = Get-CredentialStore -Path "C:\TMP\mystore.json"
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
File Name : Get-CredentialStore.ps1
|
||||||
|
Author : Marco Blessing - marco.blessing@googlemail.com
|
||||||
|
Requires :
|
||||||
|
|
||||||
|
.LINK
|
||||||
|
https://github.com/OCram85/PSCredentialStore
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = "Private")]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $false, ParameterSetName = "Shared")]
|
||||||
|
[string]$Path = "{0}\PSCredentialStore\CredentialStore.json" -f $env:ProgramData,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $false, ParameterSetName = "Shared")]
|
||||||
|
[switch]$Shared
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($PSCmdlet.ParameterSetName -eq 'Private') {
|
||||||
|
$Path = "{0}\CredentialStore.json" -f $env:APPDATA
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Test-CredentialStore -Path $Path) {
|
||||||
|
try {
|
||||||
|
$FileContent = Get-Content -Path $Path -Raw
|
||||||
|
ConvertFrom-Json $FileContent
|
||||||
|
}
|
||||||
|
catch [System.Exception] {
|
||||||
|
$MessageParams = @{
|
||||||
|
Message = "Unknown CredentialStore format. Invalid JSON file."
|
||||||
|
ErrorAction = "Stop"
|
||||||
|
}
|
||||||
|
Write-Error @MessageParams
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$MessageParams = @{
|
||||||
|
Message = "Could not find the CredentialStore."
|
||||||
|
ErrorAction = "Stop"
|
||||||
|
}
|
||||||
|
Write-Error @MessageParams
|
||||||
|
}
|
||||||
|
}
|
111
src/Store/New-CredentialStore.ps1
Normal file
111
src/Store/New-CredentialStore.ps1
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
function New-CredentialStore {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Creates a new credential store File
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
You need to run this script first to create a new credential store before you try to
|
||||||
|
save new credentials with New-CredentialStoreItem.
|
||||||
|
|
||||||
|
.PARAMETER Path
|
||||||
|
Define a location for the new shared CredentialStore. The default store will be created in
|
||||||
|
$Env:ProgramData\PSCredentialStore dir.
|
||||||
|
|
||||||
|
.PARAMETER Shared
|
||||||
|
Creates a CredentialStore in the Shared mode. This enables you to read the CredentialStore Items on
|
||||||
|
different systems or profiles. In addition you can optionally provide a custom path wit the -Path parameter.
|
||||||
|
|
||||||
|
.PARAMETER Force
|
||||||
|
Use this switch to reset an existing store. The complete content will be wiped.
|
||||||
|
|
||||||
|
.INPUTS
|
||||||
|
[None]
|
||||||
|
|
||||||
|
.OUTPUTS
|
||||||
|
[None]
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
New-CredentialStore
|
||||||
|
# Creates a new private CredentialStore
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
New-CredentialStore -Force
|
||||||
|
# Resets an existing private CredentialStore
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
New-CredentialStore -Shared
|
||||||
|
# Creates a new shead CredentialStore
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
New-CredentialStore -Shared -Path "C:\TMP\CredentialStore.json"
|
||||||
|
# Creates a new shared CredentialStore in the given location.
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
File Name : New-CredentialStore.ps1
|
||||||
|
Author : Marco Blessing - marco.blessing@googlemail.com
|
||||||
|
Requires :
|
||||||
|
|
||||||
|
.LINK
|
||||||
|
https://github.com/OCram85/PSCredentialStore
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding(DefaultParameterSetName = "Private")]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $false, ParameterSetName = "Shared")]
|
||||||
|
[switch]$Shared,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $false, ParameterSetName = "Shared")]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string]$Path = "{0}\PSCredentialStore\CredentialStore.json" -f $env:ProgramData,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $false, ParameterSetName = "Private")]
|
||||||
|
[Parameter(Mandatory = $false, ParameterSetName = "Shared")]
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
# Lets get the current Date in a human readable format.
|
||||||
|
$CurrentDate = Get-Date -UFormat "%Y-%m-%d %H:%M:%S"
|
||||||
|
|
||||||
|
# Set latest Credential Store version
|
||||||
|
Set-Variable -Name "CSVersion" -Value "1.2.0" -Option Constant
|
||||||
|
|
||||||
|
# Set the CredentialStore path for private mode.
|
||||||
|
Write-Debug ("ParameterSetName: {0}" -f $PSCmdlet.ParameterSetName)
|
||||||
|
if ($PSCmdlet.ParameterSetName -eq "Private") {
|
||||||
|
$Path = "{0}\CredentialStore.json" -f $Env:APPDATA
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test if in the given store already a CredentialStore exists.
|
||||||
|
Write-Verbose "Test if there is already a credential store."
|
||||||
|
if ((Test-CredentialStore -Path $Path) -and ($Force -ne $true)) {
|
||||||
|
$MessageParam = @{
|
||||||
|
Message = "The given file already exists. Use the 'Force' switch to override the existing store."
|
||||||
|
ErrorAction = "Stop"
|
||||||
|
}
|
||||||
|
Write-Error @MessageParam
|
||||||
|
}
|
||||||
|
# We need to use the IDictionary to keep the property sorting in the object.
|
||||||
|
$ObjProperties = [ordered]@{
|
||||||
|
Version = $CSVersion
|
||||||
|
Creation = $CurrentDate
|
||||||
|
}
|
||||||
|
if ($PSCmdlet.ParameterSetName -eq "Shared") {
|
||||||
|
$ObjProperties.Type = "Shared"
|
||||||
|
# Check if a ChallengeFile already exists. We don't want to overide it.
|
||||||
|
# Otherwise previous created CredentialStores couln't be decrypted anymore.
|
||||||
|
if (-not (Test-ChallengeFile)) {
|
||||||
|
Set-ChallengeFile
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$ObjProperties.Type = "Private"
|
||||||
|
}
|
||||||
|
# Create a new object for easy conversion into a json file
|
||||||
|
$CredentialStoreObj = New-Object -TypeName psobject -Property $ObjProperties
|
||||||
|
try {
|
||||||
|
ConvertTo-Json -InputObject $CredentialStoreObj | Out-File -FilePath $Path
|
||||||
|
}
|
||||||
|
catch [System.Exception] {
|
||||||
|
$_.Exception | Format-List -Force | Out-String | Write-Error -ErrorAction Stop
|
||||||
|
}
|
||||||
|
}
|
61
src/Store/Test-CredentialStore.ps1
Normal file
61
src/Store/Test-CredentialStore.ps1
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
function Test-CredentialStore {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Returns the credential store state.
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Use this script to test your credential store. For now it only checks if
|
||||||
|
the file exists.
|
||||||
|
|
||||||
|
.PARAMETER Path
|
||||||
|
Define a custom path to a shared CredentialStore.
|
||||||
|
|
||||||
|
.PARAMETER Shared
|
||||||
|
Switch to shared mode with this param. This enforces the command to work with a shared CredentialStore which
|
||||||
|
can be decrypted across systems.
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
File Name : Test-CredentialStore.ps1
|
||||||
|
Author : Marco Blessing - marco.blessing@googlemail.com
|
||||||
|
Requires :
|
||||||
|
|
||||||
|
.LINK
|
||||||
|
https://github.com/OCram85/PSCredentialStore
|
||||||
|
#>
|
||||||
|
[CmdletBinding(DefaultParameterSetName = "Private")]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $false, ParameterSetName = "Shared")]
|
||||||
|
[string]$Path = "{0}\PSCredentialStore\CredentialStore.json" -f $env:ProgramData,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $false, ParameterSetName = "Shared")]
|
||||||
|
[switch]$Shared
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if ($PSCmdlet.ParameterSetName -eq "Private") {
|
||||||
|
$Path = "{0}\CredentialStore.json" -f $Env:APPDATA
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set latest Credential Store version
|
||||||
|
Set-Variable -Name "CSVersion" -Value "1.2.0" -Option Constant
|
||||||
|
|
||||||
|
if (Test-Path $Path) {
|
||||||
|
Write-Verbose "CredentialStore in given path found."
|
||||||
|
|
||||||
|
# try tor read the store. Removed the Get-CredentialStore function to avoid recursive calls.
|
||||||
|
try {
|
||||||
|
$FileContent = Get-Content -Path $Path -Raw
|
||||||
|
$CSContent = ConvertFrom-Json $FileContent
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Warning "Could not read or convert the given CredentialStore."
|
||||||
|
Return $False
|
||||||
|
}
|
||||||
|
Return $True
|
||||||
|
|
||||||
|
}
|
||||||
|
Else {
|
||||||
|
Write-Verbose "The given CredentialStore does not exist!"
|
||||||
|
Return $False
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user