教學目標

初步了解在 Windows Server 作業系統中更新 SAS 授權檔的基本概念。

相關資源

首先 SAS 管理員每年有一次最重要的工作就是更新 SAS 授權碼,我們除了需要透過 SAS Deployment Manager 工具選擇「更新 SAS 軟體」選項來更新 SAS Foundation 的授權碼,以及更需要透過 SAS Deployment Manager 工具選擇「更新中繼資料中 SID 檔案」選項來更新中繼資料中的授權資訊,將授權資訊儲存在中繼資料中,以利中間層的網站應用程式能夠存取授權資訊之後檢查授權檔是否有效,此外並非所有解決方案皆要求將 SAS 授權檔儲存在中繼資料中,至於有哪些解決方案需要更新呢?請參考 SAS Note 官方文件

接著如果我們要檢查 SAS Foundation 授權的狀態,則我們能夠開啟 SAS Enterprise Guide 工具登入一般使用者帳號執行 SAS 程式碼「PROC SETINIT;RUN;」,在 SAS 日誌中返回 SAS 授權檔的詳細資訊,其中會有到期日 (Expiration Date)、寬限期 (Grace Period) 和警告期 (Warning Period),所謂到期日主要代表該軟體將於何時到期,但在寬限期內不會發生任何事情,而在警告期間,SAS 日誌中的資訊將會警告使用者軟體即將過期,當警告期結束時,SAS 軟體將會停止運作,「PROC SETINIT;RUN;」僅檢查 SAS Foundation 授權的狀態,而不是中繼資料中的授權檔資訊。

再來如果我們要檢查 SAS 中繼資料伺服器中的授權檔資訊,則我們能夠開啟 SAS Management Console 工具登入管理員帳號選擇查看中繼資料應用程式中查看 setinit 詳細資訊。請注意如果 SAS Foundation 授權已經更新,但是儲存在中繼資料中的授權已經過期,則網站應用程式將會無法正常登入執行,請注意若是有拆分多台 SAS App 應用程式伺服器,則必須要將所有 SAS App 應用程式伺服器的個別授權檔皆儲存至中繼資料伺服器中,再重新啟動 SAS 所有服務,才能夠確保 SAS 所有服務皆已經存取正確的授權檔資訊。

最後 SAS 9 平台僅有特定網站應用程式,像是 SAS Visual Analaytics 網站應用程式才能夠設定授權碼到期前的通知信,但是無法設定到期前幾天,或者僅能夠透過 SAS Environment Manager 設定授權碼到期幾天之前的通知信,但是不建議使用 SAS Environment Manager,因為會有資安弱掃和系統效能的問題。至於其它解決方案通常需要管理員定期查看 SAS Foundation 中的 SAS 授權碼資訊,此時對於企業客戶來說將會造成維運上的困擾,所以若是真有需要設定授權碼到期前幾個月發送通知信,則能夠撰寫以下可參考的 Powershell 腳本指令,並且將此腳本指令設定至 Windows 工作排程器中,並且請注意執行的使用者權限必須有相關資料夾的存取權限,此外此篇文章僅提供可參考的客製化程式碼,如果要部署至企業環境中,則需要有專業顧問提供客製化修改和調整的服務。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"PROC SETINIT;RUN;" | ac "<SAS Config>Utilitiessetinit.sas"
$notification_month = <N>
$log_path = "<SAS Config>Utilitiessetinit.log"
$code_path = "<SAS Config>Utilitiessetinit.sas"
$smtp_server = "<SMTP Server>"
$smtp_from = "<Email Sender>"
$smtp_to = "<Email Receiver>"
$smtp_subject="<Email Subject>"
$smtp_body="<Email Body>"
.sas.exe -sysin $code_path -log $log_path
$expiration = select-string -Path $log_path -Pattern Expiration | select line | ft -hidetableheaders | Out-String
$expiration = $expiration.substring(16, 9)
$expiration
$expiration_date = [datetime]::parseexact($expiration, 'ddMMMyyyy', $null)
$expiration_date
$current_date = (get-date)
if($current_date.AddMonths($notification_month) -gt $expiration_date ){
Send-MailMessage -SmtpServer $smtp_server -From $smtp_from-To $smtp_to -Subject $smtp_subject -Body $smtp_body
}

相關資源