2016-12-27

Use FQDN in DFS

DFS 的 Target 預設是用 HostName, 不是 FQDN,
這在 Multi-Domain 或某些情況下會造成連線上的問題
必須要在建立 DFS Name Space 之初就先設定使用 FQDN 以避免之
若 DFS 架構已經建立, 則必須打掉重做

詳細步驟可參考:
https://support.microsoft.com/zh-tw/kb/244380

2016-12-08

將 VDI Golden Image 放到 SSD Tier 的 Powershell 指令

將檔案指定放到 SSD Tier 的基本 Powershell 指令如下
Set-FileStorageTier -FilePath "File FullPath" -DesiredStorageTierFriendlyName "TieredStorage_Microsoft_SSD_Template"

快速找出 Collection Golden Image 的檔案完整路徑名稱並指定放到 SSD Tier 的 Powershell 指令如下:
Set-FileStorageTier -FilePath ((Get-ChildItem -path D:\VDI\CollectionName\IMGS -R | where {$_.Name -like "*.vhdx"}).VersionInfo).FileName -DesiredStorageTierFriendlyName (Get-StorageTier | where {$_.MediaType -eq 'SSD' -and $_.Size -gt 0} | Select FriendlyName).FriendlyName

若有多個 Tiered Virtual Disk 的話, 需要再自行過濾 TierFriendlyName

Microsoft VDI 內類似 Dynamic DNS (DDNS)的功能 (Part 1)

Updated 2020.06.11:
    程式整個重寫 參考新的一篇

User 的需求真是千奇百怪
VDI Pooled VM 的情況下, User 每次登入不一定是哪一台 VM, 可能每次都不一樣
然而如果 User 有需要執行某種服務需要提供其他同仁連線, 就會因此造成麻煩

當然, 這種服務理當建立獨立運作的 Server, 不該用 VDI Pooled VM
但有時候就是會有這種需求
因應這種事情, 我寫了三個小 Script 來達成類似 Dynamic DNS (DDNS) 的效果

LogonScript.vbs: 在 User 登入時執行
LogoutScript.vbs: 在 User 登出時執行
DDNS.ps1: 在 FileServer 上以具有管理 DNS Record 權限的帳號每一分鐘執行一次

2016-12-02

Tiered Storage SSD 使用率報表

採用 Storage Pool 的 Tiered Storage 時
沒有簡單的 Powershell 指令可以查目前 SSD 與 HDD 使用率概況
但是可以在系統進行 Hot Data 分析遷移的時候使他產生報表
辦法要修改 Windows 預設的工作排程命令

首先找到工作排程類別:

  • Task Scheduler
    • Task Scheduler Library
      • Microsoft
        • Windows
          • Storage Tiers Management

選取 Storage Tiers Optimization 項目
其 Actions 內容預設為

  • %windir%\system32\defrag.exe -c -h -g -#

2016-11-25

Hyper-V vSwitch VLAN ID 與 Cisco Switch

Hyper-V vSwitch VLAN ID 在一般無網管功能的 Switch 上直接就能用
不同 Hyper-V Host 之間只要 VLAN ID 相同就能通, 沒有什麼問題
但若是使用 Cisco  這類網管交換器就頭大了, 接上去完全不通
因為自己沒學過 CCNA, 也不懂 Cisco Switch
經過同事的研究與朋友經驗分享後
得知要照以下這樣的設定方式才會通

2016-11-24

Powershell 建立、修改 FTP 帳號設定及容量限制

IIS 的 FTP 某種程度上比 FileZilla 好用
因為帳號是由作業系統管理, 可以用 PowerShell 進行各種自動管理
以下為帳號管理的程式, 用來建立、修改帳號
包括: 帳號名稱、帳號說明、事件通知對象、容量限制等
預設給予權限為 Modify , 如果有需要設定 Read Only 或 Write Only 等權限
則直接在資料夾的 ACL List 上面編輯 NTFS Permission 就可以了
故不將這種設定寫成複雜的 PowerShell Script, 沒必要

另外還有一個找出即將到期帳號的 Script, 目前寫到一半
只能撈出來, 還沒寫 E-mail 的部份

2016-11-18

Microsoft VDI User Profile Disk ACL Fix

User Profile Disk 如果有需要更換存放的 File Server
將檔案以複製的方式遷移後, 需要修改檔案的權限
除了基礎結構中 Share / NTFS Permission 一定要給的 Computer Account 等以外
還必須給予該 User Profile Disk 所屬 User Account Full Control 的權限
這個權限在 User 第一次正常登入時會自動設定
但因為檔案複製的關係, 所以這個權限會遺失, 需要手動加進去

如果每個檔案要一個一個去加權限就太累了, 萬一 User Profile Disk 有數百個不就昏倒
因此以 Power Shell Script 代勞來處理這件事情
以下為程式碼, 依需求輸入要處理的 User Profile Disk Path ($UPDPath)

Microsoft VDI 攻略

Microsoft 2012 R2 / 2016 VDI 攻略, 更新: 2016.11.18

https://www.youtube.com/playlist?list=PL4Jq9EkoXy70icm7MSBAQZh5wgcRUngxB

https://www.youtube.com/playlist?list=PL4Jq9EkoXy73ooAR8sOWC8tse-FAW_gQx
  • Computer Account 與群組的檢查
  • 定義:
    • RD Member Servers: RDCB、RDWeb、RDGateway、RDSH、RDVH (不包括 RDL)
  • 檢查-群組:
    • 每一台 RD Member Servers 的 Local Group [RDS Management Servers]
      • 要加入 RDCB Computer Account
    • RDCB 的 Local Group [RDS Endpoint Servers]
      • 加入除了 RDWeb + RDGateway 以外每一台的 Computer Account (包括 RDCB、RDVH、RDSH)
      • 以及 [NT AUTHORITY\NETWORK SERVICE] (加入時 Location 選本機, 鍵入 [NETWORK SERVICE] 按 Check Names)

2016-11-16

GPMC 顯示 Processing error 錯誤的問題 (中了微軟的怪招)


  • Group Policy Management
    • Forest: Contoso.com
      • Domains
        • Contoso.com

點擊到 Domain Name 這一層時, 右側主畫面的 Status 頁籤顯示:

  • No Infrastructure Status information exists for this domain.
  • Click the Detect Now button below to gather infrasturcture status from all of the domain controllers in this domain.

而當按下 Detect Now 的時候, 會彈出視窗顯示

  • A Processing error occurred collecting data using this base domain controller. Please change the base domain controller and try again

2016-11-14

DHCP Export Import Command

netsh dhcp server \\DHCPServer dump > C:\DHCP.txt
netsh exec C:\DHCP.txt

Powershell 備份/匯入 GPO 的指令

Backup

$Path = ('C:\GPO_Backup\GPOBackup_' + (Get-Date -Format 'yyyyMMdd')) mkdir $Path Backup-Gpo -All -Path $Path

Import

Get-GPO -all | select DisplayName
New-GPO -Name "GPO_TargetName" Import-GPO -BackupGpoName "GPO_SourceNameInBackup" -Path "C:\GPO_Backup" -TargetName "GPO_TargetName"

AD Domain Trust 的注意事項

AD Domain Trust 的時候
兩個 Domain 的 DC Computer Name 電腦名稱不能相同
否則無法 Trust
如果不巧遇上了, 其中一方一定要改名

如果 Multi-Domain Trust 也必須避開 Computer Name 重複的問題
最好所有電腦名稱都是唯一

2016-11-09

Excel 參照路徑批次修改

多年前為了一些人用了 Excel 的參照功能
但因為需要更換 File Server 路徑導致參照會失效
因此撰寫了 VBScript 來進行置換

多年後翻出此程式碼
不確定是否有 Bug, 也許還能用也說不定

Microsoft VDI User Profile Broken Fix / Recovery / Back & Restore

User Profile Disk 在網路異常或斷線等意外情況下
將導致 Collection Member 與 User Profile Server 失去聯繫
結果便是 User 的註冊機碼等無法在 Sign-Out 時回存
下次登入時就會變成 Temp Profile
且因為是 Pooled VM, 根本無法經由 Local Machine Registry 修復

解決辦法之邏輯如下:

A. User Sign-Out 時 (VBS, 在 Pooled VM 上進行)
User Sign-Out 時檢查 User Profile Disk Link 是否仍然有效
在 User Profile Server 的某一共用資料夾建立 Backup Queue File, 並載明 UserName / Domain / Collection Name 等資訊
B. User Sign-Out 後 (PowerShell, 在 User Profile Server 上進行)
根據上述 Queue File 找出 User Profile Disk 並進行掛載
將 User Profile 的 ntuser* 檔案備份到 AppData\Roaming\BackupNTUserData 路徑
解除掛載
C. User Sign-In 時 (VBS, 在 Pooled VM 上進行)
檢查 User Profile 是否正常, 正常就結束, 如果變為 Temp Profile 就要進行 Restore 作業
先利用 DiskPart 將 User Profile Disk 的 Partition 指派一磁碟機代號
再將 AppData\Roaming\BackupNTUserData 複製到根
移除磁碟機代號並要求 Sign-Out 重新登入
以下為程式碼, 包含 VBS 與 PowerShell
VBS 可用 GPO 派送, PowerShell 以工作排程每五分鐘檢查一次

2016-10-24

Software List (Enhanced Version) Create DB View


/******************************************************************************/

USE [Info]
GO

/****** Object:  View [dbo].[ASMA]    Script Date: 10/24/2016 10:29:40 ******/
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[ASMA]'))
DROP VIEW [dbo].[ASMA]
GO

/****** Object:  View [dbo].[ASMA]    Script Date: 10/24/2016 10:29:40 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

Software List (Enhanced Version) Create DB Table

USE [Info]
GO

/****** Object:  Table [dbo].[ARPTable]    Script Date: 10/24/2016 10:28:29 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ARPTable]') AND type in (N'U'))
DROP TABLE [dbo].[ARPTable]
GO

/****** Object:  Table [dbo].[ARPTable]    Script Date: 10/24/2016 10:28:29 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[ARPTable](
[Serial] [int] IDENTITY(1,1) NOT NULL,
[DateTime] [datetime] NOT NULL,
[HostName] [nvarchar](max) NOT NULL,
[IPAddress] [nvarchar](15) NOT NULL,
[MACAddress] [nvarchar](17) NOT NULL,
[Checked] [int] NOT NULL CONSTRAINT [DF_ARPTable_Checked]  DEFAULT ((0)),
 CONSTRAINT [PK_ARPTable] PRIMARY KEY CLUSTERED
(
[Serial] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Software List (Enhanced Version) Load into DB

'On Error Resume Next

SourcePath = "D:\Info\Data"

GapString = "=====Gap====="
InfoString = "=====Info====="

DebugMode = 0

SQLServer="127.0.0.1"
SQLUser="Info"
SQLPassword="password"
SQLDB="Info"
SQLConnectionTimeout = 600

DonnotKeepOSLastBootUpTime = 1

Software List (Enhanced Version)


' ----- 參數設定開始 -----

ADDomain = "Contoso"
TargetFilePath = "\\FileServer\Info$\Data\*.dbd"
GapString = "=====Gap====="
InfoString = "=====Info====="

' 除厝模式: (派送用戶端執行應設為 0)
' 0: 不顯示訊息
' 1: 顯示錯誤訊息
DebugMode = 0

' 資料取得方式 (此參數會在 DB Record 中註記):
' 1: Local - Client Push 檔案給 Server 讀取
' 2: Remote - Server 主動連線取得資料產生檔案
InfoDataType = 1

' 如果資料取得方式是 2: Server 主動連線取得資料產生檔案
' 此處給予客戶端有可能使用的管理員帳號密碼
AuthUserNameString = ""
AuthPasswordString = ""

' ----- 參數設定結束 -----

2016-09-30

Bash Script for Linux to Connect to Microsoft VDI

Script by Dino9021

因為 Remmina 一定要記住 User Name & Password 才能連線
有安全上的疑慮, 因此利用 Bash Script 搭配 xfreerdp 來進行連線作業

需要將連線資源寫成文字檔放在 Web Server 上讓 Bash Script 去下載解讀
如此如果資源有異動, 就不需要去 Client 更換 Script, 只要修改 Web Server 上的資源檔案就行了
而且如此一來不需要安裝 Remmina, 只要有 xfreerdp 就可以用了
經過測試, 如果不裝 Remmina 的話 xfreerdp 無法裝到 2.0 以上版本 (才支援 RDG)

安裝時參考 Microsoft 2012 R2 VDI 攻略 中 ubuntu 的安裝方法


  • Install Remmina and FreeRDP to Connect to VDI Through RD Gateway
    • sudo apt-get update
    • sudo apt-get dist-upgrade
    • sudo apt-add-repository ppa:remmina-ppa-team/remmina-next
    • sudo apt-get update
    • sudo apt-get install freerdp-x11 remmina remmina-plugin-rdp
    • sudo apt-get upgrade
    • xfreerdp --version


2016-09-21

Ubuntu Upgrade Remmin

sudo apt-get purge --auto-remove freerdp-x11 remmina remmina-common remmina-plugin-rdp remmina-plugin-vnc remmina-plugin-gnome remmina-plugin-nx remmina-plugin-telepathy remmina-plugin-xdmcp

sudo apt-get update
sudo apt-get install software-properties-common

sudo apt-add-repository ppa:remmina-ppa-team/remmina-next
sudo apt-get update
sudo apt-get install freerdp-x11 remmina remmina-plugin-rdp

sudo apt-get install freerdp-x11 remmina remmina-plugin-rdp remmina-common remmina-plugin-vnc remmina-plugin-gnome remmina-plugin-nx remmina-plugin-telepathy remmina-plugin-xdmcp

sudo apt-get upgrade
xfreerdp --version

sudo apt-get dist-upgrade

2016-07-15

Trust relationship has been lost with domain controller

Trust relationship has been lost with domain controller

當電腦與網域失去信任時不要急著退出網域再重新加入,
先在失去信任的那台電腦上試試看這個 PowerShell 指令:


Create Drive D Partition for VDI Pooled VM User Profile Desk

在部署 VDI Pooled VM 時, User 只有 User Profile 可以儲存資料檔案, 或者存放到 UNC Path 的 File Server
在許多情況下 User 會抱怨沒有 Drive D 能存放資料很不習慣, 在使用上也會有 File Server 連線速度較慢的問題
此時我們可以應變的方式為將 User Profile Disk Expand 後提供一個 Partition 給 User 使用
做法是先將 User Profile Disk 利用 Hyper-V 的 Edit Disk 功能 Expand
如果建立 User Profile Disk 時給予的容量限制是 1G, 那麼預設 User Profile Disk: UVHD-template.vhdx 就只有一個 1G 的 Partition
如果要給 User 5G 的 Drive D 空間, Expand 時請填入 1+5=6G 的磁碟大小
如此一來 User Profile Disk 就變成一個 6G 的 Disk, 而磁碟的開頭處有一個 1G 的 Partition 作為 User Profile 使用
後面有一個 5G 的未分割空間

那麼接下來要如何把這 5G 的空間建立 Partition 給 User 使用呢?
我們要利用到 AutoIT 與 VBScript, 請參考以下程式

2016-05-25

用批次檔 (Batch) 刪除指定天數之前 (過期) 所有子目錄及檔案

echo "Deleting old files ..."
forfiles /p D:\Temp /d -14 /c "cmd /c del /f /s /q @file"
echo "Deleting old directories ..."
forfiles /p D:\Temp /d -14 /c "cmd /c rd /s /q @file"