2016-12-21 1 views
2

실행중인 서비스 응용 프로그램 인 실행 파일의 경로가 있습니다. 예를 들어실행 파일 경로에서 서비스 이름 가져 오기

: C:\Program Files (x86)\Someapp\somesvc.exe

내가 그것을 중지하고 시작하려는, 그리고 그것을 위해 내가 그것을 [this] 대답에 설명 된대로 서비스의 이름을 얻을 필요가 가정합니다.

모든 서비스의 모든 레지스트리 항목을 반복하여 HKLM\System\CurrentControlSet\Services에 넣고 ImagePath 레지스트리 키가 내 실행 경로와 일치하는지 확인하면됩니다.

이 솔루션은 효과가 있지만 그렇지 않은 것 같습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+1

왜 서비스 제어 관리자 API를 사용하지 않습니까? –

+0

@DavidHeffernan 나는 내 질문에 링크를 했으므로 사용 하겠지만 서비스의 경로가 아닌 입력으로 서비스 이름을 기대하며 이는 주요 문제입니다. – Sevron

+3

서비스 제어 관리자는 모든 서비스와 모든 세부 정보를 알고 있습니다. 이 정보를 사용하여 필요한 정보를 추출하십시오. 제가 제안하는 것은 레지스트리를 해킹하는 대신 공식 API를 사용하는 것입니다. 물론 동일한 이름으로 등록 된 여러 서비스가있을 수 있습니다. –

답변

6

설치된 서비스를 나열하려면 EnumServicesStatus() 또는 EnumServicesStatusEx()을 사용하십시오. 그러면 각 서비스의 이름을 알 수 있지만 ImagePath은 표시되지 않습니다. 검색하려면 OpenService(SERVICE_QUERY_CONFIG)을 사용하여 각 서비스를 열고 QueryServiceConfig()을 사용하여 ImagePath을 가져올 수 있습니다.

+0

이것이 올바른 해결책이었습니다. 감사합니다. 나는 많은 파기가 필요했지만,이 함수에 관한 온라인 자습서의 대부분은 새로운 델파이 버전에서는 제대로 작동하지 않습니다. – Sevron

0

PathName이 경로와 비슷한 서비스에 대해 WMI에 쿼리 할 수 ​​있습니다.

참고 : 일부 경로에는 params가 포함됩니다. 평등을 사용할 수 없습니다 (좋아요 사용).

당신은 WMI를 조회하기 위해 다음과 같은 몇 가지 코드를 사용할 수 있습니다

//----------------------------------------------------------------------------------------------------- 
//  This code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.9.9.350 
//  http://code.google.com/p/wmi-delphi-code-creator/ 
//  Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/ 
//  Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2015 
//----------------------------------------------------------------------------------------------------- 
// 
//  LIABILITY DISCLAIMER 
//  THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. 
//  YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS, 
//  DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE. 
// 
//---------------------------------------------------------------------------------------------------- 
program GetWMI_Info; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    ActiveX, 
    ComObj, 
    Variants; 



// La clase Win32_Service representa un servicio en un sistema Win32. Un 
// aplicación de servicio cumple las reglas de la interfaz del Administrador de 
// control de servicios (SCM, Service Control Manager) y un usuario la puede 
// iniciar automáticamente al arrancar el sistema a través del programa Servicios 
// del Panel de control o mediante una aplicación que utilice las funciones de 
// servicio de la API de Win32. Los servicios se pueden ejecutar aunque ningún 
// usuario haya iniciado sesión en el sistema. 

procedure GetWin32_ServiceInfo(sPath:String); 
const 
    WbemUser   =''; 
    WbemPassword  =''; 
    WbemComputer  ='localhost'; 
    wbemFlagForwardOnly = $00000020; 
var 
    FSWbemLocator : OLEVariant; 
    FWMIService : OLEVariant; 
    FWbemObjectSet: OLEVariant; 
    FWbemObject : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue  : LongWord; 
begin; 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); 
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Service WHERE PathName like "%' + sPath + '%"','WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, FWbemObject, iValue) = 0 do 
    begin 
    Writeln(Format('Caption  %s',[String(FWbemObject.Caption)]));// String 
    Writeln(Format('DisplayName %s',[String(FWbemObject.DisplayName)]));// String 
    Writeln(Format('Name   %s',[String(FWbemObject.Name)]));// String 
    Writeln(Format('PathName  %s',[String(FWbemObject.PathName)]));// String 

    Writeln(''); 
    FWbemObject:=Unassigned; 
    end; 
end; 


begin 
try 
    CoInitialize(nil); 
    try 
     GetWin32_ServiceInfo(ExtractFileName('c:\windows\system\locator.exe')); 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln;  
end. 

더 많은 속성을해야하는 경우, precedure에 추가. 와 쿼리

: 'c:\windows\system\locator.exe', 당신은 얻을 :와 쿼리

enter image description here

: 'C:\Program Files (x86)\Skype\Updater\Updater.exe', 당신이 얻을 :

enter image description here

정지 서비스 시작을 , property Name이 필요합니다.

+0

WMI가 "악의적 인"IMO이기 때문에 나는 이것을 줄였습니다. 느리고 많은 오버 헤드가 있습니다. SCM API는 서비스를 반복하고 경로를 비교하는 데 사용할 수 있습니다 ... https://msdn.microsoft.com/en-us/library/windows/desktop/ms685150(v=vs.85).aspx – Remko

+2

@Remko. 개인 견해입니다. 문제의 경우 여러 가지 유효한 해결책이있을 수 있습니다. 당신을 위해 무엇이 나쁜지, 다른 사람이 좋을 수 있기 때문에. 솔루션이 귀하가 제안한 솔루션이나 원하는 솔루션이 아니기 때문에 나는 부정 투표를 이해하지 못합니다. –

+0

정말 가난한 해결책입니다. WMI는 그 일에있어서 잘못된 도구입니다. 내 downvote 너무. –

관련 문제