2011-06-15 2 views
9

로그인 한 사용자를 찾기 위해 모든 도메인 컴퓨터에서 WMI 쿼리를 실행하는 .NET 응용 프로그램이 있습니다. 각 컴퓨터를 핑 (ping)하여 온라인인지 여부를 찾은 다음 실제 쿼리를 실행합니다.WMI 쿼리에서 시간 초과를 설정하는 방법은 무엇입니까?

코드 스 니펫 :

try 
{ 
    string loggedonuser = null; 

    string computername = "ComputerToQuery"; 

    ConnectionOptions co = new ConnectionOptions(); 

    co.Username = "DOMAIN\MyUser"; 
    co.Password = "MyPassword"; 

    co.Impersonation = ImpersonationLevel.Impersonate; 
    co.Authentication = AuthenticationLevel.Default; 

    ManagementPath mp = new ManagementPath(@"\\" + computername + @"\root\cimv2"); 

    ManagementScope ms = new ManagementScope(mp,co); 

    ms.Connect(); 

    ObjectQuery oq = new ObjectQuery("SELECT username FROM Win32_ComputerSystem"); 

    ManagementObjectSearcher mos = new ManagementObjectSearcher(ms,oq); 

    foreach(ManagementObject mo in mos.Get()) 
     loggedonuser = (String) mo["username"]; 
} 
catch(Exception e) 
{ 
    // Handle WMI exception 
} 

문제는 : 때때로 WMI 쿼리를 무기한에 달려 있습니다.

어떻게 타임 아웃을 설정할 수 있습니까?

답변

12

을 시도해보십시오 사용 가능한 옵션 중 하나가 Timeout입니다 입력 TimeSpan의 :

가져 작업에 적용 할 시간 제한을 설정합니다. 콜렉션을 리턴 작업 이 타임 아웃이 생성 컬렉션 통해 열거에 적용된다는 점에 유의하지 동작 자체 합니다 (ReturnImmediately 속성 후자 사용 이다). 이 속성은 작업이 작업을 반자동으로 수행해야 함을 나타 내기 위해 사용됩니다.

+0

훌륭합니다. – Massimo

6

는 ManagementObjectSearcher는 Options 속성이 co.Timeout = new TimeSpan(0, 0, 30);

+0

이것은 실제 쿼리가 아닌 연결 전용입니다. 어쨌든 유용합니다. 연결에 너무 많은 시간이 걸리는 경우 (방화벽 등). 하지만 제 경우에는 걸려있는 * 쿼리 *입니다. – Massimo

관련 문제