在Powershell中使用加密密码作为CMD的参数

时间:2016-10-14 20:20:09

标签: powershell

我正在尝试通过Powershell执行Oracle EXPDP(Oracle Data Pump)命令,使用加密的密码文件,这样我就可以将我的数据库密码保留在我的git repo之外。以下是我生成文件的代码:

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

显然Password1不是实际的密码,但你明白了......

我想编写一个脚本来解密该文件,然后采取解密的"密码1" value并在expdb命令中将其用作我的db密码。这是我到目前为止所提出的:

$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

执行此操作时,出现以下错误:

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: 

我认为我需要使用等同于" toString"命令使其成为命令行的完全纯文本。任何人都知道这是什么,或者是否有办法使用PSCredential对象来做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:5)

密码本身不会解密,因此您需要自己完成。最简单的方法是创建PSCredential对象,建议为@briantist。它允许通过其GetNetworkCredential()方法检索(未加密的)密码。

$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 + ...

但是,您将未加密的密码存储在文件中,并且您的外部命令似乎仍然需要纯文本凭据,因此在从文件到命令的传输过程中,我没有看到加密密码的重点。这就像在空旷的地方建造一座大门。

useless gate is useless

答案 1 :(得分:0)

我想知道问题是否是您自己的密码。您必须注意密码中的特殊字符。例如,&符号&或竖线|或重定向字符<>或引号'(尤其是双"),甚至是插入符号{{1}可能会导致问题,因为它们是命令解释程序的特殊字符。你如何逃避这些将是不同的,所以这取决于你有哪些。

您可以先使用一个非常简单的密码尝试相同的操作,看看它是否有效,如果是这样,您可以从仅包含字母数字的密码开始,然后一次添加一个特殊字符以查看它们是否有效。