分類: Computer Science

Powershell : 偵測Java版本並修改Bat檔/發送信件

Powershell : 偵測Java版本並修改Bat檔/發送信件

會寫出這一段程式,是因為廠商的程式無法改變的情況下,我們只好自己動手了。
起因是,廠商寫了一個Bat檔案,他是用Java執行的,他的程式執行到某些功能會去呼叫這個bat去做某些動作,來看看這個bat(我修改某修路徑避免洩密之嫌)


1
2
3
4
5
6
7
@echo off

echo "PlugIn starting..."

call setenv.bat

"C:\Program Files (x86)\Java\jre1.8.0_181\bin\java.exe" -Xmx512m -DLogConfig=%LogConfig% -DSSL=N -cp %CLASSPATH% -Djava.library.path=%LIB_PATH% -Dfile.encoding=utf-8 com.XXXXXXXX.pl.hdl.PlugInHandler %1%

各位看倌有看到嗎?他把Java路徑寫死了。只要Java一升版(Java升版經由總部派送,User無法得知什麼ˊ時候被更新了),這隻程式就會立刻沒有用。之前做過一隻替換程式,當User發現程式無法執行出現特錯誤的時候,跑一隻我寫的檢查和更新程式,來把bat檔替換掉就可以了。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#讀取WMI物件的作業系統版本
#開頭為10的,為Windows10
#開頭為6的,為Window7
[String]$OS = ((Get-CimInstance win32_OperatingSystem).version).split(".",2)[-2]
[String]$Waitkey = "Job finish. Press Enter to exit:::"
[Bool]$CheckABC = Test-Path "D:\ABC\DEF\GHI"
Switch($OS)
{
    10
        {
            Write-host "Your OperatingSystem is Windows 10 X64"
            $javaver= dir "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1
            $Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\$Javaver" -Name JavaHome).JavaHome

        }
    6
        {
            Write-host "Your OperatingSystem is Windows 7 X86"
            $javaver= dir "HKLM:\SOFTWARE\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1
            $Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\JavaSoft\Java Runtime Environment\$Javaver" -Name JavaHome).JavaHome
        }
}
Write-Host "Your Java Version is $javaver"
Write-Host "Your Java path in $Javaexpath\bin"  
Write-Host "Replace your PlugInHandler.bat with PlugInHandler-$OS-$Javaver.bat."
IF($CheckABC -eq $True)
{
    Copy-Item -Path \\2.3.4.5\AAA\ D:\ABC\DEF\GHI\\PlugInHandler*.* -Destination D:\ABC\DEF\GHI\ -Force
    Copy-Item -Path D:\\ABC\DEF\GHI\PlugInHandler-$OS-$Javaver.bat -Destination D:\\ABC\DEF\GHI\PlugInHandler.bat -Force
}
Else
{
   Write-Host "You don't have ABC"
}
Read-Host $Waitkey

稍微解釋一下,先判斷Windows 7 / 10,因為系統路徑不同
讀取機碼找到最新的Java安裝版本,然後根據系統版本找到預先做好對應版本的bat檔,直接替換檔案並更名。整隻其實只是判斷JRE的版本然後直接替換而已

所以也是要等User自己發現有問題再跑上來點。少了主動通知的功能。這次因為有一台無人值守的公用電腦,被總部派送Java更新之後,廠商的程式就故障了,故障之後連帶影響日常自動化作業,因此,必須另外寫一隻程式來偵測版本更新並且自動發Mail通知我們。
整個Powershell是會放在工作排程裡每30分鐘執行檢查一次,如有發現版本不對就立刻發送郵件到指定信箱,每天的九點不管正不正常都會發送一次通知Mail來得知排程有在正常運行。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
$PlugInHanderPath = "D:\ACB\DEF\GHI\PlugInHandler.bat"                                                                                                 #檔案路徑
$PlugInHanderstring = Get-Content -Path $PlugInHanderPath | Where-Object { $_.Trim() -ne '' }                                                                    #讀取檔案內容去除空白
$PlugInHanderJvPath=$PlugInHanderString |select -Last 1 |%{$_.split('"')[1]}                                                                                     #讀取最末行找出路徑
$javaver= dir "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1
$Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\$Javaver" -Name JavaHome).JavaHome + "\bin\java.exe"
$OS = gwmi win32_operatingsystem | Select -ExpandProperty Version
$SKU = gwmi win32_operatingsystem | Select -ExpandProperty OperatingSystemSKU
$min = Get-Date '09:00'
$max = Get-Date '09:30'
$now = Get-Date

$Sender = 'abc@def.com'
$RecipientAPM = 'abc@def.com'
$RecipientNor = 'abc@def.com'
$Subject = "Java version check."
$IP = Get-NetIPAddress | Where-Object -FilterScript { $_.ValidLifetime -Lt ([TimeSpan]::FromDays(1)) }| Select -ExpandProperty IPAddress

Switch ($SKU)
{
4
    {$Branchver = "CBB"}
125
    {$Branchver = "LTSB/C"}
}
#Write-host "Your PlusInHander Java Excution Path is "$PlugInHanderJvPath
#Write-host "Your PC Java Execuction Path is "$Javaexpath

$BodyAlert = "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$BodyAlert += "<BODY bgcolor=""#ffffff"" style=""font-family: Frutiger, Calibri, times; color: #000000""><P>"
$BodyAlert += "<img src=""https://connect.dhl.com/cmsmedia/ImageLibrary/DPDHL-GROUP-ITS-yellow-bar-600.png"" alt=""Deutsche Post DHL Group IT Services""><BR>"
$BodyAlert += "Hi DGF TW IT Teams<BR><BR>"
$BodyAlert += "<font color=red>Warning!</font><BR> GICHIQ PlugInHander batch file Java is different with system Java Enviorment.<BR>Please go to update.<BR>"
$BodyAlert += "<TABLE style=""background: #e5e5e5;font-weight: normal;font-family: Frutiger, Calibri, times;""><TR><TD>GICHIQ Java Excution Path :</TD><TD><font color=red>$PlugInHanderJvPath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>System Java Execuction Path :</TD><TD><font color=red>$Javaexpath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>Computer Name :</TD><TD>$env:COMPUTERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>OS Verserion :</TD><TD>Windows $OS $Branchver</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>Domain/Username :</TD><TD>$env:USERDOMAIN\$env:USERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>IP Address :</TD><TD>$IP</TD></TR></TABLE><BR>"
$BodyAlert += "Thank you.<BR><BR>"
$BodyAlert += "Your IT Team."

$BodyNormal = "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$BodyNormal += "<BODY bgcolor=""#ffffff"" style=""font-family: Frutiger, Calibri, times; color: #000000""><P>"
$BodyNormal += "<img src=""https://connect.dhl.com/cmsmedia/ImageLibrary/DPDHL-GROUP-ITS-yellow-bar-600.png"" alt=""Deutsche Post DHL Group IT Services""><BR>"
$BodyNormal += "Hi DGF TW IT Teams<BR><BR>"
$BodyNormal += "GICHIQ PlugInHander batch file Java is same with system Java Enviorment.<BR>"
$BodyNormal += "<TABLE style=""background: #e5e5e5;font-weight: normal;font-family: Frutiger, Calibri, times;""><TR><TD>GICHIQ Java Excution Path :</TD><TD><font color=red>$PlugInHanderJvPath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>System Java Execuction Path :</TD><TD><font color=red>$Javaexpath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>Computer Name :</TD><TD>$env:COMPUTERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>OS Verserion :</TD><TD>Windows $OS $Branchver</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>Domain/Username :</TD><TD>$env:USERDOMAIN\$env:USERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>IP Address :</TD><TD>$IP</TD></TR></TABLE><BR>"
$BodyNormal += "Thank you.<BR><BR>"
$BodyNormal += "Your IT Team."

If($PlugInHanderJvPath -ne $Javaexpath)
{
    [System.Windows.MessageBox]::Show('Java verson not match. Please update GICHIQ','GICHIQ Java version check','OK','Error')
    Send-MailMessage -From $Sender -To $RecipientAPM -Subject $Subject -SmtpServer KULDCCAS1.dhl.com -bodyashtml -Body $BodyAlert
}
ELSE
{
    [System.Windows.MessageBox]::Show('Java verson match.','GICHIQ Java version check','OK','Information')
    IF($min.TimeOfDay -le $now.TimeOfDay -and $max.TimeOfDay -ge $now.TimeOfDay)  #Send mail between 09:00-09:30 , Mail should be send on 09:00
    {
        Send-MailMessage -From $Sender -To $RecipientNor -Subject $Subject -SmtpServer KULDCCAS1.dhl.com -bodyashtml -Body $BodyNormal
    }

}

我來分段解釋一下

這三個只為了將上面的批次檔裡C:\Program Files (x86)\Java\jre1.8.0_181\bin\java.exe,抽取出來,準備跟系統的版本做比對。
由於這批次檔裡面有摻查一些空白,所以做法是讀出檔案內容之後,把多餘的前後空白和空白列Trim掉,然後利用這個”符號來做分段,取出第一段字也就是我要的路徑


1
2
3
$PlugInHanderPath = "D:\GICHIQ\GICEDI\PLUG-IN\PlugInHandler.bat"                                                                                                
$PlugInHanderstring = Get-Content -Path $PlugInHanderPath | Where-Object { $_.Trim() -ne '' }          
$PlugInHanderJvPath=$PlugInHanderString |select -Last 1 |%{$_.split('"')[1]}

下面兩個利用讀取機碼的方式來判斷系統安裝最新的版本
然後組合字串來準備比對


1
2
$javaver= dir "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1
$Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\$Javaver" -Name JavaHome).JavaHome + "\bin\java.exe"

下面兩個是抓取系統版本用的


1
2
$OS = gwmi win32_operatingsystem | Select -ExpandProperty Version
$SKU = gwmi win32_operatingsystem | Select -ExpandProperty OperatingSystemSKU

下面三個是準備判斷時間的,9:00-9:30之間才會發送正常報告


1
2
3
$min = Get-Date '09:00'
$max = Get-Date '09:30'
$now = Get-Date

下面是準備信件內容的變數
$sender : 送件者(同時是該台電腦的登入帳號所屬的Email)
$RecipientAPM : 有異常時要發給的對象
$RecipientNor : 正常時每天九點發送的對象
$Subject : 主旨
$IP取得這一台電腦的IP位址


1
2
3
4
5
$Sender = 'abc@def.com'
$RecipientAPM = @('aaa@def.com','bbb@def.com')
$RecipientNor = @('ccc@def.com','ddd@def.com')
$Subject = "Public PC Java version check."
$IP = Get-NetIPAddress | Where-Object -FilterScript { $_.ValidLifetime -Lt ([TimeSpan]::FromDays(1)) }| Select -ExpandProperty IPAddress

下面是準備判斷Windows是CBB/LTSB(C)版本,用於信件內容


1
2
3
4
5
6
7
Switch ($SKU)
{
4
    {$Branchver = "CBB"}
125
    {$Branchver = "LTSB/C"}
}

下面是警告信件的內容,HTML格式


1
2
3
4
5
6
7
8
9
10
11
12
$BodyAlert = "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$BodyAlert += "<BODY bgcolor=""#ffffff"" style=""font-family: Frutiger, Calibri, times; color: #000000""><P>"
$BodyAlert += "Hi DGF TW IT Teams<BR><BR>"
$BodyAlert += "<font color=red>Warning!</font><BR>PlugInHander batch file Java is <font color=red><b>different</b></font> with system Java Enviorment.<BR>Please go to update.<BR>"
$BodyAlert += "<TABLE style=""background: #e5e5e5;font-weight: normal;font-family: Frutiger, Calibri, times;""><TR><TD>Java Excution Path :</TD><TD><font color=red>$PlugInHanderJvPath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>System Java Execuction Path :</TD><TD><font color=red>$Javaexpath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>Computer Name :</TD><TD>$env:COMPUTERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>OS Verserion :</TD><TD>Windows $OS $Branchver</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>Domain/Username :</TD><TD>$env:USERDOMAIN\$env:USERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>IP Address :</TD><TD>$IP</TD></TR></TABLE><BR>"
$BodyAlert += "Thank you.<BR><BR>"
$BodyAlert += "Your IT Team."

下面是正常每日報告信的內容


1
2
3
4
5
6
7
8
9
10
11
12
$BodyNormal = "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$BodyNormal += "<BODY bgcolor=""#ffffff"" style=""font-family: Frutiger, Calibri, times; color: #000000""><P>"
$BodyNormal += "Hi DGF TW IT Teams<BR><BR>"
$BodyNormal += "GICHIQ PlugInHander batch file Java is <b>same</b> with system Java Enviorment.<BR>"
$BodyNormal += "<TABLE style=""background: #e5e5e5;font-weight: normal;font-family: Frutiger, Calibri, times;""><TR><TD>Java Excution Path :</TD><TD><font color=red>$PlugInHanderJvPath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>System Java Execuction Path :</TD><TD><font color=red>$Javaexpath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>Computer Name :</TD><TD>$env:COMPUTERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>OS Verserion :</TD><TD>Windows $OS $Branchver</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>Domain/Username :</TD><TD>$env:USERDOMAIN\$env:USERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>IP Address :</TD><TD>$IP</TD></TR></TABLE><BR>"
$BodyNormal += "Thank you.<BR><BR>"
$BodyNormal += "Your IT Team.

接著才是程式主體,
如果版本異常,直接發送信件。
版本正確而且時間落在9:00-9:30之間送發送一次報告


1
2
3
4
5
6
7
8
9
10
11
12
13
14
If($PlugInHanderJvPath -ne $Javaexpath)
{
    #[System.Windows.MessageBox]::Show('Java verson not match. Please update ABC','Java version check','OK','Error')
    Send-MailMessage -From $Sender -To $RecipientAPM -Subject $Subject -SmtpServer KULDCCAS1.dhl.com -bodyashtml -Body $BodyAlert -Priority High
}
ELSE
{
    #[System.Windows.MessageBox]::Show('Java verson match.','Java version check','OK','Information')
    IF($min.TimeOfDay -le $now.TimeOfDay -and $max.TimeOfDay -ge $now.TimeOfDay)  
    {
        Send-MailMessage -From $Sender -To $RecipientNor -Subject $Subject -SmtpServer KULDCCAS1.dhl.com -bodyashtml -Body $BodyNormal
    }

}

下面是版本正常的信件

下面是異常時發出的通知。同時在Outlook收到時,會看到前面有驚嘆號!

其實如果串上前面的更新程式,是可以做到全自動化的,偵測到版本變動時直接替換或用Set-Content方式去修改bat的內容。但是,到頭來說一句話,都全自動的話我們就失業了,,,,,,

Please follow and like us:
Powershell : Check time between a range to execute something.

Powershell : Check time between a range to execute something.

這是我這陣子在研究一段客製化的PS時候意外找到。


1
2
3
4
5
6
7
8
$str = Get-Date '09:25'
$end = Get-Date '09:30'
$now = Get-Date

if ($str.TimeOfDay -le $now.TimeOfDay -and $end.TimeOfDay -ge $now.TimeOfDay)
{
  Write-host "OK"
}

我想應該不用解釋太多。

$str : 設定開始時的時間
$end : 設定結束的時間
$now : 現在
如果開始的時間(9:25)<=現在的時間,同時結束的時間(9:30)>=現在的時間
就執行裡面的內容

附帶說明,可以替換的
-eq 等於
-ne 不等於
-ge 大於等於
-gt 大於
-lt 小於
-le 小於等於
-like Wildcard模糊比對(字元數字) – Wildcard comparison
-notlike Wildcard模糊比對(字元數字) – Wildcard comparison
-match 比對格式 – Regular expression comparison
-notmatch 比對相似 – Regular expression comparison
-replace 替換 -Replace operator
-contains Containment operator
-notcontains Containment operator
-in 類似於 -comtains,但是相反是動作
-notin 類似於 -notcontains ,但是是相反動作
 
Please follow and like us:
Powershell : Map a New Network Drive and  show in external environment(File Explorer).

Powershell : Map a New Network Drive and show in external environment(File Explorer).

有使用過Dos Command的應該都是知如何建立網路磁碟機。


1
Net use z: \\Fileserver\XXX

這很方面可以做成Script放在很多地方也行之有年了。
但是對於Powershell有偏執的,盡可能都會希望可以使用PS來執行一切的工作。

使用New-PSDrive可以建立網路磁碟機


1
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\Fileserver\XXX" -persist

但是,指令下完之後,檔案總管沒有任何動靜,在Powershell的視窗內去輸入Z:又能看到,使用Get-PSDrive,也能看到Z。原來是因為Powershell預設建立的網路磁碟機只能用在這個Session內,外面的世界(檔案總管….)是看不到的而且也不永久的。

我一開始以為-Persist,這個參數是可以讓PS所建立的磁碟機顯現出來,無奈怎麼試都沒有辦法。

找了一陣子終於被我發現,原來是另外一個參數 -Scope,所以實際上應該要把上面的只改成如下


1
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\Fileserver\XXX" -persist -Scope Global

這樣,外面的世界就能夠看的到了。

Please follow and like us:
Either there is no default mail client or the current mail client cannot fulfill the message request…..

Either there is no default mail client or the current mail client cannot fulfill the message request…..

這一篇其實是想說一個故事,一個令人很討厭的Message box.

如果事情有這麼像表面的簡單,到Setting > System > Default apps裡面去把 Email改成Outlook這麼簡單的事情,我肯定不會寫成一篇文章。
P.S.先說一下這邊的系統是建立在Windows 10 X64 with Office 2013 X64。

我去谷哥大神查了好多的網站論壇,回答大都千篇一律。
1. 移除Office重新安裝
2. 刪除機碼”們”之後對Office做修復動作。
HKLM:\\Software\Clients\Mail\Microsoft Outlook
HKLM:\\SOFTWARE\Wow6432Node\Clients\Mail\Microsoft Outlook
HKLM:\\SOFTWARE\Microsoft\Office\15.0
….族繁不及備載….

反正怎麼做都沒用,只要Outlook一開他很快就會依直跑出來。
後來我突然發現,錯誤訊息跳出來的時候下面的圖示一定是放大鏡

這是Windows 索引服務的圖示,突然給我一點靈感。跑去Outlook的Index Option看看(其實Index Option是系統內建的,設定的是整個Windows的索引服務)

點Modify之後,怪了,為什麼有兩個Outlook?名字還不一樣。

我的直覺告訴我,應該取消其中一個有機會讓這個錯誤訊息消失,我會有這種感覺是因為之前這台電腦曾經裝過Office 2010 Stand X64。

但是我發現我只能把Microsoft Oulook取消掉不納入索引範圍,那個Microsoft Office Outlook永遠都在上面(上面圖因為已經修改過所以看起來是可以取消,本來其實是反灰的)

我看看了一下我的電腦(Windows 10 X64 with Office 2013 X64)跟他環境相同,但是我從來沒裝過Office 2010

我的只有Microsoft Outlook而已,所以我應該能斷定Microsoft Office Outlook應該是舊的Outlook留下來的。

我在谷哥的搜尋方向開始朝向如何移除Indexed Location來著手。
我跳過Index Rebuild,因為我覺得肯定沒用!
我直接嘗試重作整個Index File
1. 停止(Stop)並停用(Disable) Windows Search服務
2. 找到C:\ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edb
3. 改名或刪除
4. 啟動(Start)並啟用(AUTO-Start-Delay) Windows Search服務
(有可能第一次出現 失敗因為他找不到原來的Windows.edb,再按一次啟動即可)
然後他就會開始自動重作Windows索引。

然後結論還是沒用,只要Outlook打開依然跳出討厭的畫面。

後來我想了很久,Windows 的設定根本上都是寫在機碼裡,我去找找看他放在哪裡。這Location我真的找了一陣子才找到原來他是在這裡
HKLM:\\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager\Windows\SystemIndex\WorkingSetRules

但是這麼多項目看起來怎麼跟圖形介面的項目對不起來。
後來點進去機碼發現了事有蹊俏。裡面有的值URL上面記載的資料大部分都是路徑。

結果我看到了個眼熟的值
mapi15://{S-1-5-21-1715567821-1326574676-725345543-997407}/

mapi指的是郵件的通訊協定,而我在他的電腦發現了 一組mapi15開頭,另一組是mapi開頭的,我對照了一下我電腦的機碼,發現我的只有mapi15開頭的而已。
如此一來我應該可以斷定mapi開頭的應該就是舊版的Microsoft Office outlook。我抱著必死的決心,想說反正機碼備份出來,萬一壞掉在Import回去就好了。
最壞狀況頂多就是重灌而已。
右鍵選Delete…登愣…..不給刪!我想也是,如果有這麼簡單就好了

我來看看機碼的權限。連管理員都動不了它,只有TrustedInstall和WSearch這兩個服務帳號可以動它而已。

這太殘忍了,再繼續調整谷哥的搜尋方向,看看我要如何才能達成目標。

後來在某論壇找到有人把Index Location 弄亂掉想要重設回預測值,下面有人回答了,原來,需要用特殊技巧才有辦法

https://superuser.com/questions/707628/how-reset-indexing-locations-windows-8-1

這篇大致上說明了原因和做法,用正常的方式是沒有辦法更動裡面任何的機碼。
所以請按照下面的方式來做。

  1. Settings > Update & Security >Recovery > Advanced Startup > Restart now
  2. Troubleshoot > Advanced options > Command Prompt
  3. 出現命令視窗之後輸入regedit,將會打開機碼編輯視窗
  4. 你所看到的機碼,可能不是你原來系統的機碼而是Windows Recovery環境的。
  5. 左邊Panel 點選HKLM之後,右鍵Load Hive,去尋者原來電腦裡面的系統磁碟(Windows安裝磁碟),它有可能不是C,也許是D或是E。你可以利用命令提示字元視窗用dir或是機碼Load檔案的視窗去確認你原來的系統在哪裡。
  6. 我運氣很好Windows Recovery用的是X,所以我原來的系統就在C, 所以我點了HLKM右鍵Load Hive : C:\Windows\System32\Config\Software
  7. 它會談出一個視窗,給他一個名字(隨意看得懂就好),例如SOFTWARE_real,接著你就會看到機碼視窗再SOFTWARE下面多了一個SOFTWARE_real。
  8. 然後到這裡面,剛剛那個刪不掉的機碼就能夠刪掉了。
  9. 刪完關閉機碼視窗輸入Exit
  10. 回到Troubleshoot畫面選Exit and Continue to Windows。

回到正常Windows重新檢查Index Option > Modify > Indexed Location,雖然惱人的Microsoft Office Outlook還在,但是它的勾勾不見了,也就是他不會列入索引服務的範圍了。

然後測試Outlook打開之後,就沒有再跳出來了!

我想這大發現至少讓我免除浪費重灌的時間了!

Please follow and like us:
Powershell : Add/Remove Local User/Group

Powershell : Add/Remove Local User/Group

這裡介紹如何使用Powershell去新增/移除本機使用者/群組

下面是先設定手動輸入指定的密碼為變數$PWD,按下Enter後直接輸入密碼他會以****的方式來呈現,書完成按Enter即可。


1
$PWD = Read-Host -AsSecureString

再來就是新增使用者CW1TMS(登入帳號)
密碼使用變數$PWD,只要你Powershell視窗不關,你可以一直使用這個密碼。
設定顯示定名稱為CW1TMS。
設定描述為For CW1 UAT。


1
New-LocalUser "CW1TMS" -Password $PWD -FullName "CW1TMS" -Description "For CW1 UAT."

然後在圖形介面就會看到剛剛新增的使用者。

接著再來新增本機群組Test1,描述為Test1。


1
New-LocalGroup "Test1" -Description "Test1"

圖形介面同樣會看到。

再來是我要把CW1TMS這個剛剛新增的使用者加入Test1這個群組


1
Add-LocalGroupMember -Group "Test1" -Member "CW1TMS"

既然有新增就要有移除。
第一行是移除使用者CW1TMS。
第二航是移除群組Test1。


1
2
Remove-LocalUser "CW1TMS"
Remove-LocalGroup "Test1"

這是最基礎的,方便你搭配Script來做批次處理,您說是不是很方便呢!
下面有個範例,建立CW1TMS帳號,連同密碼不用手打(自動轉為SecureString)。
建立完帳號之後自動加入Administrators群組。


1
2
3
4
5
6
$USR = "CW1TMS"
$PWD = ConvertTo-SecureString "P@ssW0rd" -AsPlainText -Force
$FUN = "CW1 TMS"
$DSP = "CW1TMS Local User."
New-LocalUser $USR -Password $PWD -PasswordNeverExpires -FullName $FUN -Description $DSP
Add-LocalGroupMember -Group Administrators -Member $USR
Please follow and like us:
Downloading Language Dictionary..

Downloading Language Dictionary..

Windows 10 CBB version安裝額外語系之後,會發生無法使用中文輸入法的窘境。尤其碰到Windows 是加入網域管理並且有設定WSUS或是管控Windows update不能直接跟微軟下載(或著其實這是個Bug?)而導致一直出現的錯誤訊息

永遠無法切換成中文輸入法。中間有嘗試過就算安裝語言包也沒用的…後來無意間發現的,裝完的電腦C:\Windows\IME\IMETC\DICTS裡面只有mshwchtrIME.dll之外什麼都沒有。於是乎從正常的Windows 10把上述目錄下面所有的檔案複製進去,就通通都正常了!

我不能肯定是1803 CBB版本的Bug或是我們總部打包的Image有問題,總之後碰到這類問題,這樣應該都是可以解的。

Please follow and like us:
Windows 10 CBB vSwitch Network Broken

Windows 10 CBB vSwitch Network Broken

公司Deploy新的CBB版本Windows 10(1803),一開始使用上也沒什麼問題。一開始也沒注意到為什麼安裝完預設就把HyperV的Service掛起來,導致網卡多了一個vEthernet(Default Switch),想想未來可能會增加對User Troubleshutting 的麻煩。還是移除的好。

移除完重開,網卡就會正常了。虛擬網卡同時也會消失。

Please follow and like us:
Use Powershell to detect Windows 10 version ( CBB/LTSC)

Use Powershell to detect Windows 10 version ( CBB/LTSC)

Windows 10 除了市面上看到的家用 / 專業 / 企業 / 教育之外,商務使用有另外區分為CBB/LTSB(C)。詳見https://docs.microsoft.com/zh-tw/windows/deployment/update/waas-overview

在這裡我想用Powershell判斷到底Windows 10是CBB / LTSB(C?),因為手上只有CBB和LTSB版的Windows 10 ,所以我也不能確定LTSC的結果是否雷同。


1
gwmi win32_operatingsystem

用Powershell跑完上面的指令會得到一些無用的概略資訊。但其實我只需要針對裡面OperatingSystemSKU這個值而已,所以在後面加參數。


1
gwmi win32_operatingsystem | Select OperatingSystemSKU

在這裡說明一下:CBB 版本會得到4,LTSB(C?)會得到125

但是,這種呈現方式,我很放到Powershell裡面轉成變數,所以還要加個參數


1
gwmi win32_operatingsystem | Select -ExpandProperty OperatingSystemSKU

這樣你就只會看到值,如此一來你就可很方便的放到你的Powershell Script去判斷Windows 10版本了,另外125這數值怎麼出來的我在官方文件一職沒找到

倒是其他各式各樣數值的有表可查如下方連結

https://docs.microsoft.com/zh-tw/windows/desktop/CIMWin32Prov/win32-operatingsystem

這裡有個小小的範例可以參考一下!


1
2
3
4
5
6
7
8
9
10
11
12
$SKU = gwmi win32_operatingsystem | Select -ExpandProperty OperatingSystemSKU
Switch ($SKU)
{
4
    {
    Write-Host Your OS is CBB
    }
125
    {
    Write-Host Your OS is LTSB
    }
}

以上感謝收看!

Please follow and like us: