2009-08-31 11 views
8

ServiceController 클래스를 사용하여 "제어"하는 서비스의 어셈블리 버전 정보에 액세스하고 싶습니다. (예 : "2.3.1.23"을 표시하고 싶습니다.) 그러나 어셈블리 버전 검색에 대한 정보를 찾을 수 없습니다 ... 전혀 가능합니까?프로그래밍 방식으로 실행중인 서비스의 어셈블리 버전 검색

EDIT : 분명히 ... 나는 로컬 컴퓨터에서 실행되는 서비스의 이름 만 알고 있습니다. 나는 그 서비스의 "FileVersionInfo"(더 나은 서비스 exe)에 액세스하고 싶지만, 나는 그 서비스 exe가 어디에 있는지 모른다.

답변

10

, 당신은 모든 서비스 EXE의 버전을하고 싶습니다. 당신은 이름과 서비스의 실행 파일의 경로를 알고 있다고 가정하면, 당신은 시도 할 수 있습니다 :

FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(<path and name of service exe>); 

그런 다음 버전 번호를 표시 할 FileVersionInfo 클래스의 속성을 사용할 수 있습니다. 파일을 읽을 수있는 권한이있는 한 UNC 경로에서도 작동합니다. 당신은 단지 서비스 이름을 알고있는 경우

EDIT 당신은 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services에서 레지스트리에 액세스 할 수 있습니다, 실행 파일의 경로와 이름을 얻으려면. 서비스 이름과 일치하는 키를 검색하십시오. 이 키 아래에는 실행 파일의 이름과 경로가 들어있는 값 이름 ImagePath이 있습니다.

+0

예, 올바르게 이해했으며 이것은 certanly 작동하지만 서비스 exe가 어디에 있는지 알지 못한다. ServiceController 클래스의 생성자에 전달 된 이름 만 알고있다. –

+0

내 답변을 편집하여 서비스 실행 파일을받는 방법을 알려줍니다. –

+0

+1 감사합니다. 저 역시 저를 도왔습니다! –

3

이 시도 : 내가 제대로 이해하면

System.Reflection.Assembly.GetAssembly(typeof(ServiceController)).GetName().Version 
+3

나는 OP가 ServiceController 클래스를 구현하는 .NET Assembly 버전을보고 싶지 않지만 일부 exe 파일의 버전 정보를보고 싶지 않다고 생각한다. –

0
Assembly runningAssembly = Assembly.GetEntryAssembly(); 
if (runningAssembly == null) 
{ 
    runningAssembly = Assembly.GetExecutingAssembly(); 
} 
runningAssembly.GetName().Version; 

서비스 내부에서이 코드를 사용하십시오.

+0

죄송합니다. 실행중인 서비스 내부의 코드에서 어셈블리 버전을 얻으려고한다고 생각했습니다. – softveda

관련 문제