2021-11-22

PFX 憑證轉 JKS

先裝好 Java 取得 keytool.exe
接著下指令:

 "C:\Program Files (x86)\Java\jre1.8.0_311\bin\keytool.exe" -importkeystore -srckeystore "C:\Cert\www.contoso.com.pfx" -destkeystore "C:\Cert\www.contoso.com.jks" -srcstoretype PKCS12 -deststoretype jks -srcstorepass "12345678" -deststorepass "12345678"

2021-11-03

語音轉文字工具 pyTranscriber + 剪映 校正時間軸

一直以來適用 pyTranscriber 來處理影片語音轉文字來上字幕
但是 pyTranscriber 的時間軸實在對不準,常常斷句在奇怪的地方
最近聽說大陸軟體 剪映 也可以自動產生字幕
試用之後發現語音辨識跟 pyTranscriber 這個用 Google 處理的半斤八兩沒有好到哪裡去
但是時間軸卻是較為準確的

所以決定來用他的時間軸與語音辨識搭配 pyTranscriber 的結果來東拼西湊
但是他卻沒有輸出 .srt 字幕檔的功能 Orz
所幸找到他的字幕是存在特定路徑下的 JSON File
於是寫了個簡單的 PowerShell Script 去撈

另外還有個問題是 剪映 產生的字幕是簡體字,所以還需要做繁簡轉換
那我不知道 PowerShell 有沒有函式之類的可以直接拿來用
但是先找了一個 ConvertZZ 來處理
(繁化姬 要用 http GET Query, 字幕數量太大會花很多時間而且可能影響該服務運作所以不採用)

以下是程式


$ConvertZZ = 'C:\Users\Administrator\Downloads\ConvertZZ_v1.0.0.8\ConvertZZ.exe';
#https://github.com/flier268/ConvertZZ/releases

#### ----- Constant ----- ####

$ProjectsFolder = ($env:USERPROFILE + '\AppData\Local\JianyingPro\User Data\Projects\com.lveditor.draft');
$CaptionFile = 'draft_content.json';

#### ----- Program Start ----- ####

2021-10-26

列出特定 OU 下帳號的密碼到期日 & 重設密碼到期日

Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -SearchBase "OU=CorpUsers,DC=contoso,DC=com" –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed","passwordlastset","Passwordneverexpires","LockedOut" | Select-Object -Property "Displayname","passwordlastset",@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}},"Passwordneverexpires","LockedOut" | ft

搭配以下指令重設密碼到期日

set-aduser -ChangePasswordAtLogon:$true
set-aduser -ChangePasswordAtLogon:$false

2021-10-07

市場開發必須要先擁有的基本功

今天接到了一通推銷電話,來電的人自稱是 Google 的某某合作夥伴
他說:「我們公司最近針對你們這類型的產業要舉辦一個活動來介紹產品
想跟您請教 E-mail Address 把資訊寄給您參考」

他真的就只有說了這些,就要我講出 E-mail Address
各位要知道,Google 的合作夥伴何其多啊
於是我問他: 你們是哪一家公司啊?
他說: xx 科技
我繼續問: xx 怎麼寫呢?
於是對方一面說,我就一面 Google
在搜尋的時候我當然是沒說話的
於是他在沉默的空檔又問了一次 E-mail Address

這個時候我找到了他們家網站,也看到了他們家的英文名字
基於要確認我找到的這家公司對不對,於是我唸出了他們公司的英文名字 (消音)
這個時候,他的回應真是令人啼笑皆非
他重複唸了一遍我剛剛唸出的他們公司的英文名
接著問我: 怎麼拚呢?
當下我真得是愣住了,陷入了沉默...
如果你要問我停頓了多久,我想大概有一萬年吧
當我從驚嚇中恢復過來,再重複唸了一次他們公司的英文名
他才恍然大悟: 哦這是我們公司的名字...

2021-09-09

Powershell 對於檔名有 [ 中括弧 ] 等保留字元的不適應症狀處理 Deal with filename contains reserved characters like [ ] in Powershell

Get-ChildItem 明明找得到 [ABC].txt,但用 Get-Item 卻找不到


雖然改用 [System.IO.File] 就能正確存取
且在 這邊 (微軟官方文件) 可以找到相關的 Method 來使用,但還是相當不方便
畢竟不是所有指令都能用 [System.IO.File] 來代替


2021-09-03

Silently Install UltraVNC 無訊息安裝

先安裝一次並加上 /saveinf 參數取得設定值參考檔
setup.exe /saveinf="C:\UVNCInstall.inf"

加上 /verysilent 及 /loadinf 來實現無訊息安裝
setup.exe /verysilent /loadinf="C:\silentinstall.inf"

Reference

2021-08-19

Fix Unable to resolve package source when Install-Module with PowerShell

Install-Module -Name AzureAD 的時候發生以下錯誤:

WARNING: Unable to resolve package source 'https://www.powershellgallery.com/api/v2/'.

可能的原因為 PowerShell 採用 TLS 1.0 的加密方式去溝通
解決辦法: 執行以下指令要求 PowerShell 用 TLS 2.0 加密連線

2021-07-29

Auto Renew Let's Encrypt Certificate for SoftEther

After build up the SoftEther VPN https://youtu.be/Y1F4PJOsWF8


You can manually Import the Certificate


Or try to make it automatically.

Place Cert in C:\Cert\ and write a TXT file (C:\Cert\SoftEtherVPNCertBatch.txt) with the following command:

2021-07-08

WFH (Work From Home) 的情況下如何 Reset Computer Account Password

這個應該是用不到啦,畢竟就已經跟網域脫離關係,應該是用 Cache Credential 來登入作業系統
所以應該不會遇到 Computer Account Password 說過期,失去網路信任關係的問題

但如果有需要的話,VPN 先連上,然後下 PowerShell 指令

Test-ComputerSecureChannel -server DC.Contoso.com -credential Contoso\Adminstrator -repair

WFH (Work From Home) 的情況下重新登入網域取得帳號 Member Of 資訊的辦法 (重新登入作業系統)

User 在家工作一段時間
遇到密碼過期或因為需要取得帳號 Member Of 屬性
而需要在已經連接網域網路的情況下重新登入作業系統

先以 Local Account 登入作業系統
以 Windows 內建的 VPN,或 SoftEther VPN 也可以,連接好之後
敲 Command: tsdiscon 切換帳號 (Switch User)
這時 VPN 連線會持續存在,但可以換 AD Domain User Account 登入了
此時就能變更密碼、取得最新的 Momber Of 資訊及 GPO 等

2021-06-26

User Scrcpy to Connect to Android Devices over WiFi by PowerShell

只需要開啟 Android 的 USB 偵錯模式
再透過 Scrcpy 就能讓你在 PC 上連接 Android 裝置並顯示、操作
甚至可以透過無線網路來連接 (adb 內建功能)
以下為快速連接的 PowerShell Script
只要先指定好 adb.exe 及 scrcpy.exe 的 Path 就可以運作
達到快速連接的目的


$ADBPath = 'C:\scrcpy\adb.exe';
$ScrcpyPath = 'C:\scrcpy\scrcpy.exe';

$ConnectedDevices = @();
$ConnectionPrompt = '';
$ConnectionTargetIndex = 0;
$Reconnect = 'y';

2021-06-22

Export All Teams Channels Owners, Members and Guests with JSON format by PowerShell

Connect To Teams 的段落搭配
https://blog.dino9021.com/2020/11/connect-azaccount-with-saved-encryped.html

$ShowID = $True;

##### Get Self-Path #####
if (($MyInvocation.MyCommand).Path -ne $Null) {
$SelfPath = (($MyInvocation.MyCommand).Path -replace ($MyInvocation.MyCommand),' ');
} else {
$SelfPath = ((Get-Location).Path + '\');
};
##### Get Self-Path #####

#$webclient=New-Object System.Net.WebClient
#$webclient.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
#[Net.ServicePointManager]::SecurityProtocol = "tls12"
#Install-Module MicrosoftTeams

2021-06-06

Shrink Azure VM OS Disk 縮小 Azure 上 VM 的 OS Disk 大小

 Azure 上面起一個 Windows VM 的 OS Disk 預設是 127GB

但通常用不到那麼大卻要負擔那麼多的租金
在以下網址找到可以縮小 OS Disk 的 PowerShell Script

https://github.com/jrudlin/Azure/blob/master/General/Shrink-AzDisk.ps1

需要注意 Script 的預設情況 Disk 是 沒有設置 Available Zone 
以下 Script 已經將 Disk 的 Available Zone 加入避免錯誤

2021-06-05

Windows Server 2019 NPS RADIUS 驗證失敗的問題

Windows Server 2019 的 NPS 有 RADIUS Server 服務設定
但即使完成了正確的設定,RADIUS Client 仍然無法正確取得驗證
如果此時將 Firewall 關閉則可以正確驗證
顯然問題出在防火牆上

解決辦法下一行 PowerShell 指令即可

Get-NetFirewallRule -DisplayGroup "Network Policy Server" | where DisplayName -like "*RADIUS*" | Set-NetFirewallRule -Service Any

Reference: https://social.technet.microsoft.com/Forums/en-US/0bf054af-eebe-4a2b-a07b-ccab174b234f/server-2019-radius-blocked-by-defender-firewall

2021-06-01

PowerShell 取得兩個字串中間的字串 Get SubString Between 2 Strings

$String = 'SString1T<String2>';

$Find = [Regex]::Matches($String, "(?<=S).+?(?=T)");
for($i = 0; $i -lt $Find.Count; $i++) {
    $Find[$i].Value;
};

$Find = [Regex]::Matches($String, "(?<=\<).+?(?=\>)");
for($i = 0; $i -lt $Find.Count; $i++) {
    $Find[$i].Value;
};

PowerShell Invoke-WebRequest 出現錯誤: The server committed a protocol violation. Section=ResponseStatusLine

又踩到雷啦!

用 PowerShell Invoke-WebRequest 向某個網站發出 Request 的時候出現錯誤:

The server committed a protocol violation. Section=ResponseStatusLine


解決辦法:

在 Invoke-WebRequest 之前先執行以下 Script:

2021-05-31

PowerShell Invoke-WebRequest 編碼問題 (Bug5 內容) (Big5)

這年頭還在用 Bug5 (Big5) 編碼提供資料的網站都該下十八層地獄
以下只能正確讀取 Bug5 編碼的網頁,不是 Bug5 to UTF-8 轉換編碼

$URL = 'Somewhere in hell';

$BIG5 = [System.Text.Encoding]::GetEncoding(950)
$UTF8 = [System.Text.Encoding]::GetEncoding(65001)
$ISO88591 = [System.Text.Encoding]::GetEncoding(28591) #ISO 8859-1 ,Latin-1

[System.IO.File]::WriteAllText(('C:\Temp\SomeData.txt'), ($BIG5.GetString(([System.Text.Encoding]::Convert($UTF8,$ISO88591,($UTF8.GetBytes((Invoke-RestMethod -Uri $URL))))))), $BIG5);


Powershell Out-File 預設編碼 UCS-2 LE BOM 問題 (改成 UTF-8)

PowerShell 中最單純的 Out-File 指令建立出來的文字檔預設是沒見過的 UCS-2 LE BOM
為了處理這個問題要改成以下寫法:

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False;
[System.IO.File]::WriteAllLines(('C:\Temp\Test.txt'), (Get-Date), $Utf8NoBomEncoding);

其中 WriteAllLines
第一個參數是路徑+檔名
第二個參數是要寫入的內容
第三個參數是叫他用 UTF-8 with No BOM 編碼

2021-05-19

用 PowerShell 取得自己的 Public IP

  • 取得自己的 Public IP

    (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content

  • 取得包括 Public IP 以及地理位置、電信商等資訊

    Invoke-RestMethod -Uri ('http://ipinfo.io/'+(Invoke-WebRequest -uri "http://ifconfig.me/ip").Content)

如果執行時發生以下錯誤:

Invoke-WebRequest : The response content cannot be parsed because the Internet Explorer engine is not available, or Internet Explorer's first-launch configuration is not complete. Specify the UseBasicParsing parameter and try again.


2021-05-18

用 PowerShell 判斷時間區間後執行 batch

C:\Command\Run.bat

-----------------------------------------------------------------------------------------------
C:
cd "C:\Command\"
"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" -command ". 'C:\Command\Run.ps1';"
-----------------------------------------------------------------------------------------------

C:\Command\Run.ps1
-----------------------------------------------------------------------------------------------
$Min = Get-Date '14:00';
$Max = Get-Date '17:30';
$URL = 'https://www.google.com';

$Now = Get-Date;

if (($Min.TimeOfDay -le $Now.TimeOfDay) -and ($Max.TimeOfDay -ge $Now.TimeOfDay)) {
Start-Process -FilePath "C:\windows\system32\cmd.exe" -Wait -UseNewEnvironment;
Invoke-WebRequest -URI $URL -OutFile "URL.txt";
};
-----------------------------------------------------------------------------------------------

2021-02-22

取得 PowerShell 執行 .ps1 的自身路徑與 pid

注意這是執行 .ps1 的時候用的指令,普通開 PowerShell 視窗用 Get-Location

$MyInvocation.MyCommand (PowerShell 系統保留變數)

($MyInvocation.MyCommand).Path

$pid (PowerShell 系統保留變數)

寫入一個與 .ps1 主檔名相同、副檔名為 pid、內容為 pid 的檔案

2021-02-09

處理 Windows 10 / 2019 預設視窗邊界很難分辨的問題

不知道別人的情況如何
但我根本分辨不出來上層這個視窗的邊界在哪裡
所以無法辨別滑鼠游標要在哪裡按才能拖曳視窗

問題是,修改視窗標題、邊框顏色等功能又要先啟動作業系統後才能修改
微軟這真是莫名其妙、喪心病狂的設定...
只好出動註冊機碼來處理這件事

2021-02-03

Create Azure Site to Site VPN with PowerShell

Import-Module -Name Az

# Create a VNet with a Site-to-Site VPN connection using PowerShell
# https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-create-site-to-site-rm-powershell

$RegionLocation = 'Japan East';
$ResourceGroupName = 'Infra_Network';
$vNetName = 'Corp-vNet';

$VirtualNetworkGateway_PublicIP_Name = 'Azure_VPN_IP';
$VirtualNetworkGateway_Name = 'Azure_VPN_Gateway';
$LocalNetworkGateway_Name = 'Local_VPN_Gateway';
$AzureVPNConnection_Name = 'Azure_VPN_Connection';
$VPNSharedKey = (("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".tochararray() | sort {Get-Random})[0..32] -join '');

$GatewaySku = 'Basic';
$LocalNetworkIPAddress = '168.95.1.1';
$LocalNetworkAddressSpace = @('10.255.0.0/16');

$LocalRRAS_VPNName = 'AzureVPN';
$LocalDNSServer_Object = New-Object -Type PSObject -Property @{"DnsServers" = @("10.10.10.11")};

2021-01-28

Create Linux VM From Image

# Define a credential object
$securePassword = ConvertTo-SecureString 'P@$$w0rd' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ('superman', $securePassword)

# Create some variables for the new VM 
$ResourceGroupName = 'ResourceGroup'
$AzureRegion = 'East Asia'
$NewVMName = 'NewVM'
$vNet = 'vNet'
$SubNet = 'Subnet'
$NSG_Head = 'NSG'
$OSDiskType = 'Standard_LRS' # 'Standard_LRS' | 'StandardSSD_LRS' | 'Premium_LRS'
$VMSize = 'Standard_B2s';

2021-01-20

Service Endpoint vs Private Endpoint

On Storage Account: Allow access from selected subnets in Azure vNet (For Free)

On Azure vNet Subnet: Apply Service Endpoint Policy (For Free)

vs

Connecting from premise.

Private Endpoint per hour / Inbound per GB / Outbound per GB

2021-01-19

AutoMount VHDx in Azure File Shares for Storage Pool Virtual Disk

Azure Files 就是 Storage Account 的 File Share,直接用 \\UNCPath\ 的方式存取效能不佳 (謎?)
如果在其上建立 VHDx 並在一台 VM 中 Mount 起來當成 File Server 來提供服務效能較佳,若用多個 VHDx 組成 Storage Pool 的話效能更好

Azure Files Standard file shares 單一檔案最大 1 TB,所以可以建立 5 個 1TB 的 Dynamic VHDx 掛接起來,建立 Simple Thin Virtual Disk 來使用,一樣取得 5TB 儲存空間,且具有高存取效率與重複資料刪除 Deduplication (Windows Server Feature),同時還可以 Pay as you go

$StorageArray 定義 Volume Name

$VolumeName 陣列定義 VHDx 成員 的 FullPath

完成以上定義後,Get-Volume 找目前系統中是否已經將 $StorageArray 中的每一個 Volume 都掛上,如果沒有,就檢查是哪一個 VolumeName 還沒掛上,將還沒掛上的 $VolumeName 陣列中的 VHDx 全部掛上。

##### 程式開始 #####

2021-01-15

Backup and Restore NTFS Permission (ACL) and Owner with PowerShell

Backup

$TargetPath = 'C:\PathToBackup';
$ACLFile = 'C:\NTFSBackup.csv';
$PathReplaceKeyword = 'AKeywordToReplacePathForRetoreToDifferentPath'

$ACLArray = @();
$ACLArray += (Get-item -path $TargetPath | Get-ACL | Select-Object @{Name="Path"; Expression={($_.Path -Replace [regex]::Escape($TargetPath),$PathReplaceKeyword)}},Owner,Sddl);
$ACLArray += (Get-Childitem -path $TargetPath -recurse | Get-ACL | Select-Object @{Name="Path"; Expression={($_.Path -Replace [regex]::Escape($TargetPath),$PathReplaceKeyword)}},Owner,Sddl);
$ACLArray | Export-CSV $ACLFile -NoTypeInformation;

 

2021-01-08

FSLogix User Profile Folder & Disk ACL Fix

不知動到什麼東西導致 FSLogix 的 USer Profile 路徑下 NTFS Permission 亂掉
User Account 專屬的權限消失
因為 FSLogix 的目錄結構跟 Microsoft VDI 不一樣,所以不能直接用這篇文章的 Script 修

於是稍微修改一下成為以下 Script 來處理

===== 程式開始 =====

clear
write-host
write-host
$UPDPath = Read-Host -Prompt 'Input User Profile Disk Path'
$UPDFolders = Get-ChildItem -Path $UPDPath | Select Name,FullName

2021-01-07

Robocopy 複製 NTFS ACL (Permission) 與差異化複製 (Differential Copy)

複製 NTFS ACL (Permission)

    RoboCopy <source> <target> /MIR /SEC /SECFIX

差異化複製 Differential Copy

    RoboCopy <source> <target> /e /xo /purge

差異化複製 Differential Copy + 複製 NTFS ACL (Permission)

    RoboCopy <source> <target> /SEC /SECFIX /xo /purge

2021-01-02

Azure Windows 10 Multi-Session Language Packs 多國語言包離線安裝

不知為何在 Azure 上建立的 Windows 10 Multi-Session Version 用線上安裝語言包進度都不會動
而且之前記錄的這篇 Windows 10 Language Packs 多國語言字型問題 的指令敲下去也不會動

找了一下,微軟有提供語言包 ISO 檔可以下載
網頁中也有安裝的語法

要下載兩個 ISO 檔,分別是 Language ISO 與 FOD Disk 1 ISO

Mount 後直接下指令
以下列出常用的: 繁體中文、簡體中文及日文的安裝 Powershell Command