iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
佛心分享-我的私藏工具箱

作業系統的專武系列 第 29

壓箱寶:PowerShell雙帳密過版

  • 分享至 

  • xImage
  •  

在Day 15有分享用DOS過版Tableau,但每次過版都需要Tableau Owner及DBA同時在場,當時與客戶IT研究,將DOS Script透過7-zip工具轉成exe,DB帳密存在裡面,然後再交付給Tableau Owner過版,就不用DBA到場,而DB的密碼若改變,可以再交出新的exe給Tableau Owner。
然而現實很骨感,用7-zip包出的exe,雖然是二進位檔不擔心密碼外洩,但會被IT偵測不明來源軟體而狂發告警,所以試著找PowerShell的ps1轉成exe的工具,結果不但有,而且是微軟官方的,執行了也不會被偵測告警來源不明軟體。分享網址如下:
https://github.com/MScholtes/TechNet-Gallery/tree/master/PS2EXE-GUI
上一層目錄提供不少工具:https://github.com/MScholtes/TechNet-Gallery
下載TechNet-Gallery後,有很多ps1工具,但最最主要的是PS2EXE-GUI。
工作開始....

# MakeExeUAT.ps1
$account = Read-Host "Enter DB Account"
if (-not(Test-Path -Path ./"${account}.ini")) {
    Write-Host "No config for $account"
    Exit
}
$content = ( Get-Content .\${account}.ini | ConvertFrom-StringData)
$content = $content + @{dbaccount=$account}
$securePwd = Read-Host "Enter password" -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePwd))
$securePwd2 = Read-Host "Enter password Again" -AsSecureString
$plainPwd2 =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePwd2))
if ($plainPwd -cne $plainPwd2) {
    Write-Host "Password Inconsistent"
    Exit
}
$content = $content + @{dbpwd=$plainPwd}
"#publish.ps1 " | Out-File "publish.ps1"
$content.Keys | % {
    "`$$_ = " + '"' + $content.$_ + '"' | Add-Content "publish.ps1"
}
Get-Content .\publishUAT.ps1 | Add-Content "publish.ps1"
# 產出exe要改檔名,以DB Account前綴:RPT_publish.exe
."D:\TechNet-Gallery-master\PS2EXE-GUI\ps2exe.ps1" .\publish.ps1 ".\${account}_publishUAT.exe" -verbose
# Remove-Item .\publish.ps1

【說明】

  • 這支ps1是給DBA輸入帳密產出過版用的exe(如本例的RPT_publishUAT.exe,RPT是DB帳號號),而交付DBA前可以透過ps2exe.ps1工具將本支ps1轉成MakeExeUAT.exe,ps2exe.ps1用法在倒數第二列。
  • 程式一開始是要求DBA輸入DB帳號,若同目錄沒該帳號的ini檔會結束程式,該ini是該DB帳號進行過版所需資訊,比如路徑、url等。ini檔的內容會連同DB帳號、密碼一併寫到$content這個雜湊變數。這中間有做密碼double check,邦友請自行參考。
  • 最後先將一行註解(#publish.ps1)寫到publish.ps1裡,隨後把$content內容一一加到publish.ps1,再把模版檔publishUAT.ps1加進publish.ps1,透過ps2exe.ps1將publish.ps1轉成前綴DB帳號的publishUAT.exe,而正式環境的話,Remove-item publish.ps1必須在,因為DB密碼是以明文方式寫在裡面,所以必須刪除。

模版檔(publishUAT.ps1)內容如下:

$account = Read-Host "Enter Tableau Account"
$securePwd = Read-Host "Enter Tableau's password" -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePwd))
$NOW = Get-Date -format "yyyyMMdd"
$folder = $folder.replace("YYYYMMDD", $NOW)

Get-ChildItem -Path $folder | ForEach {
    $logfile =  $_.FullName.replace('.twb', '.log')
    & $tabcmd publish $_.FullName -n $_.BaseName -s $url --username $account --password $plainPwd --db-username $dbaccount --db-password $dbpwd --Project $project --save-db-password --save-oauth --overwrite --tabbed 2> $logfile
}
  • 輸入Tableau帳密後,從當天日期目錄一一讀twb檔進行過版。可以看到像$tabcmd、$url、$folder、$dbaccount、$dbpwd、$project等變數根本不存在,內容來自MakeExeUAT.ps1的$content,真正的publish.ps1內容如下,再轉成執行檔交給Tableau Owner過版用。
#publish.ps1 
$project = "RPT_PRJ"
$url = "http://localhost:8000"
$folder = "D:\UAT\YYYYMMDD_UAT\TABLEAU\*.twb"
$tabcmd = "D:\Program Files\Tableau\Tableau Server\10.5\bin\tabcmd.exe"
$dbaccount = "RPT"
$dbpwd = "RPT1234"
$account = Read-Host "Enter Tableau Account"
$securePwd = Read-Host "Enter Tableau's password" -AsSecureString
$plainPwd =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePwd))
$NOW = Get-Date -format "yyyyMMdd"
$folder = $folder.replace("YYYYMMDD", $NOW)

Get-ChildItem -Path $folder | ForEach {
    $logfile =  $_.FullName.replace('.twb', '.log')
    & $tabcmd publish $_.FullName -n $_.BaseName -s $url --username $account --password $plainPwd --db-username $dbaccount --db-password $dbpwd --Project $project --save-db-password --save-oauth --overwrite --tabbed 2> $logfile
}

所以之後只要DB密碼變更到期,DBA再用MakeExeUAT.exe產出新的publishUAT.exe交付Tableau Owner處理過版就好,節省大伙寶貴的時間。
而這支專案也可以做得更好。改善方向如下:

  • DBA輸入帳密後,無法確認該帳密能連上DB。
  • 密碼受限,特別是像$、雙引號等,是PowerShell關鍵字,會導致編譯exe失敗。

第29天了,推出壓箱寶


上一篇
PowerShell五四三
下一篇
IT第三人
系列文
作業系統的專武30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言