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

服務的句柄。 這個句柄是由 OpenServiceCreateService 函式傳回,而且必須具有 SERVICE_CHANGE_CONFIG 訪問許可權。 如需詳細資訊,請參閱 服務安全性和訪問許可權

[in] dwServiceType

服務的型別。 如果您未變更現有的服務類型,請指定 SERVICE_NO_CHANGE ;否則,請指定下列其中一種服務類型。

意義
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
檔系統驅動程式服務。
SERVICE_KERNEL_DRIVER
0x00000001
驅動程式服務。
SERVICE_WIN32_OWN_PROCESS
0x00000010
在自己的進程中執行的服務。
SERVICE_WIN32_SHARE_PROCESS
0x00000020
與其他服務共用進程的服務。
 

如果您指定 SERVICE_WIN32_OWN_PROCESSSERVICE_WIN32_SHARE_PROCESS,且服務正在 LocalSystem 帳戶的內容中執行,您也可以指定下列類型。

意義
SERVICE_INTERACTIVE_PROCESS
0x00000100
服務可以與桌面互動。

如需詳細資訊,請參閱 互動式服務

[in] dwStartType

服務啟動選項。 如果您未變更現有的開始類型,請指定 SERVICE_NO_CHANGE ;否則,請指定下列其中一個值。

意義
SERVICE_AUTO_START
0x00000002
服務控制管理員在系統啟動期間自動啟動。
SERVICE_BOOT_START
0x00000000
系統載入器啟動的裝置驅動程式。 這個值只適用於驅動程式服務。
SERVICE_DEMAND_START
0x00000003
當行程呼叫 StartService 函式時,由服務控制管理員啟動的服務。
SERVICE_DISABLED
0x00000004
無法啟動的服務。 嘗試啟動服務會導致錯誤碼 ERROR_SERVICE_DISABLED
SERVICE_SYSTEM_START
0x00000001
IoInitSystem 函式啟動的裝置驅動程式。 這個值只適用於驅動程式服務。

[in] dwErrorControl

如果此服務無法啟動,則為錯誤的嚴重性和所採取的動作。 如果您未變更現有的錯誤控制,請指定 SERVICE_NO_CHANGE ;否則,請指定下列其中一個值。

意義
SERVICE_ERROR_CRITICAL
0x00000003
如果可能,啟動程式會在事件記錄檔中記錄錯誤。 如果啟動最後一個已知良好的組態,啟動作業就會失敗。 否則,系統會以最後一個已知的良好組態重新啟動。
SERVICE_ERROR_IGNORE
0x00000000
啟動程式會忽略錯誤並繼續啟動作業。
SERVICE_ERROR_NORMAL
0x00000001
啟動程式會在事件記錄檔中記錄錯誤,但會繼續啟動作業。
SERVICE_ERROR_SEVERE
0x00000002
啟動程式會在事件記錄檔中記錄錯誤。 如果啟動最後一個已知良好的組態,啟動作業會繼續。 否則,系統會使用最後一個已知良好的組態重新啟動。

[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_STARTSERVICE_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_DRIVERSERVICE_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
ERROR_ACCESS_DENIED
句柄沒有 SERVICE_CHANGE_CONFIG 訪問許可權。
ERROR_CIRCULAR_DEPENDENCY
已指定迴圈服務相依性。
ERROR_DUPLICATE_SERVICE_NAME
顯示名稱已存在於服務控制器管理員資料庫中,可以是服務名稱或另一個顯示名稱。
ERROR_INVALID_HANDLE
指定的句柄無效。
ERROR_INVALID_PARAMETER
指定的參數無效。
ERROR_INVALID_SERVICE_ACCOUNT
帳戶名稱不存在,或指定服務來共用與已安裝服務相同的二進位檔,但帳戶名稱與已安裝的服務不同。
ERROR_SERVICE_MARKED_FOR_DELETE
服務已標示為要刪除。

備註

ChangeServiceConfig 函式會變更服務控制管理員資料庫中指定服務的組態資訊。 您可以使用 QueryServiceConfig 函式來取得目前的組態資訊。

如果正在執行的服務已變更組態,但 lpDisplayName 除外,變更在停止服務之前不會生效。 若要更新認證而不需重新啟動服務,請使用 LsaCallAuthenticationPackage 函式。

安全性備註

設定 lpServiceStartName 參數會變更服務的登入帳戶。 這可能會導致問題。 如果您已註冊服務主體名稱 (SPN) ,則現在會在錯誤的帳戶上註冊。 同樣地,如果您使用 ACE 來授與服務的存取權,現在會將存取權授與錯誤的帳戶。

範例

如需範例,請參閱 變更服務的組態

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平台 Windows
標頭 winsvc.h (包括 Windows.h)
程式庫 Advapi32.lib
Dll Advapi32.dll

另請參閱

ChangeServiceConfig2

CreateService

OpenService

QueryServiceConfig

QueryServiceConfig2

QueryServiceDynamicInformation

服務帳戶的逐步指南

服務組態

服務函式

StartService