ChangeServiceConfigA 函式 (winsvc.h)
變更服務的組態參數。
若要變更選擇性組態參數,請使用 ChangeServiceConfig2 函式。
語法
BOOL ChangeServiceConfigA(
[in] SC_HANDLE hService,
[in] DWORD dwServiceType,
[in] DWORD dwStartType,
[in] DWORD dwErrorControl,
[in, optional] LPCSTR lpBinaryPathName,
[in, optional] LPCSTR lpLoadOrderGroup,
[out, optional] LPDWORD lpdwTagId,
[in, optional] LPCSTR lpDependencies,
[in, optional] LPCSTR lpServiceStartName,
[in, optional] LPCSTR lpPassword,
[in, optional] LPCSTR 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。
服務控制管理員可能會設定下列錯誤碼。 服務控制管理員所呼叫的登錄函式可能會設定其他錯誤碼。
傳回碼 | Description |
---|---|
|
句柄沒有 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 |