ChangeServiceConfigW 函式 (winsvc.h)
變更服務的組態參數。
若要變更選擇性組態參數,請使用 ChangeServiceConfig2 函式。
語法
BOOL ChangeServiceConfigW(
[in] SC_HANDLE hService,
[in] DWORD dwServiceType,
[in] DWORD dwStartType,
[in] DWORD dwErrorControl,
[in, optional] LPCWSTR lpBinaryPathName,
[in, optional] LPCWSTR lpLoadOrderGroup,
[out, optional] LPDWORD lpdwTagId,
[in, optional] LPCWSTR lpDependencies,
[in, optional] LPCWSTR lpServiceStartName,
[in, optional] LPCWSTR lpPassword,
[in, optional] LPCWSTR lpDisplayName
);
參數
[in] hService
服務的控制碼。 這個控制碼是由 OpenService 或 CreateService 函式傳回,而且必須具有 SERVICE_CHANGE_CONFIG 存取權限。 如需詳細資訊,請參閱 服務安全性和存取權限。
[in] dwServiceType
服務的型別。 如果您未變更現有的服務類型,請指定 SERVICE_NO_CHANGE ;否則,請指定下列其中一種服務類型。
值 | 意義 |
---|---|
|
檔案系統驅動程式服務。 |
|
驅動程式服務。 |
|
在自己的進程中執行的服務。 |
|
與其他服務共用進程的服務。 |
如果您指定 SERVICE_WIN32_OWN_PROCESS 或 SERVICE_WIN32_SHARE_PROCESS,且服務正在 LocalSystem 帳戶的內容中執行,您也可以指定下列類型。
值 | 意義 |
---|---|
|
服務可以與桌面互動。
如需詳細資訊,請參閱 互動式服務。 |
[in] dwStartType
服務啟動選項。 如果您未變更現有的開始類型,請指定 SERVICE_NO_CHANGE ;否則,請指定下列其中一個值。
值 | 意義 |
---|---|
|
服務控制管理員在系統啟動期間自動啟動。 |
|
系統載入器啟動的裝置驅動程式。 這個值只適用於驅動程式服務。 |
|
當進程呼叫 StartService 函式時,由服務控制管理員啟動的服務。 |
|
無法啟動的服務。 嘗試啟動服務會導致錯誤碼 ERROR_SERVICE_DISABLED。 |
|
IoInitSystem函式啟動的裝置驅動程式。 這個值只適用於驅動程式服務。 |
[in] dwErrorControl
如果此服務無法啟動,則為錯誤的嚴重性和所採取的動作。 如果您未變更現有的錯誤控制,請指定 SERVICE_NO_CHANGE ;否則,請指定下列其中一個值。
[in, optional] lpBinaryPathName
服務二進位檔的完整路徑。 如果您未變更現有的路徑,請指定 Null。 如果路徑包含空格,則必須加上引號,才能正確解譯。 例如,「d:\my share\myservice.exe」 應指定為 「」d:\my share\myservice.exe」。
路徑也可以包含自動啟動服務的引數。 例如,「d:\myshare\myservice.exe arg1 arg2」。 這些引數會傳遞至服務進入點, (通常是 主要 函式) 。
如果您在另一部電腦上指定路徑,則必須讓本機電腦的電腦帳戶存取共用,因為這是遠端呼叫中使用的安全性內容。 不過,這項需求可讓遠端電腦中的任何潛在弱點影響本機電腦。 因此,最好使用本機檔案。
[in, optional] lpLoadOrderGroup
此服務所屬的負載排序群組名稱。 如果您未變更現有的群組,請指定 Null。 如果服務不屬於群組,請指定空字串。
啟動程式會使用負載排序群組,根據其他群組的指定順序載入服務群組。 載入排序群組的清單包含在下列登錄機碼的 ServiceGroupOrder 值中:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
[out, optional] lpdwTagId
變數的指標,接收 lpLoadOrderGroup 參數所指定群組中唯一的標記值。 如果您未變更現有的標籤,請指定 Null。
您可以在下列登錄機碼的 GroupOrderList 值中指定標籤順序向量,以在載入排序群組內使用標記來排序服務啟動:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
標記只會針對具有 SERVICE_BOOT_START 或 SERVICE_SYSTEM_START 啟動類型的驅動程式服務進行評估。
[in, optional] lpDependencies
以 Null 分隔之服務名稱的雙 Null 終止陣列指標,或載入系統必須先啟動的排序群組,才能啟動此服務。 (群組的相依性表示,如果您未變更現有的相依性,則此服務可以在嘗試啟動 group 的所有成員之後執行。) 指定 Null。 如果服務沒有相依性,請指定空字串。
您必須在組名前面加上SC_GROUP_IDENTIFIER,以便與服務名稱區別,因為服務和服務群組會共用相同的名稱空間。
[in, optional] lpServiceStartName
服務應該在其中執行的帳戶名稱。 如果您未變更現有的帳戶名稱,請指定 Null 。 如果服務類型SERVICE_WIN32_OWN_PROCESS,請使用DomainName\UserName格式的帳戶名稱。 服務進程將會以此使用者身分登入。 如果帳戶屬於內建網域,您可以指定 .\UserName (請注意,對應的 C/C++ 字串是 「.\\UserName」) 。 如需詳細資訊,請參閱一節中的 服務使用者帳戶 和警告。
共用進程可以以任何使用者身分執行。
如果服務類型 是SERVICE_KERNEL_DRIVER 或 SERVICE_FILE_SYSTEM_DRIVER,則名稱是系統用來載入設備磁碟機的驅動程式物件名稱。 如果驅動程式要使用 I/O 系統所建立的預設物件名稱,請指定 Null 。
服務可以設定為使用受控帳戶或虛擬帳戶。 如果服務設定為使用受控服務帳戶,則名稱為受控服務帳戶名稱。 如果服務設定為使用虛擬帳戶,請將名稱指定為 NT SERVICE\ServiceName。 如需受控服務帳戶和虛擬帳戶的詳細資訊,請參閱 服務帳戶逐步指南。
Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 在 Windows 7 和 Windows Server 2008 R2 之前,不支援受管理的服務帳戶和虛擬帳戶。
[in, optional] lpPassword
lpServiceStartName參數所指定之帳戶名稱的密碼。 如果您未變更現有的密碼,請指定 Null 。 如果帳戶沒有密碼,或服務是在 LocalService、NetworkService 或 LocalSystem 帳戶中執行,請指定空字串。 如需詳細資訊,請參閱 服務記錄清單。
如果 lpServiceStartName 參數指定的帳號名稱是受控服務帳戶或虛擬帳戶名稱的名稱, lpPassword 參數必須是 Null。
驅動程式服務會忽略密碼。
[in, optional] lpDisplayName
應用程式用來識別其使用者的服務顯示名稱。 如果您未變更現有的顯示名稱,請指定 Null ;否則,此字串的最大長度為 256 個字元。 名稱會在服務控制管理員中保留大小寫。 顯示名稱比較一律不區分大小寫。
此參數可以使用下列格式來指定當地語系化字串:
@[path]dllname,-strID
識別碼 strID 的字串會從 dllname載入;路徑是選擇性 的 。 如需詳細資訊,請參閱 RegLoadMUIString。
Windows Server 2003 和 Windows XP: 在 Windows Vista 之前,不支援當地語系化字串。
傳回值
如果函式成功,則傳回非零的值。
如果此函式失敗,則傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
服務控制管理員可能會設定下列錯誤碼。 其他錯誤碼可由服務控制管理員所呼叫的登錄函式設定。
傳回碼 | 描述 |
---|---|
|
控制碼沒有 SERVICE_CHANGE_CONFIG 存取權限。 |
|
已指定迴圈服務相依性。 |
|
顯示名稱已存在於服務控制器管理員資料庫中,可以是服務名稱或另一個顯示名稱。 |
|
指定的控制碼無效。 |
|
指定的參數無效。 |
|
帳戶名稱不存在,或指定服務來共用與已安裝服務相同的二進位檔案,但帳戶名稱與已安裝的服務不同。 |
|
服務已標示為要刪除。 |
備註
ChangeServiceConfig函式會變更服務控制管理員資料庫中指定服務的組態資訊。 您可以使用 QueryServiceConfig 函式來取得目前的組態資訊。
如果正在執行之服務的組態變更,但 lpDisplayName除外,在停止服務之前,變更不會生效。 若要更新認證而不需重新開機服務,請使用 LsaCallAuthenticationPackage 函式。
安全性備註
設定 lpServiceStartName 參數會變更服務的登入帳戶。 這可能會造成問題。 如果您已在 SPN) (註冊服務主體名稱,則現在會在錯誤的帳戶上註冊。 同樣地,如果您使用 ACE 來授與服務的存取權,則現在會將存取權授與錯誤的帳戶。範例
如需範例,請參閱 變更服務的設定。
規格需求
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | winsvc.h (包含 Windows.h) |
程式庫 | Advapi32.lib |
Dll | Advapi32.dll |