OpenService

OpenServiceで、既存のサービスをオープンし、ハンドルを取得する。

OpenServiceA function (winsvc.h) - Win32 apps | Microsoft Docs
Win32 Windowsサービスを開始する StartService - s-kita’s blog

今回は、赤外線通信を管理するサービス"Irmon"、

赤外線通信を管理する"Irmon"
赤外線通信を管理する"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に変更
app.manifestをrequireAdministratorに変更

app.manifestをrequireAdministratorに変更。

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

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

あれ?何も出ない。
あれ?何も出ない。

あれ?何も出ない。
ただ、一瞬何か見えたので、別コンソールになってるかもしれない。

hServiceを出力の後、Sleepで5秒待つ。

UACが出る
UACが出る

UACが出る。

やっぱり別コンソールで出力されてた
やっぱり別コンソールで出力されてた

やっぱり別コンソールで出力されてた。

Sample/winapi/OpenService/OpenService/src/OpenService at master · bg1bgst333/Sample · GitHub