顯示具有 VBScript 標籤的文章。 顯示所有文章
顯示具有 VBScript 標籤的文章。 顯示所有文章

2025-08-11

Split and Merge Sheng-Bo MailStore for SQL DB

It's not a popular Software / Application.
You may not need it.

First : SplitDB.vbs (Run on MailStore Server)
=> Split DB by day with SplitDB.vbs

Second: MergeDB.vbs  (Run on MailSearch Server)
=> Merge DB to Quarter

2020-08-14

以 Logon Script 幫 User 更換印表機

基於某些原因有時候我們要幫 User 變更印表機
比如 Printer Server 換一台了,或是租賃的影印機換一台之類的
通常對於電腦操作較熟悉的 User 用搜尋安裝就可以了 (AD 環境下有做好相關設定)
但某些人就是需要你幫忙
為了成為一位體貼 User 的 MIS,用 GPO 派送 Script 去更換印表機也是很正常的事情
以下 VBS 是非常多年以前寫的,變數的部份很偷懶就直接用兩個陣列下去自己代 Printer 進去就好
反正這種東西只是臨時性的,程式寫醜一點無所謂

設定好後可以用 GPO 設定 User 在登入時執行,Script 邏輯:
  1. 記下 User 有哪幾台
  2. 記下 User 的 Default Printer 是哪一台
  3. 刪除 Printer
  4. 新增 Printer (on New Server)
  5. 設定 Default Printer

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

Dim PrinterToReplace
Dim PrinterReplacement
' PrinterToReplace 與 PrinterReplacement 欄位數量必須相同
' 下例: 
' "\\Printer1.Contoso.com\HPPrinter1" 更換為 "\\Printer1.Contoso.com\HPPrinter1"
' "\\Printer1.Contoso.com\HPPrinter11" 更換為 "\\Printer2.Contoso.com\HPPrinter12"

2018-09-06

取得連結網路磁碟機的資訊 (Get Mapped Network Drive Letter & UNC Path) with VBS

Set objNetwork = WScript.CreateObject("WScript.Network")
Set colDrives = objNetwork.EnumNetworkDrives
For i = 0 to colDrives.Count-1 Step 2
   Wscript.Echo colDrives.Item(i) & vbTab & colDrives.Item (i + 1)
Next

2018-03-13

VBScript String Encode / Decode

VBScript String Encode / Decode
出處 https://stackoverflow.com/questions/496751/base64-encode-string-in-vbscript

有時候有文字傳遞的需求, 但卻又無法直接傳遞中文字 (編碼問題)
此時先將文字轉換成 Base64 編碼, 傳遞後再 Decode 是最好的辦法
只需要帶入一些函式即可簡單處理

' Base64-encode: from UTF-8-encoded bytes.
Word1 = Base64Encode("Word1", False)

' Base64-encode: from UTF-16 LE-encoded bytes.
Word2 = Base64Encode("Word2", True)

' Base64-decode: back to a VBScript string via UTF-8.
Word3 = ConvertFromUTF8(Base64Decode(Word1, False))

' Base64-decode: back to a VBScript string via UTF-16 LE.
Word4 = ConvertFromUTF8(Base64Decode(Word2, True))

wscript.echo Word1 & vbcrlf & Word2 & vbcrlf & Word3 & vbcrlf & Word4

Symantec Definition Auto Downloader VBScript for SEPM

如果是在暗網 (Dark Network) 裡面使用 Symantec Endpoint Protection 的話
可能沒辦法透過全自動 Internet Update 來更新病毒碼
還好 Symantec 有提供了手動下載病毒碼並放到特定路徑讓 SEPM 自己去更新的辦法
但如果要人工下載實在太麻煩又會忘記
於是寫了一個簡單的 VBScript 來下載

因為不熟悉 VBS 連接 FTP 的語法
找不到怎麼取得檔案日期時間以便比對出最新的一個來下載
所幸 Symantec 的檔名應該是按照 Hex 版本號來命名
所以比對檔名也可以取得最後一個最新的病毒定義檔

該下載哪個版本的病毒定義檔要 到這裡來確認
改前面兩個參數指定下載來源與目的就可以了
如果未來 Symantec 有任何異動, 就自己改一下吧

2017-03-02

Software List Remote (Enhanced Version)


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

ADDomain = "contoso"
TargetFilePath = "D:\Info\Data\*.dbd"
GapString = "=====Gap====="
InfoString = "=====Info====="

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

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

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

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

2016-12-08

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-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)

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-07-15

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, 請參考以下程式

2013-07-04

找出 AD 中沒有 Member 的 Group

通常在 AD 中會有許多 Group 代表各單位或部門
但因為組織異動的關係有些 Group 可能已經沒有 Member 或 MemberOf 了

本 VBScript 程式可以找出哪些 Group 已經沒有 Member 或 MemberOf 存在
並將這些 Group 的 DN 以一行一個的方式輸出成純文字檔案
存放在與本程式相同資料夾中

定時從 DC 的 Event Log 中撈出 Account Lock Out 事件

有一種病毒會不斷 Try 網域帳號, 導致許多 User 的帳號被 Lock Out (密碼錯誤次數過多)

會發生兩種問題:
1. 電腦中毒擴大
2. MIS 電話被 User 打爆

此時可利用本 VBScript 程式定時從 DC 的 Event Log 中撈出 Account Lock Out 事件
得知哪個帳號在什麼時間從哪個 IP 被 Lock Out

預設參數設定每 300 秒檢查 300 秒內的 Log
跑此程式的帳號必須有權限可存取目標 DC 的 Event Log
可存成 Log 檔亦可發出信件給需要進行處理的人員

2013.07.05 修改: 合併多個一樣的事件
2013.07.07 選項: 合併多個一樣的事件時的表現方式
2013.08.01 選項: 檢查間格時間內同一事件發生次數大於等於多少次才發報
2013.08.01 選項: 解析用戶端位址

檢查 AD 中已到期帳號

一般實務上來說, 在帳號到期前應該把到期日設定上去
等帳號實際到期後再將帳號停用並搬到專門放到期帳號的 OU 中

但這麼多帳號往往會忘記到底哪些帳號是到期的
本 VBScript 程式可以將已到期帳號找出並發信通知後續動作

收信人 Email 如果有多位應該要設定 Group Mail
所以本程式不寫成可寄發給多人

根據 Software List 產生的 .csv 檔搜尋特定軟體

本 VBScript 程式可對基於 Software List 產生的 .csv 檔進行軟體關鍵字搜尋
產生軟體安裝狀態報表

Find.csv
    以軟體為單位顯示

Find-OneRow.csv
    以電腦為單位顯示

2013.07.26 增加 "排除關鍵字"
2014.10.03 修正關鍵字多打分號 (;) 產生空值造成沒有結果的問題
                    欄位分隔符號由逗號 (,) 改為 vbTab, Excel 可以直接開啟不用選分隔符號
2014.11.24 請改用 取得電腦安裝軟體清單及基本資訊 Software List V2

取得電腦安裝軟體清單及基本資訊 Software List

在微軟 TechNet 網站可以找到 List Installed Software 的 VBS Script
可惜執行後只能取得 32位元的軟體列表

在 Dave's Daydreams 的 Listing installed applications on Vista 64-bit with WMI
找到了列出 64位元軟體的語法, 不過取得的資訊不夠詳細
於是將上述兩者融合, 並加入一些其他功能後產生出以下符合自己需求的程式
本 VBScript 程式可取得以下資料存成 .csv 檔

CPU資訊
RAM資訊
OS: 作業系統版本
Install Date: 作業系統安裝日期時間
ComputerName: 電腦名稱
UserName: 登入使用者名稱
IPAddress: 網卡 IPAddress
MACAddress: 網卡 MACAddress
32-bit Applications: 32位元軟體清單
64-bit Applications: 64位元軟體清單

2013.08.28 增加 CPU 資訊 (廠牌,型號,名稱等) / BaseBoard 資訊 (廠牌,型號) / RAM 資訊 (容量,Bank,數量)
2014.10.03 將 (Tab) 改為 vbTab, 修正從網頁上複製的 Code 執行後字元不一致的問題