2012-02-01 6 views
1

제 고객 중 하나는 C#으로 Windows 서비스를 작성하고 있습니다. 그것은 많은 것들을 검사하지만, 할 일은 프린터 포트 (IP 주소)가 이미 있는지 확인하는 것입니다. 그렇다면 특정 프린터를 IP 포트에 연결하십시오. 그렇지 않은 경우 포트를 만들고 연결하십시오.WMI를 사용하는 Windows 서비스

WMI를 사용하여 기존 프린터 포트를 확인하고 포트를 만듭니다. WMI를 사용하여 프린터를 프린터 포트에 연결합니다.

Windows 7에서 이것은 매력처럼 작동합니다. 그러나 내 (가상) XP 시스템에서는 서비스에 WMI 권한이 전혀없는 것 같습니다. 포트 검사가 실패하고 작성이 실패합니다. ManagementException에서 간단한 '액세스 거부'가 제공됩니다.

작은 테스트 프로그램 (C#의 콘솔 응용 프로그램)을 만들면 매력처럼 작동합니다.

다른 계정 (로컬 시스템, 관리자, 관리자 권한으로 개인 로그인)에서 서비스를 실행했지만 아무 것도 작동하지 않는 것 같고 Windows XP의 Windows 서비스에서 WMI를 사용할 수 없다는 느낌이 들었습니다.

혹시이 문제를 해결할 수있는 방법이 있습니까? 아니면 여기서 무엇이 잘못 되었습니까?

답변을 찾을 곳이 어디인지 알지 못하므로 여기에서 답을 찾아보십시오.

답변

0

Win32_Printer를 사용하고 있습니까? Win32_Printer 참조 페이지에, 그것은

는 Win32_Printer 클래스는 CIM_Printer에서 파생

비고 말한다. Win32_Printer 인스턴스에 대해 SWbemObject.Put_ 또는 IWbemServices :: PutInstance를 호출하기 전에 SeLoadDriverPrivilege 권한 (Visual Basic의 경우 wbemPrivilegeLoadDriver, 모니 커 스크립팅의 경우 LoadDriver)을 사용하도록 설정해야합니다. 자세한 내용은 권한 상수 및 권한있는 작업 실행을 참조하십시오. 다음 VBScript 코드 예제는 스크립트에서 SeLoadDriverPrivilege 권한을 활성화하는 방법을 보여줍니다.

편집 : 서비스와 관련하여 Windows Server 2003과 Server 2008의 차이점을 알고 있습니다. 이전 운영 체제에서는 (아마 XP가 포함되어 있음), 사용자 프로필은 기본적으로로드되지 않습니다. 이것은 DPAPI API를 사용하려고 할 때 문제가 있습니다. 아마도 이와 비슷한 상황이 발생할 수 있습니다. 추측에만.

편집 : WMI에 연결할 때 가장 (Impersonation)을 활성화해야합니다. Win32_TCPIPPrinterPort 페이지의 예가 있습니다. 당신이 시도 할 수있는 두 가지 당신이 시도하고 다른 방법이 몇 가지 가장 속임수에 전체 코드를 래핑하여이 될 수

ConnectionOptions options = new ConnectionOptions(); 
options.Username = userName; 
options.Password = password; 
options.EnablePrivileges = true; 

당신의 ConnectionOptions에 대한 몇 가지 자격 증명을 설정 할 수 있지만, 첫째,이

ConnectionOptions options = new ConnectionOptions(); 
options.Impersonation = System.Management.ImpersonationLevel.Impersonate; 

ManagementScope scope = new ManagementScope(@"\\root\\cimv2", options); 
scope.Connect(); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_TCPIPPrinterPort where HostAddress = '" + printerPort + "'"); 
+0

예, 저는 WIN32_Printer를 사용합니다. 그러나 동일한 XP 컴퓨터의 콘솔 응용 프로그램에서 작동합니다. – Aspage

+0

수정 : WMI에서 Win32_Printer 'folder/class'를 참조하는 WMI를 사용합니다. 나는 일을 끝내기 위해 Win32_Printer를 직접 사용하지 않습니다. – Aspage

+0

Win32_Printer는 WMI 클래스입니다. Win32_Printer를 사용하고 있지 않다면 어떤 WMI 클래스가 사용하고 있습니까? –

관련 문제