게시판 본문 Active Directory Service Interface - Read Only
re: wmi 관련~~~~ |
---|
작성자: 송원석
작성일시: 2005-01-12 11:40,
조회수: 3,543
|
말씀해주신 내용들을 바탕으로 관련된 문서들도 찾아보고 MSDN 에서도 여기저기 찾아봤습니다만, 특별히 관심을 끄는 그럴싸한 해결책은 없는 것 같습니다. 그래서 여러가지로 검토를 해 본 결과 다음과 같은 추정을 하게 되었습니다. 다만 현재 제가 프로젝트에 파견나와 있는 상태라 주변에 접근할 수 있는 DNS 서버가 존재하지 않아서 단지 추정에 의해서 말씀드리는 것이라는 점을 참고하시기 바랍니다. ^_^;;
먼저 코드 자체에는 특별한 문제점이 존재하지 않는다고 생각됩니다. 따라서 환경 설정과 관련된 문제점이 의심되는데요, 가장 먼저 생각해본 것이 권한 관련 문제입니다. 그러나 매번 바뀌기는 하지만 언제나 한 개 이상의 항목들이 리턴된다는 점에서 권한 문제는 아닌 것 같습니다. 그래서 다음과 같은 부분들에 대해서 관심을 가져 봤습니다. 1. Count 프로퍼티에 접근하면 오류가 발생한다. 2. 매번 리턴되는 결과의 갯수가 틀리다.라는 부분이죠. 이런 점들을 감안하여 본다면 다음과 같은 가정이 가능합니다. 1. Count 프로퍼티는 검색된 모든 개체들이 리턴되고 난 뒤에 설정된다. 2. 개체들이 모두 리턴되기 전에 Count 프로퍼티에 접근하면 오류가 발생한다. 3. 매번 리턴된 갯수가 틀린 것은 실제로 개체들이 그 시점에 모두 리턴되지 않았기 때문이다.라는 가정입니다. 그래서 이 가정들을 바탕으로 해당 개체에 대한 설명을 MSDN 에서 찾아 보았습니다. 즉 SWbemObjectSet 개체의 Count 프로퍼티에 대한 설명을 찾아본 것이죠. 해당 문서에 다음과 같이 흥미로운 얘기가 있더군요. The Count property can be expensive (require a lot of processor time) to retrieve because complete enumeration by the provider of the elements of the set is required to return the result. Note : If you attempt to get this property from an SWbemObjectSet object that returned from a method where the specified flags included wbemFlagForwardOnly, you will get an wbemErrFailed error.대충 정리해보면 이런 얘기입니다. Count 프로퍼티의 값을 얻는 것은 매우 비용이 많이 드는 작업인데, 왜냐하면 프로바이더가 요구받은 개체들을 모두 완벽하게 열거하고 난 다음에서야 결과를 리턴해주기 때문이다. 주의사항 : 만약 wbemFlagForwardOnly 옵션이 설정된 메소드로부터 리턴된 SWbemObjectSet 개체를 이용하면서 이 프로퍼티를 사용하려고 시도한다면 wbemErrFailed 오류가 발생하게 된다.이 말은 마치 ADO 의 레코드셋 개체를 얻을 때 전진 전용 커서를 사용하고 RecordCount 프로퍼티를 사용하려고 하면 오류가 발생한다는 얘기와도 비슷합니다. 따라서 다음과 같은 점들을 통하여 문제 해결을 시도해볼 수 있을 것 같습니다. 먼저 실제로 가능성은 적다고 생각되지만 wbemFlagForwardOnly 옵션이 설정된 부분이 존재한다면 당연히 제거해야 합니다. 그리고 가급적이면 ExecQuery() 메서드를 호출할 때 동기화와 관련된 wbemFlagReturnImmediately 옵션을 설정합니다. 이 옵션은 결과를 동기적으로 리턴하도록 해주는 옵션입니다. 그리고 다음은 이와 관련된 샘플 코드로 플랫폼 SDK 의 WMI 관련 섹션에서 발췌한 것입니다. ' Causes the call to return immediately. Const wbemFlagReturnImmediately = &H10 ' Causes a forward-only enumerator to be returned (faster). ' 이 옵션은 설정하지 않아야 한다. 첫 번째 옵션만 설정한다. Const wbemFlagForwardOnly = &H20 ' Make connections to WMI, to the IIS namespace on MyMachine. set locatorObj = CreateObject("WbemScripting.SWbemLocator") set providerObj = locatorObj.ConnectServer("MyMachine", "root/MicrosoftIISv2") ' Execute the query, putting the results into a SWbemObjectSet object. strQuery = "ASSOCIATORS OF {IIsWebVirtualDir='W3SVC/1/Root'}" set vdirsCol = providerObj.ExecQuery(strQuery, , (wbemFlagReturnImmediately OR _ wbemFlagForwardOnly)) ' Report the results. For Each vdirObj in vdirsCol ... 생략 ... Next위의 샘플 코드는 DNS 와 관련된 코드는 아닙니다만 살펴보시면 해당 옵션을 어떻게 사용하는지 쉽게 파악하실 수 있으실 것입니다. 다만 코드를 자세히 살펴보시면 wbemFlagReturnImmediately 옵션뿐만 아니라 전진 전용을 설정하는 wbemFlagForwardOnly 옵션까지도 설정하고 있다는 것을 알 수 있습니다. 그러나 바로 이 두 번째 옵션은 우리들이 피해야만 하는 옵션이죠. 그렇기 때문에 이 샘플 코드에서도 Count 프로퍼티를 사용하고 있지 않는 것으로 보입니다. 따라서 Count 프로퍼티를 사용하시려면 위의 코드에서 두 번째 옵션은 빼고 설정하셔야 할 듯 합니다. ^_^ 이 방법으로 문제를 해결하실 수 있을지는 장담드릴 수 없겠지만 꼭 성공하시기 바랍니다. 감사합니다. |
IP 주소: 165.141.121.62
|
전체 421 건의 게시물,
17 페이지로 구성된
Active Directory Service Interface 게시판의
12 페이지입니다.
![]() |
게시물 | |||
---|---|---|---|---|
149 | 2005-03-12 | 6,249 | ||
148 |
부푸러 |
2005-03-12 | 1,489 | |
147 | 2005-03-12 | 3,588 | ||
146 |
부푸러 |
2005-03-18 | 918 | |
145 | 2005-01-12 | 4,365 | ||
144 | 2005-01-12 | 3,315 | ||
143 | 2005-01-11 | 3,449 | ||
142 | 2005-01-12 | 3,280 | ||
141 | 2005-01-12 | 3,531 | ||
![]() |
2005-01-12 | 3,543 | ||
139 |
궁금^^ |
2005-01-07 | 873 | |
138 | 2005-01-07 | 3,730 | ||
137 |
|
궁금^^ |
2005-01-08 | 735 |
136 | 2004-11-24 | 3,289 | ||
135 | 2004-11-24 | 3,326 | ||
134 | 2004-11-15 | 3,615 | ||
133 | 2004-11-16 | 3,754 | ||
132 | 2004-11-04 | 3,581 | ||
131 | 2004-11-04 | 3,349 | ||
130 | 2004-11-01 | 3,302 | ||
129 | 2004-11-01 | 3,416 | ||
128 | 2004-11-02 | 3,434 | ||
127 | 2004-11-02 | 3,604 | ||
126 | 2004-10-28 | 6,046 | ||
125 | 2004-10-29 | 3,739 |