lockServiceDatabase 函式 (winsvc.h)

[從 Windows Vista 起,此函式會針對應用程式兼容性提供,而且對資料庫沒有任何影響。]

要求服務控制管理員的擁有權, (SCM) 資料庫鎖定。 在任何指定時間,只有一個進程可以擁有鎖定。

語法

SC_LOCK LockServiceDatabase(
  [in] SC_HANDLE hSCManager
);

參數

[in] hSCManager

SCM 資料庫的句柄。 OpenSCManager 函式會傳回此句柄,而且必須具有SC_MANAGER_LOCK訪問許可權。 如需詳細資訊,請參閱 服務安全性和訪問許可權

傳回值

如果函式成功,傳回值會鎖定指定的 SCM 資料庫。

如果函式失敗,傳回值為NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

SCM 可以設定下列錯誤碼。 SCM 所呼叫的登錄函式可以設定其他錯誤碼。

傳回碼 Description
ERROR_ACCESS_DENIED
句柄沒有 SC_MANAGER_LOCK 訪問許可權。
ERROR_INVALID_HANDLE
指定的句柄無效。
ERROR_SERVICE_DATABASE_LOCKED
資料庫已鎖定。

備註

鎖定是安裝程式和組態程式用來串行化登錄中服務樹狀結構存取的通訊協定。 SCM 要求鎖定擁有權的唯一時間是啟動服務時。

取得 SCM 資料庫鎖定且無法釋放的程式,可防止 SCM 啟動其他服務。 由於此問題的嚴重性,因此不再允許進程鎖定資料庫。 為了與較舊的應用程式相容, LockServiceDatabase 函式會傳回鎖定,但沒有任何其他作用。

Windows Server 2003 和 Windows XP: 取得 SCM 資料庫鎖定可防止 SCM 啟動服務,直到釋放鎖定為止。 例如,必須先設定數個相關服務才能啟動的程式,可以在設定第一個服務之前呼叫 LockServiceDatabase 。 或者,它可以確保在設定完成之前,不會啟動任何服務。

呼叫 StartService 函式以啟動鎖定資料庫中的服務失敗。 其他 SCM 函式不會受到鎖定影響。

鎖定會保留,直到後續呼叫 UnlockServiceDatabase 函式時指定SC_LOCK句柄為止。 如果擁有鎖定的進程終止,SCM 會自動清除並釋放鎖定的擁有權。

無法釋放鎖定可能會導致系統問題。 取得鎖定的程式應該儘快釋放。

規格需求

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

另請參閱

ChangeServiceConfig

OpenSCManager

QueryServiceLockStatus

服務組態

服務函式

SetServiceObjectSecurity

StartService

UnlockServiceDatabase