LboxNTService

  コンストラクタ



  
// *********************************************************
// コンストラクタ
// *********************************************************
LboxNTService::LboxNTService()
{
	LboxNTService::lpMachineName = NULL;
}

// *********************************************************
// デストラクタ
// *********************************************************
LboxNTService::~LboxNTService()
{

}
  



  EnumService



  
// *********************************************************
// リストビューにサービス一覧を設定
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxNTService::EnumService( LboxListview *Lview )
{
	SC_HANDLE hSCManager;
	SC_HANDLE hService;

	Lview->Initialize();
	Lview->AddColumn( LVCFMT_LEFT, 100, "" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "ステータス" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "表示名" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "サービス名" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "プログラムパス" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "ログオン" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "グループ" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "スタートアップ" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "タイプ" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "エラーコントロール" );

	hSCManager = OpenSCManager(
			this->lpMachineName,
			NULL,
			SC_MANAGER_ALL_ACCESS
	);
	if ( hSCManager == NULL ) {
		return false;
	}

	BOOL bRet;
	DWORD nSize;
	DWORD nNeed;
	DWORD nServiceCount;
	DWORD nIdx;
	LPENUM_SERVICE_STATUS lss;
	DWORD i;
	int nCnt;

	LPTSTR szBuffer,szData;
	nSize = sizeof(ENUM_SERVICE_STATUS)+256*2+10;
	szBuffer = new char[nSize];
	szData = new char[1024];

	nCnt = 0;
	nIdx = 0;	// サービスの読み出し位置
	while( 1 ) {
		bRet = EnumServicesStatus(
			hSCManager,
			SERVICE_WIN32,
			SERVICE_STATE_ALL,
			(LPENUM_SERVICE_STATUS)szBuffer,
			nSize,
			&nNeed,
			&nServiceCount,		// 読み出したエントリ数
			&nIdx
		);
		if ( !bRet ) {
			if ( GetLastError() != ERROR_MORE_DATA ) {
				break;
			}
		}
		for( i = 0; i < nServiceCount; i++ ) {
			nCnt++;
			Lview->AddRow();
			Lview->SetColumnPrintf( 0, "%d", nCnt );

			lss = (LPENUM_SERVICE_STATUS)
				(szBuffer+sizeof(ENUM_SERVICE_STATUS)*i);

			switch( lss->ServiceStatus.dwCurrentState ) {
			case SERVICE_STOPPED:
				break;
			case SERVICE_START_PENDING:
				Lview->SetColumnText( 1, "START_PENDING" );
				break;
			case SERVICE_STOP_PENDING:
				Lview->SetColumnText( 1, "STOP_PENDING" );
				break;
			case SERVICE_RUNNING:
				Lview->SetColumnText( 1, "開始" );
				break;
			case SERVICE_CONTINUE_PENDING:
				Lview->SetColumnText( 1, "CONTINUE_PENDING" );
				break;
			case SERVICE_PAUSE_PENDING:
				Lview->SetColumnText( 1, "PAUSE_PENDING" );
				break;
			case SERVICE_PAUSED:
				Lview->SetColumnText( 1, "一時停止" );
				break;
			}

			Lview->SetColumnText( 2, lss->lpDisplayName );
			Lview->SetColumnText( 3, lss->lpServiceName );

			hService = OpenService(
				hSCManager,
				lss->lpServiceName,
				SERVICE_ALL_ACCESS
			);
			if ( hService == NULL ) {
				continue;
			}
			nNeed = 0;
			bRet = QueryServiceConfig(
				hService,
				(LPQUERY_SERVICE_CONFIG)szData,
				1,
				&nNeed
			);
			if ( nNeed == 0 ) {
				CloseServiceHandle( hService );
				continue;
			}
			LPTSTR szConfig;
			szConfig = new char[nNeed+128];
			bRet = QueryServiceConfig(
				hService,
				(LPQUERY_SERVICE_CONFIG)szConfig,
				nNeed,
				&nNeed
			);
			if ( !bRet ) {
				delete szConfig;
				CloseServiceHandle( hService );
				continue;
			}
			LPQUERY_SERVICE_CONFIG lsc;
			lsc = (LPQUERY_SERVICE_CONFIG)szConfig;

			Lview->SetColumnText( 4, lsc->lpBinaryPathName );
			Lview->SetColumnText( 5, lsc->lpServiceStartName );
			Lview->SetColumnText( 6, lsc->lpLoadOrderGroup );
			switch( lsc->dwStartType ) {
			case SERVICE_BOOT_START:
				Lview->SetColumnText( 7, "BOOT" );
				break;
			case SERVICE_SYSTEM_START:
				Lview->SetColumnText( 7, "SYSTEM" );
				break;
			case SERVICE_AUTO_START:
				Lview->SetColumnText( 7, "自動" );
				break;
			case SERVICE_DEMAND_START:
				Lview->SetColumnText( 7, "手動" );
				break;
			case SERVICE_DISABLED:
				Lview->SetColumnText( 7, "無効" );
				break;
			}

			switch( lsc->dwServiceType ) {
			case SERVICE_WIN32_OWN_PROCESS:
				Lview->SetColumnText( 8, "WIN32_OWN" );
				break;
			case SERVICE_WIN32_SHARE_PROCESS:
				Lview->SetColumnText( 8, "WIN32_SHARE" );
				break;
			case SERVICE_KERNEL_DRIVER:
				Lview->SetColumnText( 8, "KERNEL_DRIVER" );
				break;
			case SERVICE_FILE_SYSTEM_DRIVER:
				Lview->SetColumnText( 8, "FILE_SYSTEM_DRIVER" );
				break;
			case SERVICE_INTERACTIVE_PROCESS:
				Lview->SetColumnText( 8, "INTERACTIVE" );
				break;
			}

			switch( lsc->dwErrorControl ) {
			case SERVICE_ERROR_IGNORE:
				Lview->SetColumnText( 9, "IGNORE" );
				break;
			case SERVICE_ERROR_NORMAL:
				Lview->SetColumnText( 9, "NORMAL" );
				break;
			case SERVICE_ERROR_SEVERE:
				Lview->SetColumnText( 9, "SEVERE" );
				break;
			case SERVICE_ERROR_CRITICAL:
				Lview->SetColumnText( 9, "CRITICAL" );
				break;
			}

			delete szConfig;
			CloseServiceHandle( hService );
		}
		// 0 が返るという事は、読み出すエントリが無いという事
		if ( nIdx == 0 ) {
			break;
		}
	}

	delete [] szData;
	delete [] szBuffer;
	CloseServiceHandle( hSCManager );

	Lview->Fit();

	return true;
}
  



  Start

  
// *********************************************************
// サービス開始
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxNTService::Start( LboxString *LService )
{
	return LboxNTService::Start(
		LService->szLboxString
	);

}
BOOL LboxNTService::Start( LPTSTR lpService )
{
	SC_HANDLE hSCManager;
	SC_HANDLE hService;

	hSCManager = OpenSCManager(
			this->lpMachineName,
			NULL,
			SC_MANAGER_ALL_ACCESS
	);
	if ( hSCManager == NULL ) {
		return false;
	}

	hService = OpenService(
		hSCManager,
		lpService,
		SERVICE_START | SERVICE_QUERY_STATUS
	);

	CloseServiceHandle( hSCManager );

	if ( hService == NULL ) {
		return false;
	}

	SERVICE_STATUS sc_sts;
	BOOL bRet;

	bRet = QueryServiceStatus( hService, &sc_sts );
	if ( !bRet ) {
		CloseServiceHandle( hService );
		return false;
	}

	if ( sc_sts.dwCurrentState == SERVICE_RUNNING ) {
		CloseServiceHandle( hService );
		return false;
	}

	bRet = StartService( hService, 0, NULL );
	if ( !bRet ) {
		CloseServiceHandle( hService );
		return false;
	}

	CloseServiceHandle( hService );

	return true;
}
  



  Stop

  
// *********************************************************
// サービス停止
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxNTService::Stop( LboxString *LService )
{
	return LboxNTService::Stop(
		LService->szLboxString
	);

}
BOOL LboxNTService::Stop( LPTSTR lpService )
{
	SC_HANDLE hSCManager;
	SC_HANDLE hService;

	hSCManager = OpenSCManager(
			this->lpMachineName,
			NULL,
			SC_MANAGER_ALL_ACCESS
	);
	if ( hSCManager == NULL ) {
		return false;
	}

	hService = OpenService(
		hSCManager,
		lpService,
		SERVICE_STOP | SERVICE_QUERY_STATUS
	);

	CloseServiceHandle( hSCManager );

	if ( hService == NULL ) {
		return false;
	}

	SERVICE_STATUS sc_sts;
	BOOL bRet;

	bRet = QueryServiceStatus( hService, &sc_sts );
	if ( !bRet ) {
		CloseServiceHandle( hService );
		return false;
	}

	if ( sc_sts.dwCurrentState == SERVICE_STOPPED ) {
		CloseServiceHandle( hService );
		return false;
	}

	bRet = ControlService(
		hService,
		SERVICE_CONTROL_STOP,
		&sc_sts
	);
	if ( !bRet ) {
		CloseServiceHandle( hService );
		return false;
	}

	CloseServiceHandle( hService );

	return true;
}
  



  IsRunning

  
// *********************************************************
// 実行中かどうか
// 戻り値 : true 実行中, false 実行中では無い(またはエラー)
// *********************************************************
BOOL LboxNTService::IsRunning( LboxString *LService )
{
	return LboxNTService::IsRunning(
		LService->szLboxString
	);

}
BOOL LboxNTService::IsRunning( LPTSTR lpService )
{
	SC_HANDLE hSCManager;
	SC_HANDLE hService;

	hSCManager = OpenSCManager(
			this->lpMachineName,
			NULL,
			SC_MANAGER_ALL_ACCESS
	);
	if ( hSCManager == NULL ) {
		return false;
	}

	hService = OpenService(
		hSCManager,
		lpService,
		SERVICE_QUERY_STATUS
	);

	CloseServiceHandle( hSCManager );

	if ( hService == NULL ) {
		return false;
	}

	SERVICE_STATUS sc_sts;
	BOOL bRet;

	bRet = QueryServiceStatus( hService, &sc_sts );
	if ( !bRet ) {
		CloseServiceHandle( hService );
		return false;
	}

	bRet = false;
	if ( sc_sts.dwCurrentState == SERVICE_RUNNING ) {
		bRet = true;
	}

	CloseServiceHandle( hService );

	return bRet;
}
  



  IsStopped

  
// *********************************************************
// 停止中かどうか
// 戻り値 : true 停止中, false 停止中では無い(またはエラー)
// *********************************************************
BOOL LboxNTService::IsStopped( LboxString *LService )
{
	return LboxNTService::IsStopped(
		LService->szLboxString
	);

}
BOOL LboxNTService::IsStopped( LPTSTR lpService )
{
	SC_HANDLE hSCManager;
	SC_HANDLE hService;

	hSCManager = OpenSCManager(
			this->lpMachineName,
			NULL,
			SC_MANAGER_ALL_ACCESS
	);
	if ( hSCManager == NULL ) {
		return false;
	}

	hService = OpenService(
		hSCManager,
		lpService,
		SERVICE_QUERY_STATUS
	);

	CloseServiceHandle( hSCManager );

	if ( hService == NULL ) {
		return false;
	}

	SERVICE_STATUS sc_sts;
	BOOL bRet;

	bRet = QueryServiceStatus( hService, &sc_sts );
	if ( !bRet ) {
		CloseServiceHandle( hService );
		return false;
	}

	bRet = false;
	if ( sc_sts.dwCurrentState == SERVICE_STOPPED ) {
		bRet = true;
	}

	CloseServiceHandle( hService );

	return bRet;
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ