OpenServiceで、既存のサービスをオープンし、ハンドルを取得する。
OpenServiceA function (winsvc.h) - Win32 apps | Microsoft Docs
Win32 Windowsサービスを開始する StartService - s-kita’s blog
今回は、赤外線通信を管理するサービス"Irmon"、

こちらをオープンする。

一応、メニューからサービスを停止。

停止状態になっている。
コンソールアプリケーションの空プロジェクトで、
// ヘッダファイルのインクルード #include <windows.h> // 標準WindowsAPI #include <tchar.h> // TCHAR型 #include <stdio.h> // 標準入出力 // _tmain関数の定義 int _tmain(int argc, TCHAR *argv[]){ // main関数のTCHAR版. // 変数の宣言と初期化. SC_HANDLE hSCM = NULL; // SC_HANDLE型hSCMをNULLで初期化. SC_HANDLE hService = NULL; // SC_HANDLE型hServiceをNULLで初期化. LPCTSTR lpctszService = _T("Irmon"); // サービス名lpctszServiceを"Irmon"で初期化. // SCManagerのオープン hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); // OpenSCManagerでSCManagerを開き, ハンドルをhSCMに格納. if (hSCM != NULL){ // NULLでない時. // hSCMの出力. _tprintf(_T("hSCM = 0x%08x\n"), (unsigned long)hSCM); // hSCMの値を出力. // Serviceのオープン hService = OpenService(hSCM, lpctszService, SERVICE_START); // OpenServiceで"Irmon"を開く. if (hService != NULL){ // NULLでない時. // hServiceの出力. _tprintf(_T("hService = 0x%08x\n"), (unsigned long)hService); // hServiceの値を出力. CloseServiceHandle(hService); // CloseServiceHandleでhServiceを閉じる. } else{ // NULLの時. _tprintf(_T("OpenService failed!\n")); // "OpenService failed!"と出力. } // hSCMを閉じる. CloseServiceHandle(hSCM); // CloseServiceHandleでhSCMを閉じる. } else{ // NULLの時. _tprintf(_T("OpenSCManager failed!\n")); // "OpenSCManager failed!"と出力. } // プログラムの終了 return 0; // 0を返して正常終了. }
SERVICE_STARTで、開始権限を取得しようとしたが、
hSCM = 0x002d4c18 OpenService failed! 続行するには何かキーを押してください .
失敗した。
アプリケーション実行時に常にAdministratorとして実行する
VSからデバッガなし起動で管理者権限になっていないからダメなのかも。

app.manifestをrequireAdministratorに変更。

VSからデバッガなし起動でUACが反応するので管理者権限になれそう。

あれ?何も出ない。
ただ、一瞬何か見えたので、別コンソールになってるかもしれない。
hServiceを出力の後、Sleepで5秒待つ。

UACが出る。

やっぱり別コンソールで出力されてた。
Sample/winapi/OpenService/OpenService/src/OpenService at master · bg1bgst333/Sample · GitHub