【问题标题】:How Can I Script Oracle Wallet Changes?如何编写 Oracle 钱包更改脚本?
【发布时间】:2011-05-08 18:30:13
【问题描述】:

我使用 Oracle 钱包来存储我连接到的数据库的密码。我们的密码政策要求我们频繁更改密码,以至于我想编写更改脚本。我有一个可以自己更改数据库密码的批处理文件,但我也想编写对钱包的更改的脚本。问题是调用mkstore后必须输入钱包密码,密码不能作为参数传递。有没有办法在钱包中编写凭证更改脚本?

【问题讨论】:

    标签: oracle batch-file sqlplus windows-scripting oracle11gr2


    【解决方案1】:

    至少11g:

    orapki wallet change_pwd -wallet {wallet directory}  \
                  -oldpwd {old password}   -newpwd  {new password}
    

    我尚未测试密码是否在 ps -fe|grep 可见的进程行中被混淆。

    【讨论】:

    • 感谢您的回答。如果我错了,请纠正我,但这会更改钱包本身的密码,而不是钱包中的凭据。
    【解决方案2】:

    这是我想出的一个 Powershell 脚本。要求:

    1. PowerShell 已安装。
    2. 脚本已启用(Set-ExecutionPolicy RemoteSigned 以管理员身份运行)。
    3. 脚本位于 c:\oracle\WalletCreator。
    4. 来自Windows Automation Snapin for PowerShell 的Wasp.dll 位于脚本文件夹中。

    钱包将在 c:\oracle\Wallets 中创建。这是脚本。

    Import-Module c:\oracle\WalletCreator\WASP.dll
    
    $WalletCreated = 0
    
    cls
    Write-Host "                                                           " -foregroundcolor White -backgroundcolor DarkRed
    Write-Host "   Warning: This script will delete your current wallet.   " -foregroundcolor White -backgroundcolor DarkRed
    Write-Host "                                                           " -foregroundcolor White -backgroundcolor DarkRed
    
    do {
        #Get credentials
        Write-Host " " 
        Write-Host " New Wallet Entry                                          " -foregroundcolor White -backgroundcolor DarkGreen
        Write-Host "    To exit press return without entering anything.        " -foregroundcolor White -backgroundcolor DarkGreen
        $DB = Read-Host "Connection Name"
        if ($DB -eq "") {
           Return
        }
        $Username = Read-Host "       Username"
        if ($Username -eq "") {
           Return
        }
        $Password = Read-Host -AsSecureString "       Password" 
    
        #Convert from SecureString to String.
        $BasicString = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
        $Password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BasicString)
        if ($Password -eq "") {
           Return
        }
    
        if ($WalletCreated -eq 0) {
            #Create folder in case it doesn't exist.
            md c:\oracle\Wallets -Force | Out-Null
    
            #Delete any wallet in the folder now.
            del c:\oracle\Wallets\*.* | Out-Null
    
            #Get GUID for wallet password.
            $WalletPassword = [guid]::NewGuid().toString()
            $WalletPassword = $WalletPassword + "`r"
    
            #Create Wallet.
            Start-Process -FilePath mkstore -ArgumentList "-wrl c:\oracle\Wallets\ -create"
            Start-Sleep -Milliseconds 500
            Select-Window -ProcessName cmd | Select -First 1 | Send-Keys -keys $WalletPassword
            Start-Sleep -Milliseconds 300
            Select-Window -ProcessName cmd | Select -First 1 | Send-Keys -keys $WalletPassword
    
            $WalletCreated = 1
            Start-Sleep -Milliseconds 1000
        }
    
        #Create Credential.
        $CC = "-wrl c:\oracle\Wallets\ -createCredential " + $DB + " " 
        $CC = $CC + $Username + " " + $Password
        Start-Process -FilePath mkstore -ArgumentList $CC
        Start-Sleep -Milliseconds 300
        Select-Window -ProcessName cmd | Select -First 1 | Send-Keys -keys $WalletPassword
        Start-Sleep -Milliseconds 1000
    } 
    until ($DB -eq "")
    

    【讨论】:

      【解决方案3】:

      通过 echo 获取存储的密码,以便您编写脚本。

      回显 "$passwd" |

      回显“钱包密码”| mkstore -wrl。 -listCredential

      这将列出输出,同样适用于所有 mkstore、orapki 的命令

      【讨论】:

      • 这适用于 linux,但不适用于 windows。
      【解决方案4】:

      AutoHotKey 解决方案:

      ; CreateWallet.ahk
      
      #NoEnv
      SetWorkingDir %A_ScriptDir%
      CoordMode, Mouse, Window
      SendMode Input
      #SingleInstance Force
      SetTitleMatchMode 2
      #WinActivateForce
      SetControlDelay 1
      SetWinDelay 0
      SetKeyDelay -1
      SetMouseDelay -1
      SetBatchLines -1
      
      
      Macro1:
      Random, WalletPassword, 10000000000, 9999999999999999999999999
      WalletPassword := WalletPassword "ExtraCharacters"
      InputBox, Username, Username, Please enter your database username, , , , , , , , lriffel
      InputBox, DatabasePassword, Database Password, Please enter the database password., HIDE
      Run, c:\windows\system32\cmd.exe, c:\
      Sleep, 500
      Send, md c{:}\oracle\Wallet{enter}
      Sleep, 200
      Send, cd c{:}\oracle\Wallet{enter}
      Sleep, 200
      Send, del -s c{:}\oracle\Wallet\*.*{enter}
      Sleep, 200
      Send, Y{enter}
      Sleep, 200
      Send, mkstore -wrl c:\oracle\Wallet\ -create{enter}
      Sleep, 200
      Send, %WalletPassword%{enter}
      Sleep, 200
      Send, %WalletPassword%{enter}
      Sleep, 200
      Loop, Read, F:\Programs\CreateWallet\dbs.txt
      {
          WinHide, ahk_class ConsoleWindowClass
          Sleep, 333
          Send, mkstore -wrl c:\oracle\Wallet\ -createCredential %A_LoopReadLine% %Username% %DatabasePassword%{enter}
          Send, %WalletPassword%{enter}
          Sleep, 200
          Send, cls{enter}
          Sleep, 200
          WinShow, ahk_class ConsoleWindowClass
          Sleep, 550
      }
      Send, exit{enter}
      MsgBox, 64, Wallet Created, Wallet Created
      Return
      
      ; This script was created using Pulover's Macro Creator
      ; www.macrocreator.com
      

      【讨论】:

        【解决方案5】:

        文件中的 Windows 管道有效。 我将钱包密码放在 2 个单独的行上,因此它可以用于创建钱包以及 -createCredential:

        set PW=\MySecureFolder\MyWalletPasswordOn2Lines.txt
        mkstore -wrl . -create < %PW%
        

        当然,脚本最初可以提示并创建文件,完成后删除文件。把它放在一个管理员专用的文件夹中,以防脚本异常终止。

        【讨论】:

          猜你喜欢
          • 2015-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          • 1970-01-01
          • 2012-11-01
          • 1970-01-01
          相关资源
          最近更新 更多