diff --git a/Download-MCRA/__pycache__/Mcra90ApiLib.cpython-37.pyc b/Download-MCRA/__pycache__/Mcra90ApiLib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51371ac16b12b9345a3ade0ad45eee7445a3a9a5 Binary files /dev/null and b/Download-MCRA/__pycache__/Mcra90ApiLib.cpython-37.pyc differ diff --git a/Powershell/.gitkeep b/Powershell/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Powershell/MCRA.Tools/.gitkeep b/Powershell/MCRA.Tools/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Powershell/MCRA.Tools/Command-Credential.ps1 b/Powershell/MCRA.Tools/Command-Credential.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d495aa7e175c2225512873320b09f44e4957bc39 --- /dev/null +++ b/Powershell/MCRA.Tools/Command-Credential.ps1 @@ -0,0 +1,1020 @@ +# +# +# Aangepast door HH, om meer in lijn met de standaard Piece naamgeving te komen. +# dd 06-11-2016 +# Enum-Creds -> Read-Credential (gecombineerd) +# Read-Creds -> Read-Credential +# Del-Creds -> Clear-Credential +# Write-Creds -> Write-Credential +# Read-Creds -> Get-Credential (geeft PSCredential object) +# Write-Creds -> Set-Credential (gebruikt PSCredential object) +# + +# Author: Jim Harrison (jim@isatools.org) +# Date : 2012/05/20 +# Vers : 1.5 + +# * I STRONGLY recommend that you become familiar +# * with http://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx +# * before you create new credentials with -CredType other than "GENERIC" + +# http://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx +# http://stackoverflow.com/questions/7162604/get-cached-credentials-in-powershell-from-windows-7-credential-manager +# http://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx +# http://blogs.msdn.com/b/peerchan/archive/2005/11/01/487834.aspx + + +# De C-code om toegang te krijgen. +[String] $PsCredmanUtils = @" +using System; +using System.Runtime.InteropServices; + +namespace PsUtils +{ + public class CredMan + { + #region Imports + // DllImport derives from System.Runtime.InteropServices + [DllImport("Advapi32.dll", SetLastError = true, EntryPoint = "CredDeleteW", CharSet = CharSet.Unicode)] + private static extern bool CredDeleteW([In] string target, [In] CRED_TYPE type, [In] int reservedFlag); + + [DllImport("Advapi32.dll", SetLastError = true, EntryPoint = "CredEnumerateW", CharSet = CharSet.Unicode)] + private static extern bool CredEnumerateW([In] string Filter, [In] int Flags, out int Count, out IntPtr CredentialPtr); + + [DllImport("Advapi32.dll", SetLastError = true, EntryPoint = "CredFree")] + private static extern void CredFree([In] IntPtr cred); + + [DllImport("Advapi32.dll", SetLastError = true, EntryPoint = "CredReadW", CharSet = CharSet.Unicode)] + private static extern bool CredReadW([In] string target, [In] CRED_TYPE type, [In] int reservedFlag, out IntPtr CredentialPtr); + + [DllImport("Advapi32.dll", SetLastError = true, EntryPoint = "CredWriteW", CharSet = CharSet.Unicode)] + private static extern bool CredWriteW([In] ref Credential userCredential, [In] UInt32 flags); + #endregion + + #region Fields + public enum CRED_FLAGS : uint + { + NONE = 0x0, + PROMPT_NOW = 0x2, + USERNAME_TARGET = 0x4 + } + + public enum CRED_ERRORS : uint + { + ERROR_SUCCESS = 0x0, + ERROR_INVALID_PARAMETER = 0x80070057, + ERROR_INVALID_FLAGS = 0x800703EC, + ERROR_NOT_FOUND = 0x80070490, + ERROR_NO_SUCH_LOGON_SESSION = 0x80070520, + ERROR_BAD_USERNAME = 0x8007089A + } + + public enum CRED_PERSIST : uint + { + SESSION = 1, + LOCAL_MACHINE = 2, + ENTERPRISE = 3 + } + + public enum CRED_TYPE : uint + { + GENERIC = 1, + DOMAIN_PASSWORD = 2, + DOMAIN_CERTIFICATE = 3, + DOMAIN_VISIBLE_PASSWORD = 4, + GENERIC_CERTIFICATE = 5, + DOMAIN_EXTENDED = 6, + MAXIMUM = 7, // Maximum supported cred type + MAXIMUM_EX = (MAXIMUM + 1000), // Allow new applications to run on old OSes + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct Credential + { + public CRED_FLAGS Flags; + public CRED_TYPE Type; + public string TargetName; + public string Comment; + public DateTime LastWritten; + public UInt32 CredentialBlobSize; + public string CredentialBlob; + public CRED_PERSIST Persist; + public UInt32 AttributeCount; + public IntPtr Attributes; + public string TargetAlias; + public string UserName; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct NativeCredential + { + public CRED_FLAGS Flags; + public CRED_TYPE Type; + public IntPtr TargetName; + public IntPtr Comment; + public System.Runtime.InteropServices.ComTypes.FILETIME LastWritten; + public UInt32 CredentialBlobSize; + public IntPtr CredentialBlob; + public UInt32 Persist; + public UInt32 AttributeCount; + public IntPtr Attributes; + public IntPtr TargetAlias; + public IntPtr UserName; + } + #endregion + + #region Child Class + private class CriticalCredentialHandle : Microsoft.Win32.SafeHandles.CriticalHandleZeroOrMinusOneIsInvalid + { + public CriticalCredentialHandle(IntPtr preexistingHandle) + { + SetHandle(preexistingHandle); + } + + private Credential XlateNativeCred(IntPtr pCred) + { + NativeCredential ncred = (NativeCredential)Marshal.PtrToStructure(pCred, typeof(NativeCredential)); + Credential cred = new Credential(); + cred.Type = ncred.Type; + cred.Flags = ncred.Flags; + cred.Persist = (CRED_PERSIST)ncred.Persist; + + long LastWritten = ncred.LastWritten.dwHighDateTime; + LastWritten = (LastWritten << 32) + ncred.LastWritten.dwLowDateTime; + cred.LastWritten = DateTime.FromFileTime(LastWritten); + + cred.UserName = Marshal.PtrToStringUni(ncred.UserName); + cred.TargetName = Marshal.PtrToStringUni(ncred.TargetName); + cred.TargetAlias = Marshal.PtrToStringUni(ncred.TargetAlias); + cred.Comment = Marshal.PtrToStringUni(ncred.Comment); + cred.CredentialBlobSize = ncred.CredentialBlobSize; + if (0 < ncred.CredentialBlobSize) + { + cred.CredentialBlob = Marshal.PtrToStringUni(ncred.CredentialBlob, (int)ncred.CredentialBlobSize / 2); + } + return cred; + } + + public Credential GetCredential() + { + if (IsInvalid) + { + throw new InvalidOperationException("Invalid CriticalHandle!"); + } + Credential cred = XlateNativeCred(handle); + return cred; + } + + public Credential[] GetCredentials(int count) + { + if (IsInvalid) + { + throw new InvalidOperationException("Invalid CriticalHandle!"); + } + Credential[] Credentials = new Credential[count]; + IntPtr pTemp = IntPtr.Zero; + for (int inx = 0; inx < count; inx++) + { + pTemp = Marshal.ReadIntPtr(handle, inx * IntPtr.Size); + Credential cred = XlateNativeCred(pTemp); + Credentials[inx] = cred; + } + return Credentials; + } + + override protected bool ReleaseHandle() + { + if (IsInvalid) + { + return false; + } + CredFree(handle); + SetHandleAsInvalid(); + return true; + } + } + #endregion + + #region Custom API + public static int CredDelete(string target, CRED_TYPE type) + { + if (!CredDeleteW(target, type, 0)) + { + return Marshal.GetHRForLastWin32Error(); + } + return 0; + } + + public static int CredEnum(string Filter, out Credential[] Credentials) + { + int count = 0; + int Flags = 0x0; + if (string.IsNullOrEmpty(Filter) || + "*" == Filter) + { + Filter = null; + if (6 <= Environment.OSVersion.Version.Major) + { + Flags = 0x1; //CRED_ENUMERATE_ALL_CREDENTIALS; only valid is OS >= Vista + } + } + IntPtr pCredentials = IntPtr.Zero; + if (!CredEnumerateW(Filter, Flags, out count, out pCredentials)) + { + Credentials = null; + return Marshal.GetHRForLastWin32Error(); + } + CriticalCredentialHandle CredHandle = new CriticalCredentialHandle(pCredentials); + Credentials = CredHandle.GetCredentials(count); + return 0; + } + + public static int CredRead(string target, CRED_TYPE type, out Credential Credential) + { + IntPtr pCredential = IntPtr.Zero; + Credential = new Credential(); + if (!CredReadW(target, type, 0, out pCredential)) + { + return Marshal.GetHRForLastWin32Error(); + } + CriticalCredentialHandle CredHandle = new CriticalCredentialHandle(pCredential); + Credential = CredHandle.GetCredential(); + return 0; + } + + public static int CredWrite(Credential userCredential) + { + if (!CredWriteW(ref userCredential, 0)) + { + return Marshal.GetHRForLastWin32Error(); + } + return 0; + } + + #endregion + + private static int AddCred() + { + Credential Cred = new Credential(); + string Password = "Password"; + Cred.Flags = 0; + Cred.Type = CRED_TYPE.GENERIC; + Cred.TargetName = "Target"; + Cred.UserName = "UserName"; + Cred.AttributeCount = 0; + Cred.Persist = CRED_PERSIST.ENTERPRISE; + Cred.CredentialBlobSize = (uint)Password.Length; + Cred.CredentialBlob = Password; + Cred.Comment = "Comment"; + return CredWrite(Cred); + } + + private static bool CheckError(string TestName, CRED_ERRORS Rtn) + { + switch(Rtn) + { + case CRED_ERRORS.ERROR_SUCCESS: + Console.WriteLine(string.Format("'{0}' worked", TestName)); + return true; + case CRED_ERRORS.ERROR_INVALID_FLAGS: + case CRED_ERRORS.ERROR_INVALID_PARAMETER: + case CRED_ERRORS.ERROR_NO_SUCH_LOGON_SESSION: + case CRED_ERRORS.ERROR_NOT_FOUND: + case CRED_ERRORS.ERROR_BAD_USERNAME: + Console.WriteLine(string.Format("'{0}' failed; {1}.", TestName, Rtn)); + break; + default: + Console.WriteLine(string.Format("'{0}' failed; 0x{1}.", TestName, Rtn.ToString("X"))); + break; + } + return false; + } + + /* + * Note: the Main() function is primarily for debugging and testing in a Visual + * Studio session. Although it will work from PowerShell, it's not very useful. + */ + public static void Main() + { + Credential[] Creds = null; + Credential Cred = new Credential(); + int Rtn = 0; + + Console.WriteLine("Testing CredWrite()"); + Rtn = AddCred(); + if (!CheckError("CredWrite", (CRED_ERRORS)Rtn)) + { + return; + } + Console.WriteLine("Testing CredEnum()"); + Rtn = CredEnum(null, out Creds); + if (!CheckError("CredEnum", (CRED_ERRORS)Rtn)) + { + return; + } + Console.WriteLine("Testing CredRead()"); + Rtn = CredRead("Target", CRED_TYPE.GENERIC, out Cred); + if (!CheckError("CredRead", (CRED_ERRORS)Rtn)) + { + return; + } + Console.WriteLine("Testing CredDelete()"); + Rtn = CredDelete("Target", CRED_TYPE.GENERIC); + if (!CheckError("CredDelete", (CRED_ERRORS)Rtn)) + { + return; + } + Console.WriteLine("Testing CredRead() again"); + Rtn = CredRead("Target", CRED_TYPE.GENERIC, out Cred); + if (!CheckError("CredRead", (CRED_ERRORS)Rtn)) + { + Console.WriteLine("if the error is 'ERROR_NOT_FOUND', this result is OK."); + } + } + } +} +"@ + +$PsCredMan = $null +try +{ + $PsCredMan = [PsUtils.CredMan] +} +catch +{ + #only remove the error we generate + if ( $Error.Count -gt 1 ){ + $Error.RemoveAt($Error.Count-1) + } +} +if($null -eq $PsCredMan) +{ + Add-Type $PsCredmanUtils +} + +#region Internal Tools +[HashTable] $ErrorCategory = @{0x80070057 = "InvalidArgument"; + 0x800703EC = "InvalidData"; + 0x80070490 = "ObjectNotFound"; + 0x80070520 = "SecurityError"; + 0x8007089A = "SecurityError"} + +# Interne functies: +function Get-CredType +{ + Param + ( + [Parameter(Mandatory=$true)][ValidateSet( "GENERIC", + "DOMAIN_PASSWORD", + "DOMAIN_CERTIFICATE", + "DOMAIN_VISIBLE_PASSWORD", + "GENERIC_CERTIFICATE", + "DOMAIN_EXTENDED", + "MAXIMUM", + "MAXIMUM_EX")][String] $CredType + ) + + switch($CredType) + { + "GENERIC" {return [PsUtils.CredMan+CRED_TYPE]::GENERIC} + "DOMAIN_PASSWORD" {return [PsUtils.CredMan+CRED_TYPE]::DOMAIN_PASSWORD} + "DOMAIN_CERTIFICATE" {return [PsUtils.CredMan+CRED_TYPE]::DOMAIN_CERTIFICATE} + "DOMAIN_VISIBLE_PASSWORD" {return [PsUtils.CredMan+CRED_TYPE]::DOMAIN_VISIBLE_PASSWORD} + "GENERIC_CERTIFICATE" {return [PsUtils.CredMan+CRED_TYPE]::GENERIC_CERTIFICATE} + "DOMAIN_EXTENDED" {return [PsUtils.CredMan+CRED_TYPE]::DOMAIN_EXTENDED} + "MAXIMUM" {return [PsUtils.CredMan+CRED_TYPE]::MAXIMUM} + "MAXIMUM_EX" {return [PsUtils.CredMan+CRED_TYPE]::MAXIMUM_EX} + } +} + +function Get-CredPersist +{ + Param + ( + [Parameter(Mandatory=$true)][ValidateSet("SESSION", + "LOCAL_MACHINE", + "ENTERPRISE")][String] $CredPersist + ) + + switch($CredPersist) + { + "SESSION" {return [PsUtils.CredMan+CRED_PERSIST]::SESSION} + "LOCAL_MACHINE" {return [PsUtils.CredMan+CRED_PERSIST]::LOCAL_MACHINE} + "ENTERPRISE" {return [PsUtils.CredMan+CRED_PERSIST]::ENTERPRISE} + } +} + +# Functies die geexporteerd worden: + +Function Clear-Credential { +<# +.SYNOPSIS +Verwijdert credentials uit de Windows Credential store. + +.DESCRIPTION +Verwijdert credentials uit de Windows Credential store, d.m.v. een calls +naar Win32 CredDeleteW via [PsUtils.CredMan]::CredDelete. + +.PARAMETER Target +Het doelnaam van de credential, in de credentialstore. + +.PARAMETER Type +Het type credential; standaard "GENERIC". Mogelijke waarden zijn: +GENERIC, DOMAIN_PASSWORD, DOMAIN_CERTIFICATE, DOMAIN_VISIBLE_PASSWORD, +GENERIC_CERTIFICATE, DOMAIN_EXTENDED, MAXIMUM, MAXIMUM_EX. + +.PARAMETER Credential +Via de pipeline kun je ook een CredMan+Credential object doorgeven, +zodat je dit commando 'achter' bijvoorbeeld Read-Credential kunt zetten. + +.EXAMPLE +Clear-Credential -Target 'iets' +Verwijdert de credentials met targetname 'iets' en Type 'GENERIC'. + +.EXAMPLE +Read-Credential | Clear-Credential +Verwijdert alle Windows credentials. + +.INPUTS +[PsUtils.CredMan+Credential] + +.OUTPUTS +[Management.Automation.ErrorRecord] by een fout. + +.NOTES + Naam: Clear-Credential + Auteur: Jim Harrison (jim@isatools.org) + Bron: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Credentials-d44c3cde + Wijzigingen: 20-05-2012 Jim Harrison 1.5 Van Internet + 14-09-2016 HH 1.6 Aanpassingen om er een module van te maken; + Namen van de functies aangepast, meer in lijn + met Powershell. + 10-11-2016 HH 1.7 Verdere aanpassingen aan naamgeving en output objecten + Input via pipeline, teksten vertaald, twee parametersets + gemaakt. + 24-08-2017 HH 1.8 TargetName als positionele parameter aangemaakt. + 24-08-2018 HH 1.9 Aangepast aan nieuwe scriptsjabloon + +#> + + [CmdletBinding( + SupportsShouldProcess = $True, + DefaultParameterSetName='SeparateFields' + )] + Param( + [Parameter(Mandatory=$true,ParameterSetName='SeparateFields',Position=1)] + [ValidateLength(1,32767)] + [String] $TargetName, + [Parameter(Mandatory=$false,ParameterSetName='SeparateFields')] + [ValidateSet("GENERIC", + "DOMAIN_PASSWORD", + "DOMAIN_CERTIFICATE", + "DOMAIN_VISIBLE_PASSWORD", + "GENERIC_CERTIFICATE", + "DOMAIN_EXTENDED", + "MAXIMUM", + "MAXIMUM_EX")] + [String] $Type = "GENERIC", + [Parameter(ValueFromPipeline=$True,ParameterSetName='FieldsInObject')] + [PsUtils.CredMan+Credential[]] $Credential + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value "1.9" -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Version $versie + + } # Einde BEGIN + PROCESS { + if ( $PSCmdlet.ParameterSetName -eq 'SeparateFields' ) { + # Er worden losse parameters doorgegeven. Even een array-object van maken. + [PsUtils.CredMan+Credential] $Credential = New-Object PsUtils.CredMan+Credential + $Credential.TargetName=$TargetName + $Credential.Type=$Type + } + ForEach ( $cred in $Credential ) { + [Int] $Results = 0 + if ($pscmdlet.ShouldProcess($cred.TargetName, "Credentials zouden worden verwijderd.")) { + try { + $Results = [PsUtils.CredMan]::CredDelete($cred.TargetName, $(Get-CredType $cred.Type)) + } + catch { + Write-Warning " [WARN ] $($MyInvocation.MyCommand) Fout bij het verwijderen van credentials $($cred.TargetName), namelijk $($_.Exception.Message)." + } + } + } + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} + +Function Read-Credential { +<# +.SYNOPSIS +Haalt de credentials op uit de Windows Credential store. + +.DESCRIPTION +Haalt de credentials op uit de Credential store, via een calls naar Win32 +CredEnumerateW via [PsUtils.CredMan]::CredEnum. + +.PARAMETER TargetName +De naam van de credential. + +.EXAMPLE +Read-Credential -TargetName 'EFSA' +Haalt de credential gegevens op van 'EFSA'. + +.EXAMPLE +Read-Credential | Clear-Credential +Verwijdert alle Windows credentials. + +.EXAMPLE +Read-Credential|Format-Table -View password +Geeft de wachtwoorden in platte tekst weer, voor zover mogelijk. + +.EXAMPLE +Read-Credential|Select * +Geeft alle velden weer, dus ook de wachtwoorden. + +.EXAMPLE +(Read-Credential).CredentialBlob +Geeft alle wachtwoorden weer, zoals die zijn opgeslagen. + +.EXAMPLE +[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR(((read-credential 'EFSA').CredentialBlob|ConvertTo-SecureString))) +Als het wachtwoord als secure is opgeslagen, wordt het vertaald naar platte tekst. + +.INPUTS + +.OUTPUTS +[PsUtils.CredMan+Credential[]] na succes. +[Management.Automation.ErrorRecord] bij fout. + +.NOTES + Naam: Read-Credential + Auteur: Jim Harrison (jim@isatools.org) + Bron: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Credentials-d44c3cde + Wijzigingen: 20-05-2012 Jim Harrison 1.5 Van Internet + 14-09-2016 HH Aanpassingen om er een module van te maken; + Namen van de functies aangepast, meer in lijn + met Powershell. + 10-11-2016 HH 1.7 Verdere aanpassingen zodat het script volledig in lijn + is met scripts. Help in nederlands vertaald. + 24-08-2017 HH 1.8 Parameter positional gemaakt, zodat default de TargetName kan worden gebruikt. + 24-08-2018 HH 1.9 Aangepast aan nieuwe scriptsjabloon + +#> + +# +# (c) WUR +# Pas het versienummer hieronder en hierboven aan als je iets wijzigt. +# Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. +# + [OutputType('PsUtils.CredMan+Credential')] + [CmdletBinding( + SupportsShouldProcess = $True # Hiermee zorg je dat WhatIf en Confirm gebruikt kunnen worden :-) + )] + Param( + [Parameter(Mandatory=$false,Position=1)] + [AllowEmptyString()] + [String] $TargetName = [String]::Empty + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value "1.9" -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Version $versie + + } # Einde BEGIN + PROCESS { + [PsUtils.CredMan+Credential[]] $Creds = [Array]::CreateInstance([PsUtils.CredMan+Credential], 0) + [Int] $Results = 0 + try { + $Results = [PsUtils.CredMan]::CredEnum($TargetName, [Ref]$Creds) + } + catch { + return $_ + } + switch($Results) { + 0 { break } + 0x80070490 { break } #ERROR_NOT_FOUND + default { + Write-Warning " [WARN ] $($MyInvocation.MyCommand) Fout bij het lezen van credentials $($cred.TargetName), namelijk $($_.Exception.Message)." + } + } + $Creds + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function + +Function Write-Credential { +<# +.SYNOPSIS +Schrijft gegevens in de Windows Credential store. + +.DESCRIPTION +Schrijft gegevens weg in de Credential store. Met dit commando kun je nieuwe gegevens wegschrijven +of bestaande gegevens bijwerken. Dit gebeurt d.m.v. een call naar Win32 CredWriteW via +[PsUtils.CredMan]::CredWrite. + +.INPUTS + +.OUTPUTS + +.PARAMETER TargetName +De naam waaronder de credential wordt weggeschreven in de store. + +.PARAMETER UserName +De gebruikersnaam van het weg te schrijven credential. + +.PARAMETER Password +Het wachtwoord van het weg te schrijven credential. + +.PARAMETER Secure +Als je de parameters Username/Password gebruikt, wordt het wachtwoord standaard als platte tekst +opgeslagen in de credential store, zoals met veel wachtwoorden gebeurt. +Mocht je liever een Powershell securestring opslaan (=.Net SecureString Class) dan moet +je deze parameter opgeven. + +.PARAMETER Credential +De gebruikersnaam en het wachtwoord in een PSCredential object. Het wachtwoord wordt als Securestring +opgeslagen. Je moet kiezen tussen het gebruik van de parameters UserName/Password/Secure enerzijds, +of Credential anderzijds. + +.PARAMETER Comment +Eventueel commentaar dat je bij de credential wilt noteren. + +.PARAMETER Type +Het type credential; standaard "GENERIC". Mogelijke waarden zijn: +GENERIC, DOMAIN_PASSWORD, DOMAIN_CERTIFICATE, DOMAIN_VISIBLE_PASSWORD, +GENERIC_CERTIFICATE, DOMAIN_EXTENDED, MAXIMUM, MAXIMUM_EX. Er wordt sterk +geadviseerd alleen GENERIC te gebruiken (de standaardwaarde) + +.PARAMETER Persist +De persistance van de credential. Standaard is dit "ENTERPRISE". Mogelijke +waardes: SESSION, LOCAL_MACHINE, ENTERPRISE. + +.EXAMPLE +Write-Credential -Target 'Test' -Credential $creds +Slaat de credentials uit het $creds object op in de credential store. + +.EXAMPLE +Write-Credential -Target 'Testuser' -Credential (Get-Credential) +Geeft een grafische dialoog, en slaat de username/password op onder 'Testuser' als SecureString. + +.EXAMPLE +Write-Credential -Target 'Test' -UserName 'Joop' -Password 'WatEenSlechtWachtwoordIsDitToch' +Slaat de credentials op met gebruikersnaam 'Joop' en wachtwoord 'WatEenSlechtWachtwoordIsDitToch', +als leesbare tekst. + +.EXAMPLE +Write-Credential +Doorloopt een tekstdialoog waarin de naam van de credential, de username en password wordt gevraagd. + +.NOTES + Naam: Write-Credential + Auteur: Jim Harrison (jim@isatools.org) + Bron: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Credentials-d44c3cde + Wijzigingen: 20-05-2012 Jim Harrison 1.5 Van Internet + 14-09-2016 HH Aanpassingen om er een module van te maken; + Namen van de functies aangepast, meer in lijn + met Powershell. + 10-11-2015 HH 1.7 Verdere aanpassingen om het volledig in lijn te + brengen met de standaard. Helptekst + aangepast. Teksten vertaald. Mogelijkheid tot direct + opgeven van PSCredential object als input. + 24-08-2017 HH 1.8 Parameter TargetName positional gemaakt, zodat default + de TargetName kan worden gebruikt. Parameter Password + kan nu als gewone string worden opgegeven op de commandoregel, + of wordt anders als securestring via een tekstdialoog gevraagd. + Parameter Secure werkt nu ook! + 24-08-2018 HH 1.9 Aangepast aan nieuwe scriptsjabloon + +.LINK + Zie ook: + https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx) + http://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx + https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Credentials-d44c3cde + +#> + + +# +# (c) WUR +# Pas het versienummer hieronder en hierboven aan als je iets wijzigt. +# Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. +# + + [CmdletBinding( + SupportsShouldProcess = $True, + DefaultParameterSetName='UserNamePassword' + )] + Param( + [Parameter(Mandatory=$true,Position=1)] + [ValidateLength(0,32676)] + [String] $TargetName, + [Parameter(Mandatory=$true,ParameterSetName='Credential')] + [System.Management.Automation.PSCredential] $Credential, + [Parameter(Mandatory=$true,ParameterSetName='UserNamePassword')] + [ValidateLength(1,512)] + [String]$UserName, + [Parameter(ParameterSetName='UserNamePassword')] + [ValidateLength(0,32676)] + [string]$Password=$( if ( $PSCmdlet.ParameterSetName -eq 'UserNamePassword' ) { [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((Read-Host "Password" -AsSecureString))) } ), + [Parameter(Mandatory=$false,ParameterSetName='UserNamePassword')] + [Switch] $Secure = $false, + [Parameter(Mandatory=$false)] + [ValidateLength(0,256)] + [String] $Comment = [String]::Format("Last edited by {0}\{1} on {2}",$Env:UserDomain,$Env:UserName,$Env:ComputerName), + [Parameter(Mandatory=$false)] + [ValidateSet( "GENERIC", + "DOMAIN_PASSWORD", + "DOMAIN_CERTIFICATE", + "DOMAIN_VISIBLE_PASSWORD", + "GENERIC_CERTIFICATE", + "DOMAIN_EXTENDED", + "MAXIMUM", + "MAXIMUM_EX")] + [String] $Type = "GENERIC", + [Parameter(Mandatory=$false)] + [ValidateSet( "SESSION", + "LOCAL_MACHINE", + "ENTERPRISE")] + [String] $Persist = "ENTERPRISE" + ) + + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value "1.9" -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Version $versie + + if("GENERIC" -ne $Type -and 337 -lt $TargetName.Length) { #CRED_MAX_DOMAIN_TARGET_NAME_LENGTH + [String] $Msg = "Het Target veld is $($Target.Length) karakters lang, terwijl er maximaal 337 karakters zijn toegestaan." + [Management.ManagementException] $MgmtException = New-Object Management.ManagementException($Msg) + [Management.Automation.ErrorRecord] $ErrRcd = New-Object Management.Automation.ErrorRecord($MgmtException, 666, 'LimitsExceeded', $null) + return $ErrRcd + } + + if ( $PSCmdlet.ParameterSetName -eq 'Credential' ) { + $UserName=$Credential.UserName + $Password=$Credential.GetNetworkCredential().Password + } else { + if ( $Secure ) { + $Password=ConvertFrom-SecureString -SecureString (ConvertTo-SecureString $Password -AsPlainText -Force) + } + } + + } # Einde BEGIN + PROCESS { + [PsUtils.CredMan+Credential] $Cred = New-Object PsUtils.CredMan+Credential + switch($TargetName -eq $UserName -and + ("CRED_TYPE_DOMAIN_PASSWORD" -eq $Type -or + "CRED_TYPE_DOMAIN_CERTIFICATE" -eq $Type)) + { + $true {$Cred.Flags = [PsUtils.CredMan+CRED_FLAGS]::USERNAME_TARGET} + $false {$Cred.Flags = [PsUtils.CredMan+CRED_FLAGS]::NONE} + } + $Cred.Type = Get-CredType $Type + $Cred.TargetName = $TargetName + $Cred.UserName = $UserName + $Cred.AttributeCount = 0 + $Cred.Persist = Get-CredPersist $Persist + $Cred.CredentialBlobSize = [Text.Encoding]::Unicode.GetBytes($Password).Length + $Cred.CredentialBlob = $Password + $Cred.Comment = $Comment + + [Int] $Results = 0 + if ($pscmdlet.ShouldProcess($cred.TargetName, "Credentials worden bijgewerkt.")) { + try { + $Results = [PsUtils.CredMan]::CredWrite($Cred) + } + catch { + return $_ + } + } + + if(0 -ne $Results) { + [String] $Msg = "Fout bij het wegschrijven van de credentials naar de credential store voor '$Target' met gebruikersnaam '$UserName'" + [Management.ManagementException] $MgmtException = New-Object Management.ManagementException($Msg) + [Management.Automation.ErrorRecord] $ErrRcd = New-Object Management.Automation.ErrorRecord($MgmtException, $Results.ToString("X"), $ErrorCategory[$Results], $null) + return $ErrRcd + } + #return $Results + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } +} # Einde Function + +Function Get-Credential { +<# +.SYNOPSIS +Haalt PSCredential object uit de Windows Credential store. + +.DESCRIPTION +Haalt de credentials op uit de Credential store, via Read-Credential en geeft een +PSCredential object terug. + +.PARAMETER TargetName +De naam van de credential. + +.EXAMPLE +Get-Credential -TargetName 'EFSA' +Haalt de credential gegevens op van 'EFSA'. + +.EXAMPLE +(Get-Credential 'EFSA').GetNetworkCredential().Password +Haalt een PSCredential object op, en trekt het wachtwoord eruit in platte tekst. + +.EXAMPLE +[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((Get-Credential 'EFSA').Password)) +Haalt uit het PSCredential een SecureString, en trekt daar het wachtwoord uit in platte tekst. + +.INPUTS + +.OUTPUTS +[System.Management.Automation.PSCredential] + +.NOTES + Naam: Get-Credential + Auteur: HH + Bron: + Wijzigingen: 10-11-2016 HH 1.0 Initiele versie. + 13-11-2016 HH 1.1 Waarschuwing ipv foutmelding bij opvragen + van credential met leeg wachtwoord. + 24-08-2017 HH 1.2 Parameter positional gemaakt, zodat default de TargetName kan worden gebruikt. + 23-10-2017 HH 1.3 Bug eruit gehaald met de Try/Catch. Nu wordt beter gedetecteerd of de CredentialBlob + wel of geen securestring is. + 24-08-2018 HH 1.4 Aangepast aan nieuwe scriptsjabloon + 14-12-2019 HH 1.5 Waarschuwing optioneel gemaakt + +#> + +# +# (c) WUR +# Pas het versienummer hieronder en hierboven aan als je iets wijzigt. +# Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. +# + [OutputType('PSCredential')] + [CmdletBinding( + SupportsShouldProcess = $True # Hiermee zorg je dat WhatIf en Confirm gebruikt kunnen worden :-) + )] + Param( + [Parameter(Mandatory=$false,Position=1)] + [String] $TargetName, + [Switch] $NoWarning + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.5' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Version $versie + + $Warn=$true + if ( $NoWarning ) { $Warn = $false } + + } # Einde BEGIN + PROCESS { + [PsUtils.CredMan+Credential[]] $Creds = [Array]::CreateInstance([PsUtils.CredMan+Credential], 0) + [Int] $Results = 0 + try { + $Results = [PsUtils.CredMan]::CredEnum($TargetName, [Ref]$Creds) + } + catch { + return $_ + } + switch($Results) { + 0 { ForEach ( $cred in $Creds) { + if ( $cred.CredentialBlobSize -eq 0 ) { + if ( $Warn ) { + Write-Warning "Kan geen PSCredential maken, want $($cred.TargetName) heeft een leeg wachtwoord." + } + } else { + if ( $cred.UserName -eq $null ) { + if ( $Warn ) { + Write-Warning "Kan geen PSCredential maken, want $($cred.TargetName) heeft een lege username." + } + } else { + # Als het al een securestring is, dan wordt deze gewoon erin gezet. + $is_securestring=$true + try { + ConvertTo-SecureString $cred.CredentialBlob -ErrorAction Stop|Out-Null + } + catch { + $is_securestring=$false + } + finally { + if ( $is_securestring ) { + $cred_secure=(ConvertTo-SecureString $cred.CredentialBlob) + } else { + $cred_secure=(ConvertTo-SecureString $cred.CredentialBlob -AsPlainText -Force) + } + New-Object System.Management.Automation.PSCredential ($cred.UserName, $cred_secure) + } + } + } + } + break } + 0x80070490 { break } #ERROR_NOT_FOUND + default { + [String] $Msg = "Kon geen credentials opvragen uit de credentialstore voor '$Env:UserName'" + [Management.ManagementException] $MgmtException = New-Object Management.ManagementException($Msg) + [Management.Automation.ErrorRecord] $ErrRcd = New-Object Management.Automation.ErrorRecord($MgmtException, $Results.ToString("X"), $ErrorCategory[$Results], $null) + #$ErrRcd + } + } + + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function + +Function Update-Credential { +<# +.SYNOPSIS +Geeft een lijst van Credentials die je kunt updaten (interactief). + +.DESCRIPTION +Geeft een lijst van Credentials die je kunt updaten (interactief). + +.PARAMETER TargetName +De naam van de credential. + +.EXAMPLE +Update-Credential -TargetName 'EFSA' -Credential (Get-Credential) +Haalt de credential gegevens op van 'EFSA', en werkt ze bij met de +opgegeven credentials. + +.INPUTS + +.OUTPUTS +[System.Management.Automation.PSCredential] + +.NOTES + Naam: Update-Credential + Auteur: HH + Bron: + Wijzigingen: 14-12-2019 HH 1.0 Script geboren. + +#> + +# +# Pas het versienummer hieronder en hierboven aan als je iets wijzigt. +# Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. +# + [OutputType('PSCredential')] + [CmdletBinding( + SupportsShouldProcess = $True # Hiermee zorg je dat WhatIf en Confirm gebruikt kunnen worden :-) + )] + Param( + [Parameter(Mandatory=$false,Position=1)] + [String] $TargetName, + [System.Management.Automation.PSCredential] $Credential + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.0' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Version $versie + + } # Einde BEGIN + PROCESS { + if ($TargetName -and $Credential) { + if ( Get-Credential -TargetName $TargetName -NoWarning ) { + Write-Credential -TargetName $TargetName -Credential $Credential + } + } else { + if ($TargetName) { + $Credential=Get-Credential -TargetName $TargetName + $Credential=Microsoft.PowerShell.Security\Get-credential -UserName $Credential.UserName + Write-Credential -TargetName $TargetName -Credential $Credential + } else { + Write-Verbose "Tsja" + } + } + + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function diff --git a/Powershell/MCRA.Tools/Credential.ps1xml b/Powershell/MCRA.Tools/Credential.ps1xml new file mode 100644 index 0000000000000000000000000000000000000000..40d5f266c8422c4004fbcdd78cdc135b782306ae --- /dev/null +++ b/Powershell/MCRA.Tools/Credential.ps1xml @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="utf-8" ?> +<Configuration> + <ViewDefinitions> + <View> + <Name>Credential.Table</Name> + <ViewSelectedBy> + <TypeName>PSUtils.CredMan+Credential</TypeName> + </ViewSelectedBy> + <TableControl> + <TableHeaders> + <TableColumnHeader> + <Label>TargetName</Label> + <Width>25</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>UserName</Label> + <Width>20</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>CredentialBlobSize</Label> + <Width>18</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>Type</Label> + <Width>16</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>Persist</Label> + <Width>16</Width> + </TableColumnHeader> + </TableHeaders> + <TableRowEntries> + <TableRowEntry> + <TableColumnItems> + <TableColumnItem> + <ScriptBlock> + $_.TargetName -replace "(.*):target=" + </ScriptBlock> + </TableColumnItem> + <TableColumnItem> + <PropertyName>UserName</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>CredentialBlobSize</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Type</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Persist</PropertyName> + </TableColumnItem> + </TableColumnItems> + </TableRowEntry> + </TableRowEntries> + </TableControl> + </View> + <View> + <Name>Password</Name> + <ViewSelectedBy> + <TypeName>PSUtils.CredMan+Credential</TypeName> + </ViewSelectedBy> + <TableControl> + <TableHeaders> + <TableColumnHeader> + <Label>TargetName</Label> + <Width>25</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>UserName</Label> + <Width>20</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>CredentialBlob</Label> + <Width>30</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>Type</Label> + <Width>16</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>Persist</Label> + <Width>16</Width> + </TableColumnHeader> + </TableHeaders> + <TableRowEntries> + <TableRowEntry> + <TableColumnItems> + <TableColumnItem> + <ScriptBlock> + $_.TargetName -replace "(.*):target=" + </ScriptBlock> + </TableColumnItem> + <TableColumnItem> + <PropertyName>UserName</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>CredentialBlob</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Type</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Persist</PropertyName> + </TableColumnItem> + </TableColumnItems> + </TableRowEntry> + </TableRowEntries> + </TableControl> + </View> + <View> + <Name>Credential.List</Name> + <ViewSelectedBy> + <TypeName>PSUtils.CredMan+Credential</TypeName> + </ViewSelectedBy> + <ListControl> + <ListEntries> + <ListEntry> + <ListItems> + <ListItem> + <PropertyName>TargetName</PropertyName> + </ListItem> + <ListItem> + <PropertyName>TargetAlias</PropertyName> + </ListItem> + <ListItem> + <PropertyName>UserName</PropertyName> + </ListItem> + <ListItem> + <PropertyName>Comment</PropertyName> + </ListItem> + <ListItem> + <PropertyName>LastWritten</PropertyName> + </ListItem> + <ListItem> + <PropertyName>Type</PropertyName> + </ListItem> + <ListItem> + <PropertyName>Persist</PropertyName> + </ListItem> + <ListItem> + <PropertyName>Flags</PropertyName> + </ListItem> + <ListItem> + <PropertyName>CredentialBlob</PropertyName> + </ListItem> + <ListItem> + <PropertyName>AttributeCount</PropertyName> + </ListItem> + <ListItem> + <PropertyName>Attributes</PropertyName> + </ListItem> + </ListItems> + </ListEntry> + </ListEntries> + </ListControl> + </View> + <View> + <Name>Credential.Wide</Name> + <ViewSelectedBy> + <TypeName>PSUtils.CredMan+Credential</TypeName> + </ViewSelectedBy> + <WideControl> + <WideEntries> + <WideEntry> + <WideItem> + <PropertyName>TargetName</PropertyName> + </WideItem> + </WideEntry> + </WideEntries> + </WideControl> + </View> + </ViewDefinitions> +</Configuration> diff --git a/Powershell/MCRA.Tools/Get-DataSource.ps1 b/Powershell/MCRA.Tools/Get-DataSource.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..aca25dbf1244b202b43f173626006571d8a7db88 --- /dev/null +++ b/Powershell/MCRA.Tools/Get-DataSource.ps1 @@ -0,0 +1,109 @@ +Function Get-DataSource { +<# +.SYNOPSIS +Retrieves an MCRA Datasource. + +.DESCRIPTION +Retrieves an MCRA Datasource. + +.PARAMETER CREDENTIAL +A Credential object. + +.PARAMETER Keyring +The name from the entry in the Windows Credential Manager. + +.PARAMETER URL +The URL to which the request is made. + +.PARAMETER ID +The ID of the repository + +.EXAMPLE +Get-DataSource -Url 'https://mcra.test.wur.nl/Mcra90' -TargetName MCRA + + +.INPUTS +System.String + +.NOTES + Naam: Get-DataSource + Auteur: Heuve081 + Bron: + Wijzigingen: 11-03-2020 Heuve081 1.0 Script geboren. + +#> + + # + # (c) Private use + # Pas het versienummer hieronder en hierboven aan als je iets wijzigt. + # Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. + # + # Pas het Outputtype aan als je een object teruggeeft. + [OutputType('MCRA.Datasource')] + [CmdletBinding(SupportsShouldProcess = $True)] + Param( + [Parameter(Mandatory=$true)] + [string]$Url, + [Parameter(Mandatory=$true,ParameterSetName='Credential')] + [System.Management.Automation.PSCredential]$Credential, + [Parameter(Mandatory=$true,ParameterSetName='TargetName')] + [Alias('Keyring')] + [string]$TargetName, + [int]$ID + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.0' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Invoke $MyInvocation -Version $versie + + $tokenparams= $params = @{ 'Url' = $Url } + if ($PSCmdlet.ParameterSetName -eq 'TargetName') { + $tokenparams['Credential'] = Get-Credential -TargetName $TargetName + } else { + $tokenparams['Credential'] = $Credential + } + + $token=Get-Token @tokenparams + + if (-not [bool]$token ) { + Throw " [ERROR] No token received. Mission abort." + } + + $ApiUrl = $Url+'/Api/' + } # Einde BEGIN + PROCESS { + if ($ID) { + # This is a different API call; we expect the same objects. + $Api='DataSources/Get/'+$ID + } else { + # This is a different API call; we expect the same objects. + $Api='DataSources/GetAll' + } + $result=$null + $result=Invoke-Api -Url $Url -Api $Api -Token $token + if ( [bool]$result ) { + # We have a result + if ( $result -is [array] ) { + # There a more than one + Write-Verbose " [MESG ] $($result.Count) results found" + } else { + # There can be only one + Write-Verbose " [MESG ] One result found" + } + $result| ForEach { + Add-Member -InputObject $_ -NotePropertyMembers @{ + 'SourceURL' = $url; 'created' =[datetime]$($_.createdTimeStamp); + 'uploaded'=[datetime]$($_.uploadedTimeStamp) + } -TypeName 'MCRA.Datasource' -PassThru } + } else { + Write-Verbose " [MESG ] No result found" + } + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function diff --git a/Powershell/MCRA.Tools/Get-EfsaCatalogue.ps1 b/Powershell/MCRA.Tools/Get-EfsaCatalogue.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..0f9a5454a1f8df578891f67d1ae9918c92a7fcdb --- /dev/null +++ b/Powershell/MCRA.Tools/Get-EfsaCatalogue.ps1 @@ -0,0 +1,121 @@ +Function Get-EfsaCatalogue { +<# +.SYNOPSIS +Requests an EFSA catalogue file. + +.DESCRIPTION +Requests an EFSA catalogue file. + +.PARAMETER JSON +The JSON string to be used as a request. + +.PARAMETER CREDENTIAL +A Credential object. Only the password will be used. + +.PARAMETER TargetName +A TargetName from the Windows Credential Manager. + +.PARAMETER URL +The URL to which the request is made. + +.EXAMPLE +Get-EfsaCatalogue -JSON $json -Targetname EFSA +Uses the string in $json to requests a catalogue; credentials from +EFSA are used. + + +.INPUTS +System.String + +.NOTES + Naam: Get-EfsaCatalogue + Auteur: Hansvandenheuvel + Bron: + Wijzigingen: 10-03-2020 HH 1.0 Script geboren. + + This is actually just the following command + Invoke-RestMethod -Uri 'https://openapi.efsa.europa.eu/api/catalogues/catalogue-file' -Headers @{ 'Ocp-Apim-Subscription-Key' = 'secret' } -Method POST -ContentType 'application/json' -body $JsonString + +#> + + # + # (c) WUR + # Pas het versienummer hieronder en hierboven aan als je iets wijzigt. + # Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. + # + # Pas het Outputtype aan als je een object teruggeeft. + [OutputType('My.Object')] + [CmdletBinding(SupportsShouldProcess = $True)] + Param( + [Parameter(Mandatory=$True,ValueFromPipeline=$true,Position=1)] + [string]$JSON, + [Parameter(Mandatory=$true,ParameterSetName='Credential')] + [System.Management.Automation.PSCredential]$Credential, + [Parameter(Mandatory=$true,ParameterSetName='TargetName')] + [string]$TargetName, + [Parameter()] + [string]$url='https://openapi.efsa.europa.eu', + [Parameter()] + [string]$Path, + [Parameter()] + [switch]$PassThru + + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.0' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Invoke $MyInvocation -Version $versie + + if ($PSCmdlet.ParameterSetName -eq 'TargetName') { + $Cred=Get-Credential -TargetName $TargetName + } else { + $Cred=$Credential + } + $JsonString = '' + + } # Einde BEGIN + PROCESS { + # Unfortunaly we have to swallow the entire JSON string, before processing. + # No problem, it's usually small. + $JsonString+=$JSON + + } # Einde PROCESS + END { + $result=New-Object xml + $pUrl=$url+'/api/'+'catalogues/catalogue-file' + $headers = @{ 'Ocp-Apim-Subscription-Key' = $Cred.GetNetworkCredential().Password } + Write-Verbose "Invoking RestMethod to $pUrl" + $dump=(Invoke-RestMethod -Uri $pUrl -Headers $headers -Method POST -ContentType 'application/json' -body $JsonString) -Split [Environment]::NewLine|ForEach -Begin { + # Ugly hack, because no proper MIME handling is available in Powershell (that I am aware of) + $xml = $False } -Process { if ($xml) { + if ($_ -match '^\-\-uuid\:') { + $xml=$False + } else { + $_ + } + } else { + if ($_ -match '^\<\?xml') { + $xml = $True + $_ + } + } + } + $result=New-Object xml + Write-Verbose "Converting to XML" + $result.LoadXML($dump) + # Write to file if requested, else dump object + if ( $Path ) { + if ($PassThru ) { $result } + Write-Verbose "Saving to $Path" + $result.Save($Path) + } else { + $result + } + $result + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function diff --git a/Powershell/MCRA.Tools/Get-File.ps1 b/Powershell/MCRA.Tools/Get-File.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d18e849142d15ff08ba1ced1dd194d1885cb60d8 --- /dev/null +++ b/Powershell/MCRA.Tools/Get-File.ps1 @@ -0,0 +1,111 @@ +Function Get-File { +<# +.SYNOPSIS +Get a Datasource from the MCRA repository and save to file. + +.DESCRIPTION +Get a Datasource from the MCRA repository and save to file. + +.PARAMETER CREDENTIAL +A Credential object. + +.PARAMETER Keyring +The name from the entry in the Windows Credential Manager. + +.PARAMETER URL +The URL to which the request is made. + +.PARAMETER ID +The ID of the repository. + +.PARAMETER Path +The name to which to save the repository. + +.PARAMETER AsCSV +Wil retrieve the data from the database as a ZIPPED CSV. + +.EXAMPLE +Get-File + + +.INPUTS +System.String + +.NOTES + Naam: Get-File + Auteur: Hansvandenheuvel + Bron: + Wijzigingen: 12-03-2020 Hansvandenheuvel 1.0 Script geboren. + +#> + + # + # (c) Private use + # Pas het versienummer hieronder en hierboven aan als je iets wijzigt. + # Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. + # + # Pas het Outputtype aan als je een object teruggeeft. + [OutputType('My.Object')] + [CmdletBinding(SupportsShouldProcess = $True)] + Param( + [Parameter(Mandatory=$true)] + [string]$Url, + [Parameter(Mandatory=$true,ParameterSetName='Credential')] + [System.Management.Automation.PSCredential]$Credential, + [Parameter(Mandatory=$true,ParameterSetName='TargetName')] + [Alias('Keyring')] + [string]$TargetName, + [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName)] + [Alias('ID')] + [int]$idCurrentVersion, + [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName)] + [Alias('Path')] + [string]$Name, + [Parameter()] + [switch]$AsCSV + + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.0' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Invoke $MyInvocation -Version $versie + + $tokenparams= @{ 'Url' = $Url } + if ($PSCmdlet.ParameterSetName -eq 'TargetName') { + $tokenparams['Credential'] = Get-Credential -TargetName $TargetName + } else { + $tokenparams['Credential'] = $Credential + } + + $token=Get-Token @tokenparams + + if (-not [bool]$token ) { + Throw " [ERROR] No token received. Mission abort." + } + + } # Einde BEGIN + PROCESS { + ForEach-Object { + if ($AsCSV) { + # Force .zip as extension + if ([System.IO.Path]::GetExtension($Name).ToLower() -ne '.zip') { + $Name=$Name+'.zip' + } + $Api='DataSources/DownloadVersionCsv/'+$idCurrentVersion + } else { + $Api='DataSources/DownloadVersion/'+$idCurrentVersion + } + Write-Verbose " [MESG ] Downloading datasource with ID $idCurrentVersion to $Name" + + $RequestUrl=$Url+'/Api/'+$Api + Invoke-WebRequest -Uri $RequestUrl -Headers $token.header -OutFile $Name + } + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function diff --git a/Powershell/MCRA.Tools/Get-Repository.ps1 b/Powershell/MCRA.Tools/Get-Repository.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..62170f896c33657f3b87b5caad6c61541d7b2c96 --- /dev/null +++ b/Powershell/MCRA.Tools/Get-Repository.ps1 @@ -0,0 +1,106 @@ +Function Get-Repository { +<# +.SYNOPSIS +Retrieves an MCRA Repository. + +.DESCRIPTION +Retrieves an MCRA Repository. + +.PARAMETER CREDENTIAL +A Credential object. + +.PARAMETER Keyring +The name from the entry in the Windows Credential Manager. + +.PARAMETER URL +The URL to which the request is made. + +.PARAMETER ID +The ID of the repository + +.EXAMPLE +Get-Repository -Url 'https://mcra.test.wur.nl/Mcra90' -TargetName MCRA + + +.INPUTS +System.String + +.NOTES + Naam: Get-Repository + Auteur: Heuve081 + Bron: + Wijzigingen: 11-03-2020 Heuve081 1.0 Script geboren. + +#> + + # + # (c) Private use + # Pas het versienummer hieronder en hierboven aan als je iets wijzigt. + # Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. + # + # Pas het Outputtype aan als je een object teruggeeft. + [OutputType('MCRA.Repository')] + [CmdletBinding(SupportsShouldProcess = $True)] + Param( + [Parameter(Mandatory=$true)] + [string]$Url, + [Parameter(Mandatory=$true,ParameterSetName='Credential')] + [System.Management.Automation.PSCredential]$Credential, + [Parameter(Mandatory=$true,ParameterSetName='TargetName')] + [Alias('Keyring')] + [string]$TargetName, + [int]$ID + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.0' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Invoke $MyInvocation -Version $versie + + $tokenparams= @{ 'Url' = $Url } + if ($PSCmdlet.ParameterSetName -eq 'TargetName') { + $tokenparams['Credential'] = Get-Credential -TargetName $TargetName + } else { + $tokenparams['Credential'] = $Credential + } + + $token=Get-Token @tokenparams + + if (-not [bool]$token ) { + Throw " [ERROR] No token received. Mission abort." + } + + } # Einde BEGIN + PROCESS { + if ($ID) { + # This is a different API call; we expect the same objects. + $Api='Repositories/Get/'+$ID + $properties = @{ 'SourceURL' = $url } + } else { + # This is a different API call; we expect the same objects. + $Api='Repositories/GetAll' + $properties = @{ 'SourceURL' = $url; path = ''; userName = ''; apiKey = ''; userAccessRights = @([System.Object]); groupAccessRights = @([System.Object]) } + } + $result=$null + $result=Invoke-Api -Url $Url -Api $Api -Token $token + if ( [bool]$result ) { + # We have a result + if ( $result -is [array] ) { + # There a more than one + Write-Verbose " [MESG ] $($result.Count) results found" + } else { + # There can be only one + Write-Verbose " [MESG ] One result found" + } + $result| Add-Member -NotePropertyMembers $properties -TypeName 'MCRA.Repository' -PassThru + } else { + Write-Verbose " [MESG ] No result found" + } + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function diff --git a/Powershell/MCRA.Tools/Get-Token.ps1 b/Powershell/MCRA.Tools/Get-Token.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..5e5096ef7e8e1cb506b54028b008fc8b191461a6 --- /dev/null +++ b/Powershell/MCRA.Tools/Get-Token.ps1 @@ -0,0 +1,93 @@ +Function Get-Token { +<# +.SYNOPSIS +Retrieves an MCRA Token for access. + +.DESCRIPTION +Retrieves an MCRA Token for access. + +.PARAMETER CREDENTIAL +A Credential object. + +.PARAMETER URL +The URL to which the request is made. + +.EXAMPLE +Get-Token -Url 'https://mcra.test.wur.nl/Mcra90' -TargetName MCRA + +.INPUTS +System.String + +.NOTES + Naam: Get-Token + Auteur: Heuve081 + Bron: + Wijzigingen: 11-03-2020 Heuve081 1.0 Script geboren. + +#> + + # + # (c) Private use + # Pas het versienummer hieronder en hierboven aan als je iets wijzigt. + # Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. + # + # Pas het Outputtype aan als je een object teruggeeft. + [OutputType('MCRA.Token')] + [CmdletBinding(SupportsShouldProcess = $True)] + Param( + [Parameter(Mandatory=$true)] + [string]$Url, + [Parameter(Mandatory=$true)] + [System.Management.Automation.PSCredential]$Credential, + [int]$ID + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.0' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Invoke $MyInvocation -Version $versie + $ClientId = 'cbd00dfbdd0a4501bf457b52a635353f' + + $TokenUrl = $Url + '/jwtauth/token' + + $Body = @{ + 'grant_type' = 'password'; + 'username' = $Credential.UserName; + 'password' = $Credential.GetNetworkCredential().Password; + 'client_id' = $ClientId } + + } # Einde BEGIN + PROCESS { + # Request token + $now = Get-Date + Write-Verbose " [MESG ] Request token on $TokenUrl" + Try { + $token=Invoke-RestMethod -Uri $TokenUrl -ContentType 'application/json' -Body $body -Method POST + } Catch { + $token = $null + } + if ( [bool]$token ) { + # Now stored in $token.access_token + $headers = @{ 'authorization' = 'bearer '+$token.access_token } + # Output a custom object, in which we can easily navigate. + $secret = ConvertTo-SecureString $token.access_token -AsPlainText -Force + [pscustomobject]@{ + 'token' = $secret + 'header' = $headers + # Expires 10 mins before actual expiration + 'expires' = $now.AddSeconds($token.expires_in).AddMinutes(-10) + PSTypeName = 'MCRA.Token' } + Write-Verbose " [MESG ] Token created" + } else { + # [pscustomobject]@{ 'token' = ''; 'header' = @{}; PSTypeName = 'MCRA.Token' } + Write-Warning " [WARN ] Could not fetch a proper token" + $token + } + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function diff --git a/Powershell/MCRA.Tools/Get-Workspace.ps1 b/Powershell/MCRA.Tools/Get-Workspace.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..bb8b959f1dc17a8e7174f29533ad490710ddd21b --- /dev/null +++ b/Powershell/MCRA.Tools/Get-Workspace.ps1 @@ -0,0 +1,109 @@ +Function Get-Workspace { +<# +.SYNOPSIS +Retrieves an MCRA Workspace. + +.DESCRIPTION +Retrieves an MCRA Workspace. + +.PARAMETER CREDENTIAL +A Credential object. + +.PARAMETER Keyring +The name from the entry in the Windows Credential Manager. + +.PARAMETER URL +The URL to which the request is made. + +.PARAMETER ID +The ID of the repository + +.EXAMPLE +Get-Workspace -Url 'https://mcra.test.wur.nl/Mcra90' -TargetName MCRA + + +.INPUTS +System.String + +.NOTES + Naam: Get-Workspace + Auteur: Heuve081 + Bron: + Wijzigingen: 11-03-2020 Heuve081 1.0 Script geboren. + +#> + + # + # (c) Private use + # Pas het versienummer hieronder en hierboven aan als je iets wijzigt. + # Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. + # + # Pas het Outputtype aan als je een object teruggeeft. + [OutputType('MCRA.Workspace')] + [CmdletBinding(SupportsShouldProcess = $True)] + Param( + [Parameter(Mandatory=$true)] + [string]$Url, + [Parameter(Mandatory=$true,ParameterSetName='Credential')] + [System.Management.Automation.PSCredential]$Credential, + [Parameter(Mandatory=$true,ParameterSetName='TargetName')] + [Alias('Keyring')] + [string]$TargetName, + [int]$ID + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.0' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Invoke $MyInvocation -Version $versie + + $tokenparams= $params = @{ 'Url' = $Url } + if ($PSCmdlet.ParameterSetName -eq 'TargetName') { + $tokenparams['Credential'] = Get-Credential -TargetName $TargetName + } else { + $tokenparams['Credential'] = $Credential + } + + $token=Get-Token @tokenparams + + if (-not [bool]$token ) { + Throw " [ERROR] No token received. Mission abort." + } + + $ApiUrl = $Url+'/Api/' + } # Einde BEGIN + PROCESS { + if ($ID) { + # This is a different API call; we expect the same objects. + $Api='Workspace/Get/'+$ID + } else { + # This is a different API call; we expect the same objects. + $Api='Workspace/GetAll' + } + $result=$null + $result=Invoke-Api -Url $Url -Api $Api -Token $token + if ( [bool]$result ) { + # We have a result + if ( $result -is [array] ) { + # There a more than one + Write-Verbose " [MESG ] $($result.Count) results found" + } else { + # There can be only one + Write-Verbose " [MESG ] One result found" + } + $result| ForEach { + Add-Member -InputObject $_ -NotePropertyMembers @{ + 'SourceURL' = $url; 'created' =[datetime]$($_.dateCreated); + 'modified'=[datetime]$($_.dateModified) + } -TypeName 'MCRA.Workspace' -PassThru } + } else { + Write-Verbose " [MESG ] No result found" + } + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function diff --git a/Powershell/MCRA.Tools/Invoke-Api.ps1 b/Powershell/MCRA.Tools/Invoke-Api.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..5688515e64499225753f2220ce0f664e5ebeca4b --- /dev/null +++ b/Powershell/MCRA.Tools/Invoke-Api.ps1 @@ -0,0 +1,75 @@ +Function Invoke-Api { +<# +.SYNOPSIS +Makes a call to the MCRA Api. + +.DESCRIPTION +Makes a call to the MCRA Api. + +.PARAMETER Url +The URL to which the request is made. + +.PARAMETER Api +The Api call. + +.PARAMETER Token +An object with a token + +.EXAMPLE +Invoke-Api -Url 'https://mcra.test.wur.nl/Mcra90' -Api 'Repositories/GetAll' -token $token + + +.INPUTS +System.String + +.NOTES + Naam: Invoke-Api + Auteur: Heuve081 + Bron: + Wijzigingen: 11-03-2020 Heuve081 1.0 Script geboren. + +#> + + # + # (c) Private use + # Pas het versienummer hieronder en hierboven aan als je iets wijzigt. + # Geef bij .NOTES hierboven aan wat je precies hebt gewijzigd. + # + # Pas het Outputtype aan als je een object teruggeeft. + [CmdletBinding(SupportsShouldProcess = $True)] + Param( + [Parameter(Mandatory=$true)] + [string]$Url, + $Token, + [string]$Api + ) + BEGIN { + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value '1.0' -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Invoke $MyInvocation -Version $versie + + $ApiUrl = $Url+'/Api/' + } # Einde BEGIN + PROCESS { + $RequestUrl=$ApiUrl+$Api + $result=$null + Write-Verbose " [MESG ] Using request api URL $RequestUrl" + Try { + $result=Invoke-RestMethod -Uri $RequestUrl -Headers $token.header -ContentType 'application/json' + } Catch { + $result=$null + } + if ( -not [bool]$result ) { + # We have no result + Write-Verbose " [MESG ] No result found" + } + $result + } # Einde PROCESS + END { + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty + } # Einde END +} # Einde Function diff --git a/Powershell/MCRA.Tools/MCRA.DataSource.ps1xml b/Powershell/MCRA.Tools/MCRA.DataSource.ps1xml new file mode 100644 index 0000000000000000000000000000000000000000..2c2470bb76a892d66f3b8496393ae524a341deab --- /dev/null +++ b/Powershell/MCRA.Tools/MCRA.DataSource.ps1xml @@ -0,0 +1,171 @@ +<?xml version="1.0" encoding="utf-8" ?> +<Configuration> + <ViewDefinitions> + <View> + <Name>MCRA.DataSource.Table</Name> + <ViewSelectedBy> + <TypeName>MCRA.DataSource</TypeName> + </ViewSelectedBy> + <TableControl> + <TableHeaders> + <TableColumnHeader> + <Label>Mode</Label> + <Width>5</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>Id</Label> + <Width>6</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Owner</Label> + <Width>12</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>Created</Label> + <Width>20</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>DataSrc</Label> + <Width>7</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Id</Label> + <Width>6</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>CurId</Label> + <Width>6</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Version</Label> + <Width>7</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Name</Label> + <Width>50</Width> + </TableColumnHeader> + </TableHeaders> + <TableRowEntries> + <TableRowEntry> + <TableColumnItems> + <TableColumnItem> + <ScriptBlock> + [string]$_.accessLevel+' '+[string][int]$_.isDeleted+' '+[string][int]$_.isLocalFile + </ScriptBlock> + </TableColumnItem> + <TableColumnItem> + <PropertyName>idOwner</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Owner</PropertyName> + </TableColumnItem> + <TableColumnItem> + <ScriptBlock> + $_.created.ToString('dd-MM-yyyy HH:mm') + </ScriptBlock> + </TableColumnItem> + <TableColumnItem> + <PropertyName>idDataSourceRepository</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>id</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>idCurrentVersion</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Version</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Name</PropertyName> + </TableColumnItem> + </TableColumnItems> + </TableRowEntry> + </TableRowEntries> + </TableControl> + </View> + <View> + <Name>MCRA.DataSource.List</Name> + <ViewSelectedBy> + <TypeName>MCRA.DataSource</TypeName> + </ViewSelectedBy> + <ListControl> + <ListEntries> + <ListEntry> + <ListItems> + <ListItem> + <PropertyName>id</PropertyName> + </ListItem> + <ListItem> + <PropertyName>idDataSourceRepository</PropertyName> + </ListItem> + <ListItem> + <PropertyName>idCurrentVersion</PropertyName> + </ListItem> + <ListItem> + <PropertyName>version</PropertyName> + </ListItem> + <ListItem> + <PropertyName>versionIds</PropertyName> + </ListItem> + <ListItem> + <PropertyName>name</PropertyName> + </ListItem> + <ListItem> + <PropertyName>uploaded</PropertyName> + </ListItem> + <ListItem> + <PropertyName>created</PropertyName> + </ListItem> + <ListItem> + <PropertyName>idOwner</PropertyName> + </ListItem> + <ListItem> + <PropertyName>owner</PropertyName> + </ListItem> + <ListItem> + <PropertyName>uploadUserName</PropertyName> + </ListItem> + <ListItem> + <PropertyName>accesslevel</PropertyName> + </ListItem> + <ListItem> + <PropertyName>isDeleted</PropertyName> + </ListItem> + <ListItem> + <PropertyName>isLocalFile</PropertyName> + </ListItem> + <ListItem> + <PropertyName>tableGroups</PropertyName> + </ListItem> + <ListItem> + <PropertyName>SourceURL</PropertyName> + </ListItem> + </ListItems> + </ListEntry> + </ListEntries> + </ListControl> + </View> + <View> + <Name>MCRA.DataSource.Wide</Name> + <ViewSelectedBy> + <TypeName>MCRA.DataSource</TypeName> + </ViewSelectedBy> + <WideControl> + <WideEntries> + <WideEntry> + <WideItem> + <PropertyName>name</PropertyName> + </WideItem> + </WideEntry> + </WideEntries> + </WideControl> + </View> + </ViewDefinitions> +</Configuration> diff --git a/Powershell/MCRA.Tools/MCRA.Repository.ps1xml b/Powershell/MCRA.Tools/MCRA.Repository.ps1xml new file mode 100644 index 0000000000000000000000000000000000000000..3f8f94c4711e23e1387f476bd7b73338c6569acb --- /dev/null +++ b/Powershell/MCRA.Tools/MCRA.Repository.ps1xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="utf-8" ?> +<Configuration> + <ViewDefinitions> + <View> + <Name>MCRA.Repository.Table</Name> + <ViewSelectedBy> + <TypeName>MCRA.Repository</TypeName> + </ViewSelectedBy> + <TableControl> + <TableHeaders> + <TableColumnHeader> + <Label>Mode</Label> + <Width>5</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>Id</Label> + <Width>6</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Owner</Label> + <Width>12</Width> + </TableColumnHeader> + <TableColumnHeader> + <Label>Parent</Label> + <Width>6</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Id</Label> + <Width>6</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Name</Label> + <Width>50</Width> + </TableColumnHeader> + </TableHeaders> + <TableRowEntries> + <TableRowEntry> + <TableColumnItems> + <TableColumnItem> + <ScriptBlock> + [string]$_.userAccessLevel+' '+[string][int]$_.isUserRootRepository+' '+[string]$_.repositoryType + </ScriptBlock> + </TableColumnItem> + <TableColumnItem> + <PropertyName>idOwner</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Owner</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>idParentRepository</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>id</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Name</PropertyName> + </TableColumnItem> + </TableColumnItems> + </TableRowEntry> + </TableRowEntries> + </TableControl> + </View> + <View> + <Name>MCRA.Repository.List</Name> + <ViewSelectedBy> + <TypeName>MCRA.Repository</TypeName> + </ViewSelectedBy> + <ListControl> + <ListEntries> + <ListEntry> + <ListItems> + <ListItem> + <PropertyName>id</PropertyName> + </ListItem> + <ListItem> + <PropertyName>name</PropertyName> + </ListItem> + <ListItem> + <PropertyName>idOwner</PropertyName> + </ListItem> + <ListItem> + <PropertyName>owner</PropertyName> + </ListItem> + <ListItem> + <PropertyName>userAccessLevel</PropertyName> + </ListItem> + <ListItem> + <PropertyName>idParentRepository</PropertyName> + </ListItem> + <ListItem> + <PropertyName>isUserRootRepository</PropertyName> + </ListItem> + <ListItem> + <PropertyName>repositoryType</PropertyName> + </ListItem> + <ListItem> + <PropertyName>SourceURL</PropertyName> + </ListItem> + </ListItems> + </ListEntry> + </ListEntries> + </ListControl> + </View> + <View> + <Name>MCRA.Repository.Wide</Name> + <ViewSelectedBy> + <TypeName>MCRA.Repository</TypeName> + </ViewSelectedBy> + <WideControl> + <WideEntries> + <WideEntry> + <WideItem> + <PropertyName>name</PropertyName> + </WideItem> + </WideEntry> + </WideEntries> + </WideControl> + </View> + </ViewDefinitions> +</Configuration> diff --git a/Powershell/MCRA.Tools/MCRA.Tools.psd1 b/Powershell/MCRA.Tools/MCRA.Tools.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..a4f6cd2da3c6f6b65bf849567f3313fc40fc96c6 --- /dev/null +++ b/Powershell/MCRA.Tools/MCRA.Tools.psd1 @@ -0,0 +1,111 @@ +# +# Module manifest for module 'MCRA.Tools' +# +# Generated on: 10-03-2020 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = 'MCRA.Tools.psm1' + +# Version number of this module. +ModuleVersion = '2.0.0.0' + +# ID used to uniquely identify this module +GUID = '9af6f6e5-ef04-4322-b4ca-4fd59712f2dd' + +# Author of this module +Author = 'Hans van den Heuvel' + +# Company or vendor of this module +CompanyName = 'Wageningen University and Research, Biometris' + +# Copyright statement for this module +Copyright = '(c) 2020. All rights reserved.' + +# Description of the functionality provided by this module +# Description = 'Voorziet in standaardscripts voor de Missing Piece omgeving.' + +# Minimum version of the Windows PowerShell engine required by this module +# PowerShellVersion = '' + +# Name of the Windows PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the Windows PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module +# DotNetFrameworkVersion = '' + +# Minimum version of the common language runtime (CLR) required by this module +# CLRVersion = '' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +# RequiredModules = @() + +# Assemblies that must be loaded prior to importing this module +# RequiredAssemblies = @() + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @('Set-Variables.ps1') + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @( ) + +# Format files (.ps1xml) to be loaded when importing this module +FormatsToProcess = @( 'Credential.ps1xml', + 'MCRA.Repository.ps1xml', + 'MCRA.DataSource.ps1xml', + 'MCRA.Workspace.ps1xml') + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +NestedModules = @( 'Command-Credential.ps1', + 'Get-EfsaCatalogue.ps1', + 'Get-Repository.ps1', + 'Get-DataSource.ps1', + 'Get-File.ps1', + 'Get-Workspace.ps1', + 'Get-Token.ps1', + 'Invoke-Api.ps1' + ) + +# Functions to export from this module +FunctionsToExport = @( 'Clear-Credential','Get-Credential','Read-Credential','Write-Credential', + 'Get-EfsaCatalogue', + 'Get-Repository', + 'Get-DataSource', + 'Get-File', + 'Get-Workspace' + ) + +# Cmdlets to export from this module +CmdletsToExport = '*' + +# Variables to export from this module +# VariablesToExport = @() + +# Aliases to export from this module +AliasesToExport = '*' + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess +# PrivateData = '' +# PrivateData = @{ Token2 = 'global'} + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +DefaultCommandPrefix = 'MCRA' + +} diff --git a/Powershell/MCRA.Tools/MCRA.Tools.psm1 b/Powershell/MCRA.Tools/MCRA.Tools.psm1 new file mode 100644 index 0000000000000000000000000000000000000000..b3df4fdcb21183c6a1c3e85f8f793dcb0d78b69f --- /dev/null +++ b/Powershell/MCRA.Tools/MCRA.Tools.psm1 @@ -0,0 +1,122 @@ +# +# Deze Module is in principe leeg, want alle geexporteerde functies staan in aparte bestanden. +# +# Enkele functies die in alle functies worden gebruikt. +Function Write-CmdLetStartMessage { +<# +.SYNOPSIS +Schrijft een melding op het scherm in standaardformaat bij de aanroep van een cmdlet. + +.PARAMETER Version +Het versienummer dat wordt meegegeven. + +.PARAMETER Invoke +Een InvocationInfo object waarvan de gegevens worden geprint. + +.NOTES + Naam: Write-CmdLetStartMessage + Auteur: HH + Bron: + Wijzigingen: 24-08-2018 HH 1.0 Script geboren + 26-09-2018 HH 1.1 Automatisch parent invokation uitzoeken toegevoegd. +#> + [OutputType('MCRA.InvokeProperties')] + [CmdletBinding()] + param( + [Parameter( Mandatory=$False,Position=1)] + [string]$version, + [Parameter(Mandatory=$False,Position=2)] + [System.Management.Automation.InvocationInfo]$invoke + ) + $callStack = Get-PSCallStack + if ( -not $invoke ) { + if ($callStack.Count -gt 1) { + $invoke=$callStack[1].InvocationInfo + } else { + $invoke=[pscustomobject]@{ MyCommand =''; Pipelineposition=''; Line='' } + } + } + # Hack to fix prefix stuff. Must be improved. + $thiscommand=$invoke.MyCommand -replace '-MCRA','-' + if ( $versie ) { + Write-Verbose "[BEGIN] $thiscommand versie $versie (c) $((Get-Date).year) $ThisCompanyName uitgevoerd door $env:USERNAME" + } else { + Write-Verbose "[BEGIN] $thiscommand (c) $((Get-Date).year) $ThisCompanyName uitgevoerd door $env:USERNAME" + } + # We gaan eerst de parameters evalueren die niet in de pipeline gaan. + ForEach ($key in $invoke.BoundParameters.keys) { + $value=Get-Variable $Key -ErrorAction SilentlyContinue + if ( $value ) { + Write-Verbose " [PARAM] $thiscommand $key : $($value.value)" + } + } + # Tenslotte geven we als return waarde een object met gegevens die we later kunnen hergebruiken. + [pscustomobject][ordered]@{ + Invoke = $invoke + Timer = [Diagnostics.Stopwatch]::StartNew() + Version = $version + Name = $thiscommand + PSTypeName = 'MCRA.InvokeProperties' + } +} + +Function Write-CmdLetStopMessage { +<# +.SYNOPSIS +Schrijft een melding op het scherm in standaardformaat bij het stoppen van een cmdlet. + +.PARAMETER ScriptProperty +Een ScriptProperty object, dat uit het Write-CmdLetStartMessage commando komt. + +.NOTES + Naam: Write-CmdLetStartMessage + Auteur: HH + Bron: + Wijzigingen: 24-08-2018 HH 1.0 Script geboren +#> + [CmdletBinding()] + param( + [Parameter( Mandatory=$False,Position=1)] + [object]$scriptproperty + ) + + if ( $scriptproperty ) { + $scriptproperty.timer.Stop() + Write-Verbose "[ END ] $($scriptproperty.invoke.MyCommand) ($($scriptproperty.timer.Elapsed.ToString('hh\:mm\:ss\.fff')))." + } else { + Write-Verbose "[ END ] Einde script." + } +} + +Function Get-LocalOSVersion { +<# +.SYNOPSIS +Vraagt lokale OS versie op. + +.NOTES + Naam: Get-LocalOSVersion + Auteur: HH + Bron: HH + Wijzigingen: 24-08-2018 HH 1.0 Script geboren +#> + [OutputType('System.Version')] + [CmdletBinding()] + param() + # Strict modus + Set-StrictMode -Version Latest + # Een versienummer van het script. + Set-Variable versie -option Constant -value "1.0" -WhatIf:$false + # Schrijf een melding op het scherm indien nodig (bij -Verbose) + $scriptproperty=Write-CmdLetStartMessage -Invoke $MyInvocation -Version $versie + + [System.Version](Get-CimInstance Win32_OperatingSystem).version + + # Schrijft een melding op het scherm indien nodig (bij -Verbose) + Write-CmdLetStopMessage -ScriptProperty $scriptproperty +} + +Set-Variable ThisCompanyName -option Constant -value 'WUR' +# We exporteren hier alles expliciet, maar in de Manifest (psd bestand) filteren we alles er weer uit. +Export-ModuleMember -Variable * +Export-ModuleMember -Function * + diff --git a/Powershell/MCRA.Tools/MCRA.Workspace.ps1xml b/Powershell/MCRA.Tools/MCRA.Workspace.ps1xml new file mode 100644 index 0000000000000000000000000000000000000000..e4c7fafa9d35cb58eee0b52c09a12f927d109a77 --- /dev/null +++ b/Powershell/MCRA.Tools/MCRA.Workspace.ps1xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="utf-8" ?> +<Configuration> + <ViewDefinitions> + <View> + <Name>MCRA.Workspace.Table</Name> + <ViewSelectedBy> + <TypeName>MCRA.Workspace</TypeName> + </ViewSelectedBy> + <TableControl> + <TableHeaders> + <TableColumnHeader> + <Label>Modified</Label> + <Width>20</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Id</Label> + <Width>6</Width> + <Alignment>right</Alignment> + </TableColumnHeader> + <TableColumnHeader> + <Label>Name</Label> + <Width>50</Width> + </TableColumnHeader> + </TableHeaders> + <TableRowEntries> + <TableRowEntry> + <TableColumnItems> + <TableColumnItem> + <ScriptBlock> + $_.modified.ToString('dd-MM-yyyy HH:mm') + </ScriptBlock> + </TableColumnItem> + <TableColumnItem> + <PropertyName>id</PropertyName> + </TableColumnItem> + <TableColumnItem> + <PropertyName>Name</PropertyName> + </TableColumnItem> + </TableColumnItems> + </TableRowEntry> + </TableRowEntries> + </TableControl> + </View> + <View> + <Name>MCRA.Workspace.List</Name> + <ViewSelectedBy> + <TypeName>MCRA.Workspace</TypeName> + </ViewSelectedBy> + <ListControl> + <ListEntries> + <ListEntry> + <ListItems> + <ListItem> + <PropertyName>id</PropertyName> + </ListItem> + <ListItem> + <PropertyName>name</PropertyName> + </ListItem> + <ListItem> + <PropertyName>description</PropertyName> + </ListItem> + <ListItem> + <PropertyName>tags</PropertyName> + </ListItem> + <ListItem> + <PropertyName>created</PropertyName> + </ListItem> + <ListItem> + <PropertyName>modified</PropertyName> + </ListItem> + <ListItem> + <PropertyName>SourceURL</PropertyName> + </ListItem> + </ListItems> + </ListEntry> + </ListEntries> + </ListControl> + </View> + <View> + <Name>MCRA.Workspace.Wide</Name> + <ViewSelectedBy> + <TypeName>MCRA.Workspace</TypeName> + </ViewSelectedBy> + <WideControl> + <WideEntries> + <WideEntry> + <WideItem> + <PropertyName>name</PropertyName> + </WideItem> + </WideEntry> + </WideEntries> + </WideControl> + </View> + </ViewDefinitions> +</Configuration> diff --git a/Powershell/README.md b/Powershell/README.md new file mode 100644 index 0000000000000000000000000000000000000000..96d336bcabb910150e7990d61beeffcd358e39e8 --- /dev/null +++ b/Powershell/README.md @@ -0,0 +1,49 @@ +# How to use the MCRA scripts + +## Quick start + +### Load Module +Open a **powershell** and load the directory with the module. No backslash at the end! +``` +Import-Module -Path .\MCRA.Tools +``` +Perhaps put this in your profile? Do ``notepad $profile``. + +### Store credential +You have to supply your username and password for the MCRA site. +Choose a TargetName to your liking. This is a name to which this credential is referred. +``` +Write-MCRACredential -TargetName MCRA9 -Credential (Get-Credential) +``` + +### Browse your repositories +``` +Get-MCRARepository -Url 'https://mcra.test.wur.nl/Mcra90' -Keyring MCRA9 +``` +For more convenience, store the defaults (perhaps in your profile; do ``notepad $profile``) +``` +$PSDefaultParameterValues = @{ + 'Get-MCRARepository:Url' = 'https://mcra.test.wur.nl/Mcra90' + 'Get-MCRARepository:Keyring' = 'MCRA9' + 'Get-MCRADataSource:Url' = 'https://mcra.test.wur.nl/Mcra90' + 'Get-MCRADataSource:Keyring' = 'MCRA9' + 'Get-MCRAWorkspace:Url' = 'https://mcra.test.wur.nl/Mcra90' + 'Get-MCRAWorkspace:Keyring' = 'MCRA9' + 'Get-MCRAFile:Url' = 'https://mcra.test.wur.nl/Mcra90' + 'Get-MCRAFile:Keyring' = 'MCRA9'} +``` +Happy Powershelling: +``` +Get-MCRARepository +Get-MCRARepository|Where Name -match 'agg' +Get-MCRARepository|Where Id -eq 87 +``` +### Questions? +``` +Get-Help Get-MCRARepository -Full +``` +### Examples? +``` +Get-Help Get-MCRARepository -Example +``` +