Microsoft MVP성태의 닷넷 이야기
WMI 를 사용하지 않고 하드웨어 정보를 가져올 수 없을까요? [링크 복사], [링크+제목 복사]
조회: 15201
글쓴 사람
이성환 (vactorman at naver.com)
홈페이지
첨부 파일
 

안녕하세요.

유용한 정보 매번 잘 보고 있습니다.

간단히 질문하자면...



C#으로 작업 하면서 하드웨어 정보를 가져오는 작업을 종종 했었는데요,

그 때마다 WMI를 사용하는 게 당연하다고 생각했습니다.

그런데 속도 문제가 좀 걸리더군요.

CPU, Mainboard, Memory, HDD 등의 일부 정보(예를 들면 시리얼이나 메모리는 전체 size 정도)를 WMI로 쿼리하는데

대략 1.5초 정도 걸리더군요.

많은 양을 쿼리한 건 아니고 그냥 CPU 1번, Mainboard 1번 이런 식으로 5번(CPU 개수가 1개 인 경우는 4번, 2개 인 경우는 5번) 정도 쿼리를 했습니다.

그러니까 최대 5번 쿼리 시 대략 1.5 정도의 시간이 걸렸습니다.

어플리케이션에서 1.5는 그렇다 치더라도

지금은 웹으로 하드웨어 정보를 가져와야하는 상황이라 (클라이언트 하드웨어 정보가 아니라 서버 정보입니다.)

WMI를 사용하기 적절하지 않다고 판단하고 있습니다. (웹에서 1.5초는 사용자가 다른 페이지를 선택하도록 만드는 시간이라..)



구글링을 약간 해서 얻은 결과는

'C#으로 WMI 없이 하드웨어 정보를 가져오는 게 불가능 하다.' 정도 였습니다...OTL
(물론 WMI 아닌 다른 방법으로 하드웨어 정보를 가져올 때 1.5 초 이상 걸린다면 그것도 의미가 없겠죠.)


아.. 그러면 제목에 쓴 질문을 바꾸는 게 더 좋을지도 모르겠네요.

더 속도 빠른 하드웨어 검색 방법이 있는 지 여쭤봐도 될까요?








[최초 등록일: ]
[최종 수정일: 5/4/2011]


비밀번호

댓글 작성자
 



2011-05-04 04시32분
적절하게 조합하시는 게 좋지 않을까요? Win32 API 로 가져올 수 있는 정보도 있을 것입니다. 일례로, 메모리 전체 크기 정도는 WMI 쓰실 필요없이 P/Invoke 로 Win32 API호출하면 됩니다. 그리고 약간의 캐시도 곁들이면 좋겠지요. Win32 API에서 제공되지 않는다면 WMI를 사용하더라도 약간의 데이터 캐시를 하는 것이 좋지 않을까 싶습니다. 예를 들어, 전체 메모리나 시리얼 번호 등은 쉽게 변하는 것은 아니니까요.

그리고, C++/CLI를 적절하게 곁들이면 더욱 좋을 것입니다.
정성태
2011-05-06 10시17분
[이성환] 답변 감사드립니다.

나머지 것들은 그냥 WMI 를 사용해도 무방할 듯하구요.(4번 쿼리 날리는 시간이 대략 0.2 초 내외 더군요.)

사실상 시간이 많이 걸리는 작업은 CPU의 ProcessorName을 가져오는 건데요. 이게 전체 작업 시간의 90% 이상을 차지 하더군요.

그래서 CPU ProcessorName 찾는 걸 Win32 API로 P/Invoke 해보려고 했는데요.

구글링해보니까 CPU ProcessorName만 가져오는 Win32 API는 찾기 힘들더군요.(제 검색 능력 부족이란 생각이 듭니다.)

이게 라이센스 관련된 부분이다보니 필요할 때마다 매번 새로 불러서 써야하는 제약이 좀 있구요.

제가 C++에 문외한이라(오직 C# ;ㅅ;)

C++/CLI는 어떤 형태를 말씀하시건 지 잘 모르겠습니다. 혹시 C++로 dll을 작성한 후 참조하는 형식을 말씀하신 건가요?


[guest]
2011-05-07 10시38분
C++ 구문과 .NET 에서의 접속을 쉽게 하는 구문이 혼합된 것이 C++/CLI입니다. 그래서, 웹에 있는 C++ 코드가 있으면 그대로 가져다가 빌드한 후, 다른 .NET 언어에서 호출할 수 있도록 래퍼해주면 됩니다. 일단은 C++ 을 안해보셨다면 고려 대상은 안될 것 같지만, 간단한 C++ 소스 코드 정도는 굳이 언어를 몰라도 가져올 수 있으므로 적어본 것입니다.

어쨌든, CPU ProcessorName이라면 더더욱 캐쉬 한번으로 끝낼 수 있으므로 WMI를 써야하는데 그다지 제약이라고 할 건 아닌 것 같습니다. ^^
정성태

... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4829윤현수4/26/201714672System.Text.Encoding 질문 [1]
4828jaem...4/20/201710916시스템 종료시 block 함수 xp 지원가능한 방법 질문 [2]
4827ds4/13/201712696매서드 정의로 이동시 [메타데이터에서]에서 라고 나오는 것은 뭔가요? [1]
4826김솔지4/11/201710054CxImage 문자 출력 [1]
4825플메4/10/201710445덱스트 업로드 하는데 구성요소 서비스에 엑셀이 안뜨네요..ㅜㅜ [1]파일 다운로드1
4824김상경4/9/20179831win7에서 vb6.0을 이용해서 프로그램을 만들었습니다.(제가 만든건 아니고 옆 동료가 만들었습니다.) [1]파일 다운로드1
4823조상현3/28/201710874windows event log 에 대한 정보는 어디서 얻을 수 있을까요? [1]
4822부우3/24/201712526글수정이 안되어 다시올려드립니다ㅠ [12]파일 다운로드2
4821부우3/22/201726157파일이나 어셈블리 중 하나를 로드에러 좀 봐주세요 [9]파일 다운로드1
4820듀이3/20/201710947오차 없이 동시에 명령을 보내게 가능한가요? [2]파일 다운로드1
4819popo3/20/201712289C# sslstream 사용시 Cipher List 설정 [3]
4818부우3/16/201721155DllImport 사용시 진입점을 찾을수 없습니다 [2]
4817yun3/15/201710510서피스프로4의 HYPER-V로 윈도우7을 깔았는데... [1]
4816부우3/15/201713239C++ DLL함수 사용 질문드립니다 [10]
4815김지용3/14/20179302.net core linux 오류 [2]
4814김솔지3/13/201710382인쇄 시 , 출력화면을 이미지 파일로 저장하고 싶습니다. [1]파일 다운로드1
4813spow...3/8/201711923멀티 스레드 환경에서 처리하여야 할 목록을 효율적으로 사용하는 기법 질문 드립니다 [2]
4812popo2/23/201711978.NET Window ClassName 변경 질문 드립니다. [1]
4809힘찬도약2/15/201715048C# 가상 시리얼 [4]
4808이길용2/9/201713788WCF 외부 접속 관련해서 질문드립니다ㅠ [1]
4807헬조선식...2/8/201720380WPF의 속도에 대해서 궁금합니다. [3]
4803헬조선식...2/7/201713796WPF로 메신져 메세지 박스 구현 문의 [2]
4802spow...2/6/201710828특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? [7]
4804spow...2/7/201710704    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은?
4805spow...2/7/201710377    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? (글삭제가 안돼 재첨부합니다)파일 다운로드1
4801spow...2/3/201710255C#의 참조 동작관련하여 아이디어 문의 드립니다 [4]
... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...