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';

$VirtualNetworkGatewayPublicIPName = 'Azure_VPN_IP';
$VirtualNetworkGatewayName = 'Azure_VPN_Gateway';
$LocalNetworkGatewayName = 'Local_VPN_Gateway';
$AzureVPNConnectionName = '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

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