2009-05-15 3 views
1

서비스 대화 상자에서 서비스에서 마우스 오른쪽 버튼을 클릭하고 속성 (예 : 플러그 앤 플레이)을 선택하면 "경로" 실행 가능 "합니다. 플러그이가 (Vista에서) 재생 :내 프로젝트에서 Windows 서비스가 아닌 위치 *

C : \ WINDOWS \ system32를 \ Svchost.exe에서 -k DCOMLAUNCH

나는 경우 .NET 코드를 사용하여 정보의이 같은 조각을 얻을 수있는 몇 가지 방법이 있나요 서비스 이름 (및/또는 표시 이름)을 알고 있습니까?

(나는 내 ​​프로젝트에서 서비스를 운영하지 않는 때문에이 GetExecutingAssembly()을 사용할 수 없습니다.)

답변

1

이 정보는 QUERY_SERVICE_CONFIG 구조입니다. 그것을 얻으려면 P/Invoke를 사용해야합니다.

기본 프로세스는 다음과 같습니다

통화 OpenSCManager 관리 서비스에 대한 핸들을 얻을 수 있습니다.

서비스에 대한 핸들을 얻으려면 OpenService를 호출하십시오.

QUERY_SERVICE_CONFIG 구조를 가져 오려면 QueryServiceConfig를 호출하십시오.

3

interop이없는 또 다른 옵션은 WMI 조회 (또는 레지스트리 - 비트 해킹)입니다.

여기 this code을 기반으로, 빠른 예제 :

private static string GetServiceImagePathWMI(string serviceDisplayName) 
{ 
    string query = string.Format("SELECT PathName FROM Win32_Service WHERE DisplayName = '{0}'", serviceDisplayName); 
    using (ManagementObjectSearcher search = new ManagementObjectSearcher(query)) 
    { 
     foreach(ManagementObject service in search.Get()) 
     { 
      return service["PathName"].ToString(); 
     } 
    } 
    return string.Empty; 
} 
1

항상 특히 PathName, here을 설명 된대로 WMI 클래스 Win32_Service있다.

이 작동 :

ManagementClass mc = new ManagementClass("Win32_Service"); 
foreach(ManagementObject mo in mc.GetInstances()) 
{ 
    if(mo.GetPropertyValue("Name").ToString() == "<Short name of your service>") 
    { 
     return mo.GetPropertyValue("PathName").ToString().Trim('"'); 
    } 
} 

는 다음 참조 프로젝트에 System.Management의 참조를 추가 관련된 문제가있는 경우

.

관련 문제