DPXone
Lieutenant
- Registriert
- Mai 2009
- Beiträge
- 554
Hallo Community,
aktuell bin ich gerade mit der Ausarbeitung für eine sinnvolle, einfach handhabare und global einsetzbare Umsetzung für Konfigurations-Dateien für PowerShell-Scripts mit Script-Methoden beschäftigt.
Insbesondere beim Einsatz von GIT ist es natürlich unerlässlich sämtliche Konfigurations-Dateien, welche Endpoint-URIs, Anmeldedaten, Ablageordner, etc enthalten, auszugliedern.
Alles was dynamisch seien soll muss ausgeliedert werden. --> Änderungen am Code (selbst wenn es nur ein Dateipfad ist) wären ein Change im Code, obwohl es nur externe Parameter sind.
Ein vorgeschaltetes Script oder ultimative Parameter sind nicht in meinem Sinne!
Ziel:
Ich will ein PS-Script (auch gerne ein Tool in C#) erstellen, welches via "Export-Clixml" (in C# natürlich anders) eine für das jeweilige Script nutzbare Konfigurations-Datei erstellt, die diverse Properties dynamisch zur Laufzeit aktualisiert und bereitstellt (-->"ScriptMethod" im Falle von PS).
Mein Anfang:
Konfig-Daten auszugliedern ist absolut kein Problem. Entweder über herkömmliches XML,
Oder eben über CliXml, welches auch allerhand Type-Daten mitgibt und ganz wichtig ... PS-Credentials (zumindest das Passwort) out-of-the-box direkt in einen Encrypted Standard String umwandelt (kann man natürlich auch manuell ins Script mit "ConvertFrom-SecureString" einbauen).
Das Konfig-Script würde bei Credentials für Service Accounts mit "Run As ..." ausgeführt werden, damit der Encrypted Standard String (bzw. Secure String nach dem Einlesen) auch nur für den Service Account nutzbar ist. ("Im-/Export-CliXml"-cmdlet verarbeitet Dinge wie SecureString ohne eigenes Zutun.)
Herausforderung:
Ich versuche nun herauszufinden, wie ich direkt in der Hashtable (--> wohl eher Object), die für die Erstellung der Konfig-Datei zuständig ist, Methoden vom Typ "ScriptMethod" hinzufüge, welche unter anderem dann bei Abruf das aktuelle Datum+Uhrzeit und/oder das Root-Verzeichnis zurückgibt, in welchem das finale Script ausgeführt wird.
Wichtig dabei, die Member des Objekts sollten auf Member desselben Objekts Zugriff haben.
Grund ist, damit man global z. B. ein Root-Verzeichnis für Log-Files, ausgehend vom Script-Pfad, definieren kann.
Wie es ja bisher aussieht, speichert die die Cli-konforme XML nur Daten über Properties und nicht über Methoden ....
Missing:
(an PS angelehnter) Pseudocode für die Generierung von Konfig-Files:
Beachtet insbesondere die Pseudo-Generierung von "$settings.Global.Log.ErrorFilePath"
Aktueller Stand:
Irgendwie finde ich leider nichts anwendbares darüber ... aktuell.
Werde auf jeden Fall mal weiter forschen.
Falls ihr direkt eine Idee oder gar einen KnockOut-Kommentar habt, dann bitte gerne her damit.
Viele Grüße
Sven
aktuell bin ich gerade mit der Ausarbeitung für eine sinnvolle, einfach handhabare und global einsetzbare Umsetzung für Konfigurations-Dateien für PowerShell-Scripts mit Script-Methoden beschäftigt.
Insbesondere beim Einsatz von GIT ist es natürlich unerlässlich sämtliche Konfigurations-Dateien, welche Endpoint-URIs, Anmeldedaten, Ablageordner, etc enthalten, auszugliedern.
Alles was dynamisch seien soll muss ausgeliedert werden. --> Änderungen am Code (selbst wenn es nur ein Dateipfad ist) wären ein Change im Code, obwohl es nur externe Parameter sind.
Ein vorgeschaltetes Script oder ultimative Parameter sind nicht in meinem Sinne!
Ziel:
Ich will ein PS-Script (auch gerne ein Tool in C#) erstellen, welches via "Export-Clixml" (in C# natürlich anders) eine für das jeweilige Script nutzbare Konfigurations-Datei erstellt, die diverse Properties dynamisch zur Laufzeit aktualisiert und bereitstellt (-->"ScriptMethod" im Falle von PS).
Mein Anfang:
Konfig-Daten auszugliedern ist absolut kein Problem. Entweder über herkömmliches XML,
Oder eben über CliXml, welches auch allerhand Type-Daten mitgibt und ganz wichtig ... PS-Credentials (zumindest das Passwort) out-of-the-box direkt in einen Encrypted Standard String umwandelt (kann man natürlich auch manuell ins Script mit "ConvertFrom-SecureString" einbauen).
Das Konfig-Script würde bei Credentials für Service Accounts mit "Run As ..." ausgeführt werden, damit der Encrypted Standard String (bzw. Secure String nach dem Einlesen) auch nur für den Service Account nutzbar ist. ("Im-/Export-CliXml"-cmdlet verarbeitet Dinge wie SecureString ohne eigenes Zutun.)
Herausforderung:
Ich versuche nun herauszufinden, wie ich direkt in der Hashtable (--> wohl eher Object), die für die Erstellung der Konfig-Datei zuständig ist, Methoden vom Typ "ScriptMethod" hinzufüge, welche unter anderem dann bei Abruf das aktuelle Datum+Uhrzeit und/oder das Root-Verzeichnis zurückgibt, in welchem das finale Script ausgeführt wird.
Wichtig dabei, die Member des Objekts sollten auf Member desselben Objekts Zugriff haben.
Grund ist, damit man global z. B. ein Root-Verzeichnis für Log-Files, ausgehend vom Script-Pfad, definieren kann.
Wie es ja bisher aussieht, speichert die die Cli-konforme XML nur Daten über Properties und nicht über Methoden ....
Missing:
- Script Methoden via "Export-CliXml" exportieren
- Properties dynamisch gestalten
- Im Object für diverse notwendige Infos auf andere Member des selben "Main-Objekts" zuzugreifen, welche auch schon aktualisiert wurden (durch die Script-Ausführung) (Siehe Beispiel)-
(an PS angelehnter) Pseudocode für die Generierung von Konfig-Files:
Beachtet insbesondere die Pseudo-Generierung von "$settings.Global.Log.ErrorFilePath"
Code:
$settings = @{
Global = @{
Date = Get-Date
DateFormat = 'yyyy-MM-dd' # international date format
DateTimeFormat = 'yyyy-MM-dd HH-mm-ss.fffK' # international dateTime format with milliseconds and time offset
Log = @{
RootFolderPath = $PSScriptRoot # <- dynamical; set on script execution
ErrorFilePath = join-path -Path '<<$settings/Global/Log/RootFolderPath" (not relying on $PSScriptRoot)>>' -ChildPath '<<$settings.Global.Date.toString($settings.Global.DateFormat)_error.csv>>'
WarningFilePath = ''
InfoFilePath = ''
}
}
SystemX = @{
Global = @{
BaseURI = ''
Log = @{
RootFolderPath = '' # <- dynamical; set on script exectioin
}
}
API = @{
Global = @{
Credentials = [pscredential]::new('APIUser','23473288fd7883478943893.......') # <- password is from type secure-string
}
OData = @{
BaseEndpint = ''
}
SOAP = @{
BaseEndpoint = ''
}
}
}
SFTP = @{
Global = @{
Crededentials = [pscredential]::new()
Method = ''
}
}
}
$settings | Export-Clixml -Depth ([int]::MaxValue) -LiteralPath C:\temp\settings.xml -Encoding utf8
Aktueller Stand:
Irgendwie finde ich leider nichts anwendbares darüber ... aktuell.
Werde auf jeden Fall mal weiter forschen.
Falls ihr direkt eine Idee oder gar einen KnockOut-Kommentar habt, dann bitte gerne her damit.
Viele Grüße
Sven
Zuletzt bearbeitet: