2016-10-14 1 views
1

Ich versuche, eine Oracle EXPDP (Oracle Data Pump) -Befehl über Powershell, mit einer verschlüsselten Passwort-Datei, so dass ich meine Datenbank-Passwort aus meinem git Repo halten kann. Hier ist, was mein Code die Datei zu erzeugen, wie folgt aussieht:benutze verschlüsselte Passwort als Parameter für CMD in Powershell

"Password1" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\Backups\dbPassword.txt"

Offensichtlich Password1 nicht das eigentliche Passwort, aber Sie bekommen die Idee ...

Ich möchte ein Skript schreiben, zu entschlüsseln, dass Datei, nehmen Sie dann den entschlüsselten "Password1" -Wert und verwenden Sie ihn im expdb-Befehl als mein db-Passwort. Hier ist, was ich mit so weit habe kommen:

$dbPassword = cat C:\backups\dbPassword.txt | convertto-securestring -AsPlainText -Force 
$timeStamp = "$(get-Date -f MMddyyyy)" 
$expdb = 'EXPDP' 
$dbCredential = 'system/'+$dbPassword 
$expdbDirectory = 'directory=backups' 
$expdbFull = 'full=Y' 
$expdbDRFileNamePrefix = 'EXPALL_DR_' + $timeStamp 
$expdbDRFileNameDMP = $expdbDRFileNamePrefix + '.DMP' 
$expdbDRFileNameLOG = $expdbDRFileNamePrefix + '.log' 
$expdbDRFile = 'file=' + $expdbDRFileNameDMP 
$expdbDRLog = 'log=' + $expdbDRFileNameLOG 

$command = $expdb + ' ' + $dbCredential + ' ' + $expdbDirectory + ' ' + $expdbFull + ' ' + $expdbDRFile + ' ' + $expdbDRLog 

Invoke-Expression $command 

Als ich dies ausführen, ich die folgende Fehlermeldung erhalten:

EXPDP : 
At line:1 char:1 
+ EXPDP system/System.Security.SecureString directory=backups full=Y fi ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

Export: Release 11.2.0.1.0 - Production on Fri Oct 14 16:09:55 2016 
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 
UDE-01017: operation generated ORACLE error 1017 
ORA-01017: invalid username/password; logon denied 
Username: 

Ich nehme an, ich brauche das Äquivalent eines „toString“ Befehl verwenden um den Text für die Befehlszeile vollständig zu formatieren. Weiß jemand, was das ist, oder ob es eine Möglichkeit gibt, das PSCredential-Objekt dazu zu verwenden?

Danke!

+0

Warum verschlüsseln Sie die Datei? Wenn Sie die Datei .gitigure, können Sie auch einfach den pw-Klartext beibehalten und dieses Problem umgehen. –

+0

so lassen Sie das Passwort als Nur-Text auf dem Server, aber ignorieren es in git? Ich nehme an, aber die Verschlüsselung bietet zusätzliche Sicherheit, auch wenn es nur Sicherheit durch Unklarheit ist. –

+0

Ein verschlüsseltes Passwort entschlüsselt sich nicht magisch, nur weil Sie es wollen. Ihre Kommandozeile erwartet sowieso ein Klartext-Passwort, also ist es sinnlos, ein unverschlüsseltes Passwort aus einer Datei zu lesen, zu verschlüsseln und dann wieder zu entschlüsseln, um es tatsächlich benutzen zu können. –

Antwort

2

Das Passwort entschlüsselt sich nicht selbst, Sie müssen es also selbst tun. Der einfachste Weg, dies zu tun, ist ein PSCredential Objekt zu erstellen, wie @briantist vorgeschlagen. Es ermöglicht das Abrufen des (unverschlüsselten) Passwortes über seine GetNetworkCredential() Methode.

$dbPassword = Get-Content 'C:\backups\dbPassword.txt' | 
       ConvertTo-SecureString -AsPlainText -Force 
$cred = New-Object Management.Automation.PSCredential('system', $dbPassword) 
... 
$command = $expdb + ' ' + $cred.UserName + '/' + 
      $cred.GetNetworkCredential().Password + ... 

Allerdings sind Speichern Sie das unverschlüsselte Passwort in einer Datei und externen Befehl scheint ohnehin Klartext Anmeldeinformationen zu erwarten, so dass ich nicht einen Punkt in die Verschlüsselung des Passworts während der Übertragung von Dateien auf Befehl sehen . Das wäre wie ein Tor in der Mitte eines leeren Platzes zu bauen.

useless gate is useless

+0

Dies ist in der Nähe. Ich muss etwas debuggen, aber ich werde diese Antwort bearbeiten, wenn ich es nächste Woche bekomme. Es ist aber das Ende der Arbeitswoche für mich. –

+0

Haha das Foto – briantist

+0

Froh, dass Sie es mögen;) –

0

Ich frage mich, ob das Problem Ihr Passwort selbst ist. Sie müssen aufpassen, welche Sonderzeichen im Passwort enthalten sind. Beispielsweise kann ein Und-Zeichen & oder eine Pipe | oder Umleitung Zeichen <> oder ' (insbesondere doppelte ") und sogar Caret ^ Probleme verursachen, weil sie Sonderzeichen für den Befehlsinterpreter sind. Wie du jedem davon entkommst, wird anders sein, also hängt es davon ab, welche du hast.

Sie könnten das Gleiche zuerst mit einem sehr einfachen Passwort versuchen, um zu sehen, ob es funktioniert, und wenn ja, können Sie mit einem Passwort anfangen, das nur alphanumerische Zeichen enthält und dann Sonderzeichen nacheinander hinzufügen, um zu sehen, ob sie funktionieren.

+1

Das OP möchte einen externen Befehl ('expdp') ausführen, der Plaintext-Anmeldeinformationen zu erwarten scheint. Ich sehe nicht, wie ein 'PSCredential' hier helfen wird. –

+0

Gute Dinge zu beachten, obwohl in diesem Fall die komplexesten Zeichen in der Datei sind,! und ?. Der Rest sind Zahlen und Buchstaben. Die Datei sieht jedoch als verschlüsselte Zeichenfolge gut aus. –

+0

@AnsgarWiechers wenn er es immer noch verschlüsselt speichern möchte (manchmal kann man den Zugriff auf das Dateisystem sowie den ausführenden Code nicht einschränken, die Möglichkeit der Exposition minimieren, ** oder muss mit bestimmten Vorschriften umgehen **), Es ist einfacher mit einem '[PSCredential]' zu exportieren/zu importieren, da die Verschlüsselung/Entschlüsselung für Sie erledigt ist, und mit '.GetNetworkCredential()' ist es auch einfacher, das unverschlüsselte Passwort zu bekommen. Wenn er sich entscheidet, den Klartext so zu speichern, wie Sie es in den Kommentaren vorgeschlagen haben, dann ist das alles egal, aber ich gehe auf die Situation ein, in der es auf der Festplatte verschlüsselt bleibt. – briantist

Verwandte Themen