Windows 的事件檢視器一直有許多人詬病,相當不好用!
光是大量的事件,就要等待半天;在加上沒辦法隨心所欲的設定關鍵字查詢
剛好前一陣子有人在問購買軟體來處理事件紀錄,個人是覺得很浪費錢。
因為現成軟體雖然方便,但是彈性很差。
所以就寫了個簡單的Powershell 程式給大家參考
Windows 的事件檢視器一直有許多人詬病,相當不好用!
光是大量的事件,就要等待半天;在加上沒辦法隨心所欲的設定關鍵字查詢
剛好前一陣子有人在問購買軟體來處理事件紀錄,個人是覺得很浪費錢。
因為現成軟體雖然方便,但是彈性很差。
所以就寫了個簡單的Powershell 程式給大家參考
Function Send-Chat{
Param(
[string] $Msg
)
Add-Type -AssemblyName System.Web
$url = "http://your ip:port/webapi/entry.cgi?api=SYNO.Chat.External&method=incoming&version=2&token=%22el3fotmx3xHbiXGz17aTTXFUJ5DTzgun6bwhLA5bfqso%22"
$json = 'payload={{"text": "{0}"}}' -f [System.Web.HttpUtility]::UrlEncode($Msg)
Try{
$Response = Invoke-WebRequest -Uri $url -Method POST -Body $json
}Catch [exception]{
$_
}
}
Send-Chat ("{0:yyyy-MM-dd HH:mm:ss} DB Server CPU Loading {1:f0}%, Memory Loading {2:f0}%" -f (Get-Date), $CPUSensor, $MemSensor)
Param ([switch]$Verbose)
$VerboseStatus = $VerbosePreference
If($Verbose){
$VerbosePreference = "Continue"
}
If(-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")){
$ScriptFullPath = $MyInvocation.MyCommand.Definition
$arguments = "& '" + $ScriptFullPath + "'"
# 另外以管理者身分執行 PowerShell,並載入 Script 來執行
Start-Process powershell -Verb runAs -ArgumentList $arguments
# 中斷後面程式指令
Break
}
Write-Verbose "伺服器管理員不要每次開機都顯示"
New-ItemProperty -Path HKCU:\Software\Microsoft\ServerManager -Name DoNotOpenServerManagerAtLogon -PropertyType DWORD -Value “0x1” –Force | Out-Null
Write-Verbose "關閉 IE 增強安全性"
$AdminKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"
Set-ItemProperty -Path $AdminKey -Name "IsInstalled" -Value 0
$UserKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}"
Set-ItemProperty -Path $UserKey -Name "IsInstalled" -Value 0
Stop-Process -Name Explorer
Write-Verbose "關閉使用者存取控制(UAC)"
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "ConsentPromptBehaviorAdmin" -Value 00000000
Write-Verbose "設定微軟注音輸入法,預設為英文模式"
Set-ItemProperty "HKCU:\Software\Microsoft\IME\15.0\IMETC" -Name "Default Input Mode" -Value 0x00000001
Write-Verbose "設定電源模式-高效能"
& "powercfg.exe" /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
Write-Verbose "設定電源模式-高效能-永不關閉螢幕"
& "powercfg.exe" -change -monitor-timeout-ac 0
Write-Verbose "開機自動登入系統"
$usrname = 'user'
$password = 'mypasswd'
$RegistryLocation = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'
Set-ItemProperty $RegistryLocation -Name 'AutoAdminLogon' -Value '1'
Set-ItemProperty $RegistryLocation -Name 'DefaultUsername' -Value "$usrname"
Set-ItemProperty $RegistryLocation -Name 'DefaultPassword' -Value "$password"
Write-Verbose "設定時區、指定校時伺服器並校時"
$TimeZone = "Taipei Standard Time"
$NTPServer1 = "time1.google.com"
$NTPServer2 = "time.windows.com"
$NTPServer3 = "time.nist.gov"
Set-TimeZone -Id $TimeZone -PassThru | Out-Null
Push-Location
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers
Set-ItemProperty . 0 $NTPServer1
Set-ItemProperty . 1 $NTPServer2
Set-ItemProperty . 2 $NTPServer3
Set-ItemProperty . "(Default)" "0"
Set-Location HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Parameters
Set-ItemProperty . NtpServer $NTPServer1
Pop-Location
Stop-Service w32time
Start-Service w32time
Write-Verbose "變更網路區域為 Private (Not Public)"
$NetAdapter = (Get-NetConnectionProfile -IPv4Connectivity Internet).InterfaceIndex
Set-NetConnectionProfile -InterfaceIndex $NetAdapter -NetworkCategory Private
$VerbosePreference = $VerboseStatus
If($Host.Name -eq "ConsoleHost"){
Pause
}
先設定一個陣列 $tempfolders ,用來存放所有暫存檔路徑
然後使用 Remove-Item 指令來強制刪除檔案(force),包含子目錄(recurse)
因為有些暫存檔,有可能正在使用,是無法刪除的,會造成指令發出錯誤訊息,所以最後加上參數 -ErrorAction SilentlyContinue,當發生錯誤時,安靜地繼續執行指令
最後,清除垃圾桶,也是一樣的
$tempfolders = @("C:\Windows\Temp\*", "C:\Windows\Prefetch\*", "C:\Documents and Settings\*\Local Settings\temp\*", "C:\Users\*\Appdata\Local\Temp\*")
Remove-Item $tempfolders -force -recurse -ErrorAction SilentlyContinue
Clear-RecycleBin -Force -ErrorAction SilentlyContinue
如果要清除特別命名方式的檔案,或是不確定檔案位置的話,歡迎留言討論
網路上查到的PowerShell 讀取 LDAP 資訊,幾乎清一色都是讀取 Active Directory....
很少講到如何讀取 Linux LDAP Server
找了好久,終於找到 C# 讀取 LDAP 的資訊,改成 PowerShell
這次會想寫這個程式,是因為公司打算將 G Workspace 轉移到 Synology NAS
公司本來也沒有使用 AD or LDAP 做驗證,打算將帳號整合到 LDAP 做未來準備。
轉移郵件的功能 MailPlus 本身的功能就很完整,不需要太多操心
但是Synology Drive 卻沒辦法自動批次轉移全公司的 Google Drive!
使用Cloud Sync ,必須讓使用者自行操作,也沒辦法限制使用者只能加入指定的 Google Workspace
幸運的是,Synology Active Backup for G Suite可以將全部使用者的Google Drive 都備份下來,只要把使用者備份檔案複製到使用者家目錄,就可以正常在Synology Drive 使用。
只是因為整合了 LDAP 驗證,所以家目錄變成 "帳號-LDAP uidNumber" 這樣的格式。
手動去建立家目錄也很麻煩(一兩百個帳號),用PowerShell 讀取 LDAP 也有點麻煩,所以最簡單的方法就是使用者登入Synology NAS,Synology NAS 會自動建立家目錄。
以下不多說,就直接看程式吧
之前在每個 Page 變動後,都去偵測 $ie.ReadyState = 4 或是 $ie.Busy = $False 程式才繼續執行,都會發生錯誤
後來改成檢查 $ie.Document.getElementById('ext-gen84') 是否為物件也會誤判
再改成檢查 $ie.Document.getElementById('ext-gen84') 是否存在,也還是會誤判
最後改成判斷 $ie.Document.getElementById('ext-gen84')的 Type 才成功。