共用方式為


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

服務的控制碼。 這個控制碼是由 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

服務控制管理員可能會設定下列錯誤碼。 其他錯誤碼可由服務控制管理員所呼叫的登錄函式設定。

傳回碼 描述
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