WMI 實務應用範例

58
WMI WMI 實實實實實實 實實實實實實 實實實 實實實 實實實實實實實實 實實實實實實實實 [email protected] [email protected] http://teacher.allok.com.tw http://teacher.allok.com.tw MCP, MCP+I, MCSA, MCSE, MCDBA, MCAD, MCP, MCP+I, MCSA, MCSE, MCDBA, MCAD, MCSD, MCT, MVP MCSD, MCT, MVP

description

WMI 實務應用範例. 曹祖聖 台灣微軟資深講師 [email protected] http://teacher.allok.com.tw MCP, MCP+I, MCSA, MCSE, MCDBA, MCAD, MCSD, MCT, MVP. 上一次的作業. 撰寫一個指令碼 功能 監控來自其它電腦的網路檔案存取 將事件記錄下來 提示 使用 WQL 事件過濾 從 Win32_Share 開始著手,檢視相關的關連類別 . 解答. Set objService = GetObject("winmgmts:\\ServerA") - PowerPoint PPT Presentation

Transcript of WMI 實務應用範例

Page 1: WMI 實務應用範例

WMI WMI 實務應用範例實務應用範例

曹祖聖曹祖聖台灣微軟資深講師台灣微軟資深講師 [email protected]@syset.com http://teacher.allok.com.twhttp://teacher.allok.com.tw MCP, MCP+I, MCSA, MCSE, MCDBA, MCAD, MCSD, MCT, MVPMCP, MCP+I, MCSA, MCSE, MCDBA, MCAD, MCSD, MCT, MVP

Page 2: WMI 實務應用範例

44/60/60

上一次的作業上一次的作業撰寫一個指令碼撰寫一個指令碼

功能功能監控來自其它電腦的網路檔案存取監控來自其它電腦的網路檔案存取將事件記錄下來將事件記錄下來

提示提示使用 使用 WQL WQL 事件過濾事件過濾從 從 Win32_Share Win32_Share 開始著手,檢視相關的關連類別 開始著手,檢視相關的關連類別

Page 3: WMI 實務應用範例

55/60/60

解答解答Set objService = GetObject("winmgmts:\\ServerA")Set objService = GetObject("winmgmts:\\ServerA")

Do While TrueDo While TrueSet colSettings = objService.ExecQuery( _Set colSettings = objService.ExecQuery( _

"Select * from Win32_ServerConnection")"Select * from Win32_ServerConnection")

For Each obj in colSettings For Each obj in colSettings WScript.Echo obj.ComputerName & "," & obj.UserNameWScript.Echo obj.ComputerName & "," & obj.UserName

NextNextWScript.Sleep(10000)WScript.Sleep(10000)

LoopLoop

Page 4: WMI 實務應用範例

66/60/60

先講在前頭 先講在前頭 ……這一次 這一次 ……

我不再重新講什麼是 我不再重新講什麼是 WMI, CIM, WQL, … WMI, CIM, WQL, … 了了因為範例太多,時間不夠因為範例太多,時間不夠

我會一直講範例我會一直講範例一直講、一直講、一直講、一直講、… … 講到你受不了起來抗議為止講到你受不了起來抗議為止

您要有心理準備 您要有心理準備 ……接下來有一大堆的程式碼,近百個範例接下來有一大堆的程式碼,近百個範例

當然我會解釋的,別擔心 當然我會解釋的,別擔心 可是每個範例,我只有 可是每個範例,我只有 1 1 分多鐘可以用,慘 分多鐘可以用,慘 ~~~~~~

大家深呼吸一口氣 大家深呼吸一口氣 … … 讓我們開始吧 讓我們開始吧 ……

Page 5: WMI 實務應用範例

77/60/60

大綱大綱使用者與群組管理使用者與群組管理Active Directory ADO ProviderActive Directory ADO Provider

服務啟動的帳號與密碼服務啟動的帳號與密碼電腦、網域、工作群組電腦、網域、工作群組其它其它

Page 6: WMI 實務應用範例

88/60/60

大綱大綱使用者與群組管理使用者與群組管理Active Directory ADO ProviderActive Directory ADO Provider

服務啟動的帳號與密碼服務啟動的帳號與密碼電腦、網域、工作群組電腦、網域、工作群組其它其它

Page 7: WMI 實務應用範例

99/60/60

取得目前使用者的 取得目前使用者的 LDAP LDAP 路徑路徑

Set objADSysInfo = CreateObject("ADSystemInfo")Set objADSysInfo = CreateObject("ADSystemInfo")

WScript.Echo WScript.Echo "" 目前使用者 目前使用者 LDAP LDAP 路徑路徑 :" & _:" & _objADSysInfo.UserNameobjADSysInfo.UserName

Page 8: WMI 實務應用範例

1010/60/60

取得目前使用者所屬的群組取得目前使用者所屬的群組Set objADSysInfo = CreateObject("ADSystemInfo")Set objADSysInfo = CreateObject("ADSystemInfo")strUser = objADSysInfo.UserNamestrUser = objADSysInfo.UserName

S = strUSer & vbCrLf & "S = strUSer & vbCrLf & " 屬於以下群組屬於以下群組 :" & vbCrLf:" & vbCrLfSet objUser = GetObject("LDAP://" & strUser)Set objUser = GetObject("LDAP://" & strUser)

If IsArray(objUser.MemberOf) ThenIf IsArray(objUser.MemberOf) ThenFor Each group in objUser.MemberOfFor Each group in objUser.MemberOf Set objGroup = GetObject("LDAP://" & group)Set objGroup = GetObject("LDAP://" & group) S = S & objGroup.CN & vbCrLfS = S & objGroup.CN & vbCrLfNextNext

ElseElseS = S & objUser.MemberOfS = S & objUser.MemberOf

End IfEnd If

WScript.Echo SWScript.Echo S

Page 9: WMI 實務應用範例

1111/60/60

取得目前使用者所屬的群組取得目前使用者所屬的群組Set objADSysInfo = CreateObject("ADSystemInfo")Set objADSysInfo = CreateObject("ADSystemInfo")strUser = objADSysInfo.UserNamestrUser = objADSysInfo.UserName

S = strUSer & vbCrLf & "S = strUSer & vbCrLf & " 屬於以下群組屬於以下群組 :" & vbCrLf:" & vbCrLfSet objUser = GetObject("LDAP://" & strUser)Set objUser = GetObject("LDAP://" & strUser)

For Each group in objUser.GroupsFor Each group in objUser.GroupsS = S & group.CN & vbCrLfS = S & group.CN & vbCrLf

NextNext

WScript.Echo SWScript.Echo S

Page 10: WMI 實務應用範例

1212/60/60

取得組織單位下使用者的群組取得組織單位下使用者的群組Set objUsers = GetObject("LDAP://OU=RD,DC=mcg,DC=com") Set objUsers = GetObject("LDAP://OU=RD,DC=mcg,DC=com") objUsers.Filter = Array("User")objUsers.Filter = Array("User")

For Each obj In objUsersFor Each obj In objUsersS = obj.AdsPath & vbCrLf & "S = obj.AdsPath & vbCrLf & " 屬於以下群組屬於以下群組 :" & vbCrLf:" & vbCrLfFor Each group In obj.GroupsFor Each group In obj.Groups

S = S & group.CN & vbCrLfS = S & group.CN & vbCrLfNextNext

WScript.Echo SWScript.Echo SNextNext

Page 11: WMI 實務應用範例

1313/60/60

取得某一群組的成員取得某一群組的成員Set obj = GetObject( _Set obj = GetObject( _

"LDAP://CN=RdManagers,OU=RD,DC=mcg,DC=com") "LDAP://CN=RdManagers,OU=RD,DC=mcg,DC=com")

S = obj.AdsPath & vbCrLf & "S = obj.AdsPath & vbCrLf & " 的成員的成員 :" & vbCrLf:" & vbCrLf

For Each mem In obj.MembersFor Each mem In obj.MembersS = S & mem.CN & vbCrLfS = S & mem.CN & vbCrLf

NextNext

WScript.Echo SWScript.Echo S

Page 12: WMI 實務應用範例

1414/60/60

使用者是否為本機系統管理員使用者是否為本機系統管理員Set objNetwork = CreateObject("Wscript.Network")Set objNetwork = CreateObject("Wscript.Network")

strComputer = objNetwork.ComputerNamestrComputer = objNetwork.ComputerNamestrUser = objNetwork.UserNamestrUser = objNetwork.UserName

Set objGroup = GetObject( _Set objGroup = GetObject( _"WinNT://" & strComputer & "/Administrators")"WinNT://" & strComputer & "/Administrators")

For Each objUser in objGroup.MembersFor Each objUser in objGroup.Members If objUser.Name = strUser ThenIf objUser.Name = strUser Then Wscript.Echo strUser & " Wscript.Echo strUser & " 是本機系統管理員。是本機系統管理員。 "" End IfEnd IfNextNext

Page 13: WMI 實務應用範例

1515/60/60

新增使用者到本機群組新增使用者到本機群組strComputer = "ServerC"strComputer = "ServerC"strDomain = "MCG"strDomain = "MCG"strUser = "user1"strUser = "user1"

Set objGroup = GetObject( _Set objGroup = GetObject( _"WinNT://" & strComputer & "/Administrators")"WinNT://" & strComputer & "/Administrators")

Set objUser = GetObject( _Set objUser = GetObject( _"WinNT://" & strDomain & "/" & strUser)"WinNT://" & strDomain & "/" & strUser)

objGroup.Add(objUser.ADsPath)objGroup.Add(objUser.ADsPath)

Page 14: WMI 實務應用範例

1616/60/60

變更使用者密碼變更使用者密碼

Set objUser = GetObject( _Set objUser = GetObject( _"LDAP://CN=user1,OU=RD,DC=mcg,DC=com")"LDAP://CN=user1,OU=RD,DC=mcg,DC=com")

objUser.SetPassword("Pa$$word!")objUser.SetPassword("Pa$$word!")

變更本機使用者的密碼變更本機使用者的密碼

變更網域使用者的密碼變更網域使用者的密碼

Set objUser = GetObject("WinNT://ServerC/user1")Set objUser = GetObject("WinNT://ServerC/user1")

objUser.SetPassword("Pa$$word!")objUser.SetPassword("Pa$$word!")

Page 15: WMI 實務應用範例

網域使用者與群組網域使用者與群組

Page 16: WMI 實務應用範例

1818/60/60

大綱大綱使用者與群組管理使用者與群組管理Active Directory ADO ProviderActive Directory ADO Provider

服務啟動的帳號與密碼服務啟動的帳號與密碼電腦、網域、工作群組電腦、網域、工作群組其它其它

Page 17: WMI 實務應用範例

1919/60/60

Active Directory Active Directory 是個資料庫 是個資料庫 !!

Active Directory Active Directory 本來就是個資料庫本來就是個資料庫所以 所以 ……

可以用 可以用 ADO ADO 來存取它 來存取它 ?!?!

是的 是的 !!

透過 透過 Active Directory ADO Provider Active Directory ADO Provider Provider Provider 名稱名稱 : ADsDSOObject : ADsDSOObject

連線字串連線字串 : Active Directory Provider : Active Directory Provider

Page 18: WMI 實務應用範例

2020/60/60

建立 建立 AD ADO Provider AD ADO Provider 連線連線

Set objConnection = CreateObject("ADODB.Connection")Set objConnection = CreateObject("ADODB.Connection")objConnection.Provider = "ADsDSOObject"objConnection.Provider = "ADsDSOObject"objConnection.Open "Active Directory Provider"objConnection.Open "Active Directory Provider"

Set objCommand = CreateObject("ADODB.Command")Set objCommand = CreateObject("ADODB.Command")Set objCommand.ActiveConnection = objConnectionSet objCommand.ActiveConnection = objConnection

使用 使用 Windows Windows 整合驗證整合驗證

Page 19: WMI 實務應用範例

2121/60/60

建立 建立 AD ADO Provider AD ADO Provider 連線連線

Set objConnection = CreateObject("ADODB.Connection")Set objConnection = CreateObject("ADODB.Connection")objConnection.Provider = "ADsDSOObject"objConnection.Provider = "ADsDSOObject"

objConnection.Properties("User ID") = "Administrator"objConnection.Properties("User ID") = "Administrator"objConnection.Properties("Password") = “Pa$$word!"objConnection.Properties("Password") = “Pa$$word!"objConnection.Properties("Encrypt Password") = TRUEobjConnection.Properties("Encrypt Password") = TRUEobjConnection.Properties("ADSI Flag") = 1 objConnection.Properties("ADSI Flag") = 1

objConnection.Open "Active Directory Provider"objConnection.Open "Active Directory Provider"

Set objCommand = CreateObject("ADODB.Command")Set objCommand = CreateObject("ADODB.Command")Set objCommand.ActiveConnection = objConnectionSet objCommand.ActiveConnection = objConnection

使用指定使用者與密碼使用指定使用者與密碼

Page 20: WMI 實務應用範例

2222/60/60

建立 建立 AD ADO Provider AD ADO Provider 連線連線連線屬性 連線屬性 (Properties)(Properties)

屬性屬性 說明說明User IDUser ID 使用者帳號,可以是 使用者帳號,可以是 user1user1、、 MCG\MCG\

user1user1、、 [email protected]@mcg.com

PasswordPassword 密碼密碼Encrypt Encrypt PasswordPassword

是否要加密密碼是否要加密密碼

ADSI FlagADSI Flag ADS_SECURE_AUTHENTICATION (1). ADS_SECURE_AUTHENTICATION (1). 要求安全驗證要求安全驗證ADS_USE_ENCRYPTION (2). ADS_USE_ENCRYPTION (2). 要求 要求 ADSI ADSI 加密傳輸的資料加密傳輸的資料ADS_USE_SIGNING (40). ADS_USE_SIGNING (40). 檢查資料完整性 檢查資料完整性 (( 也要設 也要設 1)1)ADS_USE_SEALING (80). ADS_USE_SEALING (80). 使用 使用 Kerberos Kerberos 加密資料加密資料 (( 也要也要設 設 1)1)

Page 21: WMI 實務應用範例

2323/60/60

預設只會傳回前 預設只會傳回前 1000 1000 筆資料筆資料解決方案,設定 解決方案,設定 PageSize PageSize 屬性屬性

AD ADO Provider AD ADO Provider 會每次傳回 會每次傳回 500 500 筆資料筆資料然後再傳回下 然後再傳回下 500 500 筆資料筆資料一直到所有資料全部取回為止一直到所有資料全部取回為止

PageSize PageSize 屬性屬性

objCommand.Properties("Page Size") = 500objCommand.Properties("Page Size") = 500

Page 22: WMI 實務應用範例

2424/60/60

AD AD 是樹狀結構的資料庫是樹狀結構的資料庫必須設定搜尋的範圍必須設定搜尋的範圍使用 使用 Searchscope Searchscope 屬性屬性 ::

Searchscope Searchscope 屬性屬性

Const ADS_SCOPE_BASE = 0Const ADS_SCOPE_BASE = 0Const ADS_SCOPE_ONELEVEL = 1Const ADS_SCOPE_ONELEVEL = 1Const ADS_SCOPE_SUBTREE = 2Const ADS_SCOPE_SUBTREE = 2

objCommand.Properties(“Searchscope") = _objCommand.Properties(“Searchscope") = _ADS_SCOPE_BASEADS_SCOPE_BASE

Page 23: WMI 實務應用範例

2525/60/60

ADS_SCOPE_BASE = 0ADS_SCOPE_BASE = 0

Page 24: WMI 實務應用範例

2626/60/60

ADS_SCOPE_ONELEVEL = 1ADS_SCOPE_ONELEVEL = 1

Page 25: WMI 實務應用範例

2727/60/60

ADS_SCOPE_SUBTREE = 2ADS_SCOPE_SUBTREE = 2

Page 26: WMI 實務應用範例

2828/60/60

設定排序方式設定排序方式

不能做一層以上的排序不能做一層以上的排序

Sort On Sort On 屬性屬性

objCommand.Properties("Sort On") = "SN"objCommand.Properties("Sort On") = "SN"

Page 27: WMI 實務應用範例

2929/60/60

設定 設定 Command Command 物件的 物件的 CommandText CommandText 屬屬性性類似存取資料庫的 類似存取資料庫的 SQL SQL 語法語法

注意大小寫,而且不能用 注意大小寫,而且不能用 SELECT * FROM SELECT * FROM ……

但是,別想太多 但是,別想太多 ……你不能用 你不能用 INSERT, UPDATE, DELETE INSERT, UPDATE, DELETE 語法 語法 !!

查詢語法查詢語法

objCommand.CommandText = _objCommand.CommandText = _"SELECT Name FROM 'LDAP://DC=mcg,DC=com' " & _"SELECT Name FROM 'LDAP://DC=mcg,DC=com' " & _"WHERE objectCategory='user'""WHERE objectCategory='user'"

Page 28: WMI 實務應用範例

3030/60/60

查詢語法 查詢語法 (( 範例範例 ))

objCommand.CommandText = _objCommand.CommandText = _"SELECT CN, Department, Title FROM " & _"SELECT CN, Department, Title FROM " & _"'LDAP://DC=mcg,DC=com' " & _"'LDAP://DC=mcg,DC=com' " & _"WHERE objectCategory='user'""WHERE objectCategory='user'"

objCommand.CommandText = _objCommand.CommandText = _"SELECT CN, Department, Title FROM " & _"SELECT CN, Department, Title FROM " & _"'LDAP://dc=fabrikam,dc=com' " & _"'LDAP://dc=fabrikam,dc=com' " & _"WHERE objectCategory='user' " & _"WHERE objectCategory='user' " & _"OR objectCategory='computer'""OR objectCategory='computer'"

Page 29: WMI 實務應用範例

3131/60/60

objectClass vs. objectCategoryobjectClass vs. objectCategory

objectClass=‘user’ objectClass=‘user’ 不只會傳回所有使用者帳戶物件不只會傳回所有使用者帳戶物件還會傳回所有繼承 還會傳回所有繼承 User User 類別的子類別的物件類別的子類別的物件

Page 30: WMI 實務應用範例

3232/60/60

列出網域所有使用者列出網域所有使用者objCommand.CommandText = _objCommand.CommandText = _

"SELECT Name FROM 'LDAP://DC=mcg,DC=com' " & _"SELECT Name FROM 'LDAP://DC=mcg,DC=com' " & _"WHERE objectCategory='user'" "WHERE objectCategory='user'"

Set RS = objCommand.ExecuteSet RS = objCommand.Execute

Do While Not RS.EOFDo While Not RS.EOF S = S & RS("Name") & vbCrLfS = S & RS("Name") & vbCrLf RS.MoveNextRS.MoveNextLoopLoop

WScript.Echo SWScript.Echo S

Page 31: WMI 實務應用範例

3333/60/60

使用者帳戶所屬的組織單位使用者帳戶所屬的組織單位objCommand.CommandText = _objCommand.CommandText = _

"SELECT distinguishedName FROM 'LDAP://DC=mcg,DC=com' " & _"SELECT distinguishedName FROM 'LDAP://DC=mcg,DC=com' " & _"WHERE objectCategory='user' " & _"WHERE objectCategory='user' " & _"AND sAMAccountName='user1'""AND sAMAccountName='user1'"

Set RS = objCommand.ExecuteSet RS = objCommand.Execute

Do Until RS.EOFDo Until RS.EOF strDN = RS("distinguishedName")strDN = RS("distinguishedName") arrPath = Split(strDN, ",")arrPath = Split(strDN, ",") intLength = Len(arrPath(1))intLength = Len(arrPath(1)) intNameLength = intLength - 3intNameLength = intLength - 3 Wscript.Echo Right(arrPath(1), intNameLength)Wscript.Echo Right(arrPath(1), intNameLength) RS.MoveNextRS.MoveNextLoopLoop

' RS("distinguishedName").Value --> CN=user1,OU=RD,DC=mcg,DC=com' RS("distinguishedName").Value --> CN=user1,OU=RD,DC=mcg,DC=com' arrPath(1) --> OU=RD' arrPath(1) --> OU=RD

Page 32: WMI 實務應用範例

3434/60/60

組織單位內使用者帳戶的數目組織單位內使用者帳戶的數目Const ADS_SCOPE_ONELEVEL = 1Const ADS_SCOPE_ONELEVEL = 1

objCommand.Properties("Searchscope") = ADS_SCOPE_ONELEVEL objCommand.Properties("Searchscope") = ADS_SCOPE_ONELEVEL

objCommand.CommandText = _objCommand.CommandText = _"SELECT Name FROM 'LDAP://OU=RD,DC=mcg,DC=com' " & _"SELECT Name FROM 'LDAP://OU=RD,DC=mcg,DC=com' " & _"WHERE objectCategory='user'" "WHERE objectCategory='user'"

Set RS = objCommand.ExecuteSet RS = objCommand.Execute

Wscript.Echo "Wscript.Echo " 使用者帳戶數目 使用者帳戶數目 = " & RS.RecordCount= " & RS.RecordCount

Page 33: WMI 實務應用範例

使用 使用 ADO ADO 存取 存取 ADAD

Page 34: WMI 實務應用範例

3636/60/60

大綱大綱使用者與群組管理使用者與群組管理Active Directory ADO ProviderActive Directory ADO Provider

服務啟動的帳號與密碼服務啟動的帳號與密碼電腦、網域、工作群組電腦、網域、工作群組其它其它

Page 35: WMI 實務應用範例

3737/60/60

列出所有服務的啟動帳號列出所有服務的啟動帳號Set objService = GetObject("winmgmts:")Set objService = GetObject("winmgmts:")

Set objCol = objService.ExecQuery("SELECT * FROM Win32_Service")Set objCol = objService.ExecQuery("SELECT * FROM Win32_Service")

For Each obj In objColFor Each obj In objColS = S & obj.DisplayName & " ( " & obj.StartName & " )" & vbCrLf S = S & obj.DisplayName & " ( " & obj.StartName & " )" & vbCrLf

NextNext

WScript.Echo SWScript.Echo S

Page 36: WMI 實務應用範例

3838/60/60

列出某一帳號啟動的服務列出某一帳號啟動的服務UserName = ".\\SqlAdmin"UserName = ".\\SqlAdmin" ' WQL ' WQL 語法中 語法中 \ \ 符號要用 符號要用 \\ \\ 代替代替

Set objService = GetObject("winmgmts:")Set objService = GetObject("winmgmts:")

Set objCol = objService.ExecQuery( _Set objCol = objService.ExecQuery( _"SELECT * FROM Win32_Service WHERE " & _"SELECT * FROM Win32_Service WHERE " & _StartName='" & UserName & "'")StartName='" & UserName & "'")

S = "S = " 以下都是用 以下都是用 " & UserName & " " & UserName & " 帳戶啟動的服務帳戶啟動的服務 :" & vbCrLf:" & vbCrLf

For Each obj In objColFor Each obj In objColS = S & obj.DisplayName & vbCrLfS = S & obj.DisplayName & vbCrLf

NextNext

WScript.Echo SWScript.Echo S

Page 37: WMI 實務應用範例

3939/60/60

修改某帳號啟動服務的密碼修改某帳號啟動服務的密碼OldUserName = ".\\SqlAdmin"OldUserName = ".\\SqlAdmin" ' WQL ' WQL 語法中 語法中 \ \ 符號要用 符號要用 \\ \\ 代替代替NewUserName = ".\jimycao"NewUserName = ".\jimycao"NewPassword = "Pa$$word!"NewPassword = "Pa$$word!"

Set objService = GetObject("winmgmts:")Set objService = GetObject("winmgmts:")Set objCol = objService.ExecQuery( _Set objCol = objService.ExecQuery( _

"SELECT * FROM Win32_Service WHERE " & _"SELECT * FROM Win32_Service WHERE " & _StartName='" & OldUserName & "'")StartName='" & OldUserName & "'")

For Each obj In objColFor Each obj In objColIf NewUserName = "" ThenIf NewUserName = "" Then

obj.Change , , , , , , , NewPasswordobj.Change , , , , , , , NewPasswordElseElse

obj.Change , , , , , , NewUserName, NewPasswordobj.Change , , , , , , NewUserName, NewPasswordEnd IfEnd IfS = S & obj.DisplayName & vbCrLfS = S & obj.DisplayName & vbCrLf

NextNext

Page 38: WMI 實務應用範例

服務啟動的帳號與密碼服務啟動的帳號與密碼

Page 39: WMI 實務應用範例

4141/60/60

大綱大綱使用者與群組管理使用者與群組管理Active Directory ADO ProviderActive Directory ADO Provider

服務啟動的帳號與密碼服務啟動的帳號與密碼電腦、網域、工作群組電腦、網域、工作群組其它其它

Page 40: WMI 實務應用範例

4242/60/60

修改電腦名稱修改電腦名稱NewComputerName = "T40"NewComputerName = "T40"

Set objService = GetObject("winmgmts:{(shutdown)}")Set objService = GetObject("winmgmts:{(shutdown)}")Set objCols = objService.InstancesOf("Win32_ComputerSystem")Set objCols = objService.InstancesOf("Win32_ComputerSystem")

For Each obj In objColsFor Each obj In objColsobj.Rename NewComputerNameobj.Rename NewComputerName

NextNext

Set objCols = objService.InstancesOf("Win32_OperatingSystem")Set objCols = objService.InstancesOf("Win32_OperatingSystem")

For Each obj In objColsFor Each obj In objColsobj.Reboot()obj.Reboot()

NextNext

Page 41: WMI 實務應用範例

4343/60/60

加入網域加入網域NewDomainName = "mcg.com"NewDomainName = "mcg.com"UserName = "Administrator"UserName = "Administrator"Password = "Pa$$word!"Password = "Pa$$word!"OU = "OU=Sales,DC=mcg,DC=com"OU = "OU=Sales,DC=mcg,DC=com"

Set objService = GetObject("winmgmts:{(shutdown)}")Set objService = GetObject("winmgmts:{(shutdown)}")

Set objCols = objService.InstancesOf("Win32_ComputerSystem")Set objCols = objService.InstancesOf("Win32_ComputerSystem")

For Each obj In objColsFor Each obj In objColsobj.JoinDomainOrWorkgroup NewDomainName, _obj.JoinDomainOrWorkgroup NewDomainName, _

Password, UserName, OU, 1 + 2 + 16Password, UserName, OU, 1 + 2 + 16NextNext

WScript.Echo "WScript.Echo " 電腦已經加入 電腦已經加入 " & NewDomainName & " " & NewDomainName & " 網域。網域。 ""

Page 42: WMI 實務應用範例

4444/60/60

加入網域 加入網域 – – FJoinOptions FJoinOptions 參參數數

第 第 0 0 位元 位元 (1)(1) - - 加入網域,加入網域,如果網域不存在,電腦會加入工作群如果網域不存在,電腦會加入工作群

組組第 第 1 1 位元 位元 (2)(2) - - 建立電腦帳戶建立電腦帳戶第 第 2 2 位元 位元 (4)(4) - - 刪除電腦帳戶刪除電腦帳戶第 第 4 4 位元 位元 (8)(8) - - Win9X Win9X 升級升級第 第 5 5 位元 位元 (16)(16) - - 即使已在網域中,還是要加入網域即使已在網域中,還是要加入網域第 第 6 6 位元 位元 (32)(32) - - 未設定安全的加入未設定安全的加入第 第 7 7 位元 位元 (64)(64) - - 傳入電腦密碼,傳入電腦密碼,

這個選項只能用在未設定安全的加入。這個選項只能用在未設定安全的加入。 第 第 8 8 位元 位元 (128)(128) - - 順延 順延 SPN SPN 組合,指定在電腦物件上寫組合,指定在電腦物件上寫入入

SPN SPN 和 和 DnsHostName DnsHostName 屬性的操作應屬性的操作應該順該順

延到加入後的重新命名。 延到加入後的重新命名。 第 第 18 18 位元 位元 - - 安裝啟動 安裝啟動 - - 在安裝時啟動 在安裝時啟動 APIAPI 。 。

Page 43: WMI 實務應用範例

4545/60/60

脫離網域脫離網域UserName = "MCG\Administrator"UserName = "MCG\Administrator"Password = "Pa$$word!"Password = "Pa$$word!"

Set objService = GetObject("winmgmts:{(shutdown)}")Set objService = GetObject("winmgmts:{(shutdown)}")

Set objCols = objService.InstancesOf("Win32_ComputerSystem")Set objCols = objService.InstancesOf("Win32_ComputerSystem")

For Each obj In objColsFor Each obj In objColsobj.UnjoinDomainOrWorkgroup Password, UserName, 4obj.UnjoinDomainOrWorkgroup Password, UserName, 4

NextNext

WScript.Echo "WScript.Echo " 電腦已經脫離網域,並加入與網域同名的工作群組。電腦已經脫離網域,並加入與網域同名的工作群組。 ""

Page 44: WMI 實務應用範例

4646/60/60

加入工作群組加入工作群組NewWorkGroupName = "WORKGROUP"NewWorkGroupName = "WORKGROUP"

Set objService = GetObject("winmgmts:{(shutdown)}")Set objService = GetObject("winmgmts:{(shutdown)}")

Set objCols = objService.InstancesOf("Win32_ComputerSystem")Set objCols = objService.InstancesOf("Win32_ComputerSystem")

For Each obj In objColsFor Each obj In objColsobj.JoinDomainOrWorkgroup NewWorkGroupName, _obj.JoinDomainOrWorkgroup NewWorkGroupName, _

"Pa$$word!", "MCG\Administrator""Pa$$word!", "MCG\Administrator"NextNext

WScript.Echo "WScript.Echo " 電腦已經加入工作群組電腦已經加入工作群組 : " & NewWorkGroupName: " & NewWorkGroupName

Page 45: WMI 實務應用範例

4747/60/60

強迫登出使用者強迫登出使用者Set objWMIService = GetObject("winmgmts:\\ServerC")Set objWMIService = GetObject("winmgmts:\\ServerC")

Set objCol = objWMIService.ExecQuery _Set objCol = objWMIService.ExecQuery _ ("Select * from Win32_OperatingSystem")("Select * from Win32_OperatingSystem")

For Each obj In objColFor Each obj In objColobj.Win32Shutdown 0obj.Win32Shutdown 0 ' 0 ' 0 表示登出表示登出

NextNext

Page 46: WMI 實務應用範例

4848/60/60

強迫鎖定電腦強迫鎖定電腦Set objShell = CreateObject("Wscript.Shell")Set objShell = CreateObject("Wscript.Shell")objShell.Run objShell.Run "%windir%\System32\rundll32.exe " & _"%windir%\System32\rundll32.exe " & _

"user32.dll, LockWorkStation""user32.dll, LockWorkStation"

Const OverwriteExisting = TRUEConst OverwriteExisting = TRUE

Set objShell = CreateObject("Wscript.Shell")Set objShell = CreateObject("Wscript.Shell")objShell.Run "cmd.exe /c copy c:\lock.vbs \\ServerC\C$\scripts\"objShell.Run "cmd.exe /c copy c:\lock.vbs \\ServerC\C$\scripts\"

Set objService = GetObject("winmgmts:\\ServerC")Set objService = GetObject("winmgmts:\\ServerC")Set obj = objService.Get("Win32_Process")Set obj = objService.Get("Win32_Process")

obj.Create "cscript c:\scripts\lock.vbs", null, null, intProcessIDobj.Create "cscript c:\scripts\lock.vbs", null, null, intProcessID

Page 47: WMI 實務應用範例

電腦、網域、工作群組電腦、網域、工作群組

Page 48: WMI 實務應用範例

5050/60/60

大綱大綱使用者與群組管理使用者與群組管理Active Directory ADO ProviderActive Directory ADO Provider

服務啟動的帳號與密碼服務啟動的帳號與密碼電腦、網域、工作群組電腦、網域、工作群組其它其它

Page 49: WMI 實務應用範例

5151/60/60

測試網路連線 測試網路連線 (Ping)(Ping)

strComputer = "192.168.99.1"strComputer = "192.168.99.1"

Set objWMIService = GetObject("winmgmts:")Set objWMIService = GetObject("winmgmts:")

Set colItems = objWMIService.ExecQuery( _Set colItems = objWMIService.ExecQuery( _"Select * from Win32_PingStatus " & _"Select * from Win32_PingStatus " & _

"Where Address='" & strComputer & "'")"Where Address='" & strComputer & "'")

For Each obj in colItemsFor Each obj in colItems If obj.StatusCode = 0 Then If obj.StatusCode = 0 Then WScript.Echo "WScript.Echo " 成功 成功 !" !" ElseElse WScript.Echo "WScript.Echo " 失敗 失敗 !"!" End IfEnd IfNextNext

Page 50: WMI 實務應用範例

5252/60/60

依照規則變更檔名依照規則變更檔名' ' 將 將 C:\Photos C:\Photos 資料夾中的 資料夾中的 SANY4958.JPG SANY4958.JPG 更名為 更名為 Boston_4958.JPGBoston_4958.JPG

Set objService = GetObject("winmgmts:")Set objService = GetObject("winmgmts:")

Set colFiles = objService.ExecQuery( _Set colFiles = objService.ExecQuery( _"ASSOCIATORS OF {Win32_Directory.Name='C:\Photos'} " & _"ASSOCIATORS OF {Win32_Directory.Name='C:\Photos'} " & _"WHERE ResultClass=CIM_DataFile")"WHERE ResultClass=CIM_DataFile")

For Each objFile In colFilesFor Each objFile In colFiles strEnd = Right(objFile.Name, 8)strEnd = Right(objFile.Name, 8) ' ' 取得最後 取得最後 8 8 個字個字 strNewName = objFile.Drive & objFile.Path & "Boston_" & strEndstrNewName = objFile.Drive & objFile.Path & "Boston_" & strEnd objFile.Rename strNewNameobjFile.Rename strNewNameNextNext

Page 51: WMI 實務應用範例

5353/60/60

列出電腦中最大的 列出電腦中最大的 10 10 個檔案個檔案' ' 以下指令碼需要安裝 以下指令碼需要安裝 LogParserLogParser' http://www.microsoft.com/technet/scriptcenter/tools/logparser/default.mspx' http://www.microsoft.com/technet/scriptcenter/tools/logparser/default.mspx

Set objLogParser = CreateObject("MSUtil.LogQuery")Set objLogParser = CreateObject("MSUtil.LogQuery")

Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")

objInputFormat.Recurse = -1objInputFormat.Recurse = -1 ' ' 遞迴呼叫遞迴呼叫

Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")objOutputFormat.rtp = -1objOutputFormat.rtp = -1 ' ' 不要每列出一筆資料就暫停不要每列出一筆資料就暫停

strQuery = "SELECT TOP 10 Path, Size FROM 'C:\*.*, D:\*.*' " & _strQuery = "SELECT TOP 10 Path, Size FROM 'C:\*.*, D:\*.*' " & _"ORDER BY Size DESC""ORDER BY Size DESC"

objLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormatobjLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormat

Page 52: WMI 實務應用範例

其它其它

Page 53: WMI 實務應用範例

5555/60/60

總結總結Windows ScriptingWindows Scripting總是會遇到問題總是會遇到問題總是找不到資料總是找不到資料總是找不到人問總是找不到人問

Windows Scripting Windows Scripting 真是學海無涯啊 真是學海無涯啊 ~~~~~~

要領要領習慣上網搜尋習慣上網搜尋練一下各類型關鍵字的條件組合搜尋練一下各類型關鍵字的條件組合搜尋

多寫 多寫 scriptsscripts

Page 54: WMI 實務應用範例

5656/60/60

參考資訊 參考資訊 #1#1聖哥的資訊站聖哥的資訊站

http://teacher.allok.com.twhttp://teacher.allok.com.twTechNet Script CenterTechNet Script Center

http://www.microsoft.com/technethttp://www.microsoft.com/technet/scriptcenter//scriptcenter/

default.mspxdefault.mspx

CDO CDO 範例範例http://www.microsoft.com/technet/prodtechnolhttp://www.microsoft.com/technet/prodtechnol

/exchange/2000/maintain//exchange/2000/maintain/ex2kwsh.mspxex2kwsh.mspx

Windows Server 2003 Windows Server 2003 命令列工具命令列工具hh.exe %SystemRoot%\System32\NTCmds.chmhh.exe %SystemRoot%\System32\NTCmds.chm

Page 55: WMI 實務應用範例

5757/60/60

參考資訊 參考資訊 #2#2WMI ProvidersWMI Providers

http://msdn.microsoft.com/library/default.asp?http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmiurl=/library/en-us/wmisdk/wmi//operating_system_availability_of_wmi_componentsoperating_system_availability_of_wmi_components.asp.asp

Scriptomatic ToolScriptomatic Toolhttp://www.microsoft.com/technet/community/http://www.microsoft.com/technet/community/scriptcenter/tools/wmimatic.mspxscriptcenter/tools/wmimatic.mspx

本場次投影片與範例程式碼本場次投影片與範例程式碼http://teacher.allok.com.twhttp://teacher.allok.com.tw

Page 56: WMI 實務應用範例

5858/60/60

作業作業撰寫一個指令碼撰寫一個指令碼

功能功能檢查指定資料夾下的所有 檢查指定資料夾下的所有 JPEG JPEG 圖片檔圖片檔如果圖片的解析度大於指定 如果圖片的解析度大於指定 800 x 600800 x 600

印出它的檔案名稱,並且將它搬移到另一個資料夾印出它的檔案名稱,並且將它搬移到另一個資料夾提示提示

使用 使用 WIA.ImageFile WIA.ImageFile 物件檢查圖片解析度物件檢查圖片解析度Windows Image Acquisition Automation Library 2.0Windows Image Acquisition Automation Library 2.0

Shell.ApplicationShell.Application

MoveHere MoveHere 方法方法

Page 57: WMI 實務應用範例

5959/60/60

認證考試 認證考試 85 85 折網站折網站http://www.pearsonvue.com/mshttp://www.pearsonvue.com/mshttp://www.prometric.com/microsoft http://www.prometric.com/microsoft 85 85 折認證考證卷代碼 折認證考證卷代碼 ITPTAWITPTAW 有效期限:有效期限: 2006/9/302006/9/30

Page 58: WMI 實務應用範例