Powershell : 偵測及記錄軟體回報(Java為例)
這一段Script是用在來蒐集電腦裡特定軟體的安裝與否來用的。可以用GPO放到使用者登入後執行,或是請使用者自行點擊執行。
我的使用情境是因為國外總部要蒐集我們分公司安裝Oracle Java SE/RE的狀況,以及後續需要保留或安裝移除JavaSE的電腦來做紀錄,
因此我主程式用的是Powershell,然後由Bat來呼叫帶入參數來決定要要寫入哪一個CSV檔案
概念上已偵測機碼位置為主,以後想換成別的軟體只要把偵測的方式替換掉就好了
#JavaDetection.ps1
Param
(
[String]$Logfilename = "Nothing"
)
"Logfilename=$Logfilename"
Function LogWrite
{
Param([string]$logstring)
[String]$Logfile = "fileserver\IT\CSV_Log\$Logfilename"
Add-content -path $Logfile -Value $logstring
}
$breaktime = 2000
$Now = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
$ips = [Net.Dns]::GetHostAddresses($env:computername) |
Where-Object { $_.AddressFamily -eq 'InterNetwork' } |
Select-Object -Expand IPAddressToString
$RegistryPathJava8231 = "HKLM:SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment"
If(!(Test-Path $RegistryPathJava8231))
{
$JavaInstall = "No"
$javaver = "N/A"
$Javaexpath = "N/A"
}
else
{
$JavaInstall = "Yes"
$javaver= Get-ChildItem "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment" | Select-Object -expa pschildname -Last 1
$Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\$Javaver\" -Name JavaHome).JavaHome
}
$logstring = "$Now;$env:USERNAME;$env:COMPUTERNAME;$ips;$JavaInstall;$javaver;$Javaexpath"
LogWrite $logstring
IF ($JavaInstall -eq "Yes")
{
Write-Host "You have Java runtime environment installed in your computer."
Write-Host "Java version : $javaver"
Write-Host "Java Home : $Javaexpath"
}
else
{
Write-Host "You don't have Java runtime environment in your computer."
}
Start-Sleep -m $breaktime
批次部分只要後面加-Logfilename的參數並指定完整檔名
REM Javacollect.bat
Powershell %~dp0JavaDetection.ps1 -Logfilename 'JavaRemovedList.csv'
放在同一個目錄就可以偵測Java是否有安裝,以及安裝版本和Java的執行位置
CSV收集到的會是:時間戳記;登入帳號;電腦名稱;IP;Yes/NO是否安裝;版本;路徑
2021-06-10 15:06:19;neoabc;computername;1.2.3.4;No;N/A;N/A
2021-06-10 17:30:59;neoabc;computername;1.2.3.4;Yes;1.8.0_231;C:\Program Files (x86)\Java\jre1.8.0_231
上面是有沒有安裝Java,蒐集到資料的差別。到Excel打開做資料分割就會很容易變成表格方便統計了。以上這只是一個設計概念,寫的彈性多一點可以用在未來很多情境。