變更Win32_Service類別的方法, (Mbnapi.h)
ChangeWMI 類別方法會修改Win32_Service。
本主題使用 Managed 物件格式 (MOF) 語法。 如需使用此方法的詳細資訊,請參閱 呼叫 方法。
語法
uint32 Change(
[in] string DisplayName,
[in] string PathName,
[in] uint32 ServiceType,
[in] uint32 ErrorControl,
[in] string StartMode,
[in] boolean DesktopInteract,
[in] string StartName,
[in] string StartPassword,
[in] string LoadOrderGroup,
[in] string LoadOrderGroupDependencies[],
[in] string ServiceDependencies[]
);
參數
-
DisplayName [in]
-
服務的顯示名稱。 這個字串的最大長度為 256 個字元。 名稱會保留于服務控制管理員中。 DisplayName 比較一律不區分大小寫。
條件約束:接受與 Name 屬性相同的值。
範例 「Atdisk」。
-
PathName [in]
-
實作服務之可執行檔的完整路徑,例如「\SystemRoot\System32\drivers\afd.sys」。
-
ServiceType [in]
-
提供給呼叫這些服務之進程的服務類型。
-
1 (0x1)
-
核心驅動程式
-
2 (0x2)
-
檔案系統驅動程式
-
4 (0x4)
-
配接器
-
8 (0x8)
-
辨識器驅動程式
-
16 (0x10)
-
擁有進程
-
32 (0x20)
-
共用程式
-
256 (0x100)
-
互動式程式
ErrorControl [in]
如果此服務無法在啟動期間啟動,則錯誤嚴重性。 值表示如果發生失敗,啟動程式所採取的動作。 系統會記錄所有錯誤。
忽略 (0)
不通知使用者。
一般 (1)
一般。 通知使用者。
嚴重 (2)
系統會以最後一個良好的設定重新開機。
重大 (3)
系統嘗試以正確的組態重新啟動。
StartMode [in]
Windows 基底服務的啟動模式。 如需詳細資訊,請參閱<備註>一節。
Boot
作業系統載入器啟動的裝置驅動程式。 這個值只適用於驅動程式服務。
系統
作業系統初始化程式啟動的裝置驅動程式。 這個值只適用於驅動程式服務。
自動
服務控制管理員在系統啟動期間自動啟動的服務。
手動
當進程呼叫 StartService 方法時,服務控制管理員要啟動的服務。
已停用
無法再啟動的服務。
DesktopInteract [in]
如果 為 True,服務可以建立或與桌面上的視窗通訊。
StartName [in]
服務執行時所執行的帳戶名稱。 視服務類型而定,帳戶名稱的格式可能是 DomainName\Username 或 .\Username。 當服務進程執行時,將會使用這兩種形式之一來記錄。 如果帳戶屬於內建網域,則可以指定 .\Username。 如果指定 Null ,服務將會以 LocalSystem 帳戶登入。 針對核心或系統層級驅動程式, StartName 包含驅動程式物件名稱 (,也就是 \FileSystem\Rdr 或 \Driver\Xns) 輸入與輸出 (I/O) 系統用來載入設備磁碟機。 如果指定Null,則驅動程式會根據服務名稱,以 I/O 系統所建立的預設物件名稱執行,例如「DWDOM\管理員」。
您也可以使用 [使用者主體名稱] (UPN) 格式來指定 StartName,例如 ,Username@DomainName。
StartPassword [in]
StartName參數所指定帳戶名稱的密碼。 如果您未變更密碼,請指定 Null 。 如果此服務沒有密碼,請指定空字串。
注意
將服務從本機系統變更為網路,或從網路變更為本機系統時, StartPassword 必須是空字串 (「」) 而非 Null。
LoadOrderGroup [in]
與其相關聯的組名。 載入順序群組包含在系統登錄中,並判斷服務載入作業系統的順序。 如果指標為 Null,或指向空字串,服務就不屬於群組。 如需詳細資訊,請參閱<備註>一節。
群組之間的相依性應該列在 LoadOrderGroupDependencies 參數中。 載入排序群組清單中的服務會先啟動,後面接著群組中的服務,而不是載入排序群組清單中的服務,後面接著不屬於群組的服務。 系統登錄具有位於下列位置的載入排序群組清單:
\ HKEY_LOCAL_MACHINE系統\CurrentControlSet\控制\ServiceGroupOrder
LoadOrderGroupDependencies [in]
此服務啟動之前必須啟動的負載排序群組清單。 陣列會以 Null結尾加倍。 如果指標為 Null,或指向空字串,則服務沒有相依性。 組名前面必須加上 Winsvc.h 檔案中定義的 SC_GROUP_IDENTIFIER () 字元,才能區分它們與服務名稱,因為服務和服務群組共用相同的命名空間。 對群組的相依性表示,如果至少一個群組的成員在嘗試啟動群組的所有成員之後,就可以執行此服務。
ServiceDependencies [in]
包含此服務啟動之前必須啟動之服務名稱的清單。 陣列是以 Null結尾的兩倍。 如果指標為 Null,或指向空字串,則服務沒有相依性。 與服務的相依性表示,只有在它相依的服務正在執行時,才能執行此服務。
傳回值
傳回下列清單中所列的其中一個值,或任何其他值表示錯誤。 如需其他錯誤碼,請參閱 WMI 錯誤常數 或 WbemErrorEnum。 如需一般 HRESULT 值,請參閱 系統錯誤碼。
-
「成功」
-
0
要求已被接受。
-
不支援
-
1
不支援此要求。
-
拒絕存取
-
2
使用者沒有必要的存取權。
-
相依服務正在執行
-
3
無法停止此服務,因為與它相依的其他服務正在執行中。
-
不正確服務控制
-
4
要求的控制碼無效,或是服務不接受此控制碼。
-
服務無法接受控制
-
5
無法將所要求的控制程式代碼傳送至服務,因為服務的狀態 (Win32_BaseService。State 屬性) 等於 0、1 或 2。
-
服務未作用中
-
6
尚未啟動服務。
-
服務要求逾時
-
7
服務並未及時回應啟動要求。
-
未知的失敗
-
8
啟動服務時發生未知的失敗。
-
找不到路徑
-
9
找不到服務可執行檔的目錄路徑。
-
服務已在執行中
-
10
服務已在執行中。
-
服務資料庫已鎖定
-
11
要加入新服務的資料庫已被鎖定。
-
服務相依性已刪除
-
12
此服務所依賴的相依性已從系統中移除。
-
服務相依性失敗
-
13
服務在相依的服務中找不到所需的服務。
-
服務已停用
-
14
已經從系統中停用服務。
-
服務登入失敗
-
15
此服務未通過驗證,無法在系統上執行。
-
標示要刪除的服務
-
16
正在從系統移除此服務。
-
服務無線程
-
17
服務沒有執行執行緒。
-
狀態迴圈相依性
-
18
服務啟動時具有迴圈相依性。
-
狀態重複名稱
-
19
服務以相同名稱執行。
-
狀態無效名稱
-
20
服務名稱的字元無效。
-
狀態無效參數
-
21
不正確參數已傳遞至服務。
-
狀態不正確服務帳戶
-
22
此服務執行所在的帳戶無效,或缺少執行服務的許可權。
-
狀態服務存在
-
23
服務存在於系統可使用之服務的資料庫中。
-
服務已暫停
-
24
服務目前在系統中暫停。
-
其他
-
25 4294967295
備註
當電腦啟動時,所有自動啟動服務也會啟動。 有時候,其中一項服務可能無法與電腦一起啟動。 當服務在系統啟動期間失敗時,電腦會根據服務錯誤控制碼的值採取動作。
大部分的服務都是使用一般錯誤控制程式代碼來安裝。 使用忽略錯誤碼安裝的一些例外狀況包括:
- 檔案複寫服務
- 智慧卡
- Secondary Logon
- WMI
針對使用 [忽略錯誤碼] 安裝的服務,不會通知給服務失敗的使用者。 如果您想要讓服務無法啟動的螢幕通知,您可以使用 WMI 來變更錯誤控制碼。 錯誤控制碼僅適用于電腦啟動;如果您停止,然後在電腦執行之後嘗試重新開機服務,則不會使用錯誤控制碼。
有時候,您可能需要變更指定服務執行所在的帳戶。 例如,您可以在系統管理帳戶下執行服務。 由於這可能會造成安全性弱點,因此您可以將服務切換至許可權較少的帳戶。 或者,您可能在即將刪除的帳戶下執行服務,或者您可能想要確保所有伺服器上執行的特定服務在特定帳戶下執行。 您可以使用Win32_Service類別的Change方法,將服務設定為在指定的使用者帳戶下執行。 選取帳戶時,請記住下列事項:
作為服務帳戶使用的帳戶必須具有以服務身分登入的許可權。 您可以使用群組原則來授與此許可權。
作為服務帳戶使用的帳戶不應是本機、網域或企業系統管理員群組的成員。
服務的每個實例都應該在唯一的使用者帳戶下執行。 這會提供額外的安全性,並啟用個別服務實例的稽核。
如果服務是互動式的,則服務必須在 LocalSystem 帳戶下執行。
LocalSystem 是必要的,因為一次只能顯示一個視窗月臺 (WinSta0) 。 如果服務是在 LocalSystem 以外的帳戶下執行,它會在 Service-0x03e7$\Default 視窗月臺中執行,這是隱藏的視窗。 在此視窗月臺中執行的服務無法接收輸入或顯示輸出。
當您將帳戶指派給服務時,SCM 需要該帳戶的正確密碼,才能進行指派。 如果您提供不正確的密碼,SCM 會拒絕帳戶。 如果您使用 LocalSystem、LocalService 或 NetworkService 帳戶來設定服務帳戶,則不需要提供帳戶密碼,因為這些帳戶沒有密碼。
SCM 會將帳戶密碼儲存在服務資料庫中。 不過,指派密碼之後,SCM 不會確保儲存在服務資料庫中的密碼,以及指派給 Active Directory 中使用者帳戶的密碼會繼續相符。 因此,可能會發生類似下列的情況:
- 您可以設定服務在特定使用者帳戶下執行。
- 服務會使用目前的帳戶密碼,在該帳戶下啟動。
- 您可以變更使用者帳戶的密碼。
- 服務會繼續執行。 不過,如果服務停止,您就無法重新開機它,因為 SCM 會繼續使用舊的無效密碼。 變更 Active Directory 中的密碼並不會變更儲存在服務資料庫中的密碼。
如果您在一般使用者帳戶下執行服務,則必須在每次使用者帳戶密碼變更時更新這些服務密碼。 如果您不確定哪些服務在該帳戶下執行,或哪些電腦在該帳戶下執行的服務,這可能會特別耗時。 幸運的是,您可以使用 WMI 檢查您所有電腦上的服務帳戶,並視需要變更服務帳戶密碼。
Win32_LoadOrderGroup參數代表定義執行相依性的系統服務群組。 服務必須依照「載入順序群組」所指定的順序起始,因為服務彼此相依。 這些相依服務需要有前項服務才能正常運作。
若要將服務從網路服務變更為本機系統, StartName 和 StartPassword 參數應該具有下列值:
StartName = "LocalSystem"
StartPassword = "" // - empty string, not NULL
若要將服務從本機系統服務變更為網路, StartName 和 StartPassword 參數應該具有下列值:
StartName = "NT AUTHORITY\NetworkService"
StartPassword = "" // - empty string, not NULL
範例
下列 VBScript 會將服務的服務帳戶從指定的使用者帳戶下執行變更為 LocalSystem。
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\Root\CIMv2")
Set colServiceList = objWMIService.ExecQuery("SELECT * FROM Win32_Service WHERE StartName = '.\\NetSvc'")
For Each objService in colServices
errServiceChange = objService.Change( , , , , , , ".\LocalSystem" , "")
Next
下列 VBScript 會針對在 Netsvc 下執行的所有腳本變更服務帳戶密碼
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\Root\CIMv2")
Set colServiceList = objWMIService.ExecQuery("SELECT * FROM Win32_Service WHERE StartName = '.\\NetSvc'")
For Each objservice in colServiceList
errReturn = objService.Change( , , , , , , , "password")
Next
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 |
Windows Vista |
最低支援的伺服器 |
Windows Server 2008 |
命名空間 |
Root\CIMV2 |
標頭 |
|
MOF |
|
DLL |
|