Windows

[펌] WMI를 이용한 원격컴퓨터 Explorer

_침묵_ 2005. 12. 20. 00:09
사용자 삽입 이미지
FileUploadBrowser.zip

WMI (Windows Management Instrumentation)

 

WMI는 예전에 해당 컴퓨터의 정보를 가져오는데 사용을 하거나, 악의적으로는 학교같은 여러대의 컴퓨터가 있는 경우 Admin계정의 암호가 허술한 곳을 알아내 해당 IP로 접근하여 자료를 가져오는데 사용하기도 했으며, 시스템의 자원등을 가져오는 것에 넘어서 PC를 끄는데도 이용을 했었던 것 같습니다

 

요즘 밥벌이를 못하고 있는터 하루의 대부분을 드라마만 보고 있다가

문득 자료공유 프로그램을 만들어보면 어떨까 하고 생각했었는데 예상했던 것 보다 많은 시간이 걸릴 것 같아 간단하게 원격지의 Explorer를 만들게 되었습니다

 

말이 원격지의 Explorer지 그냥 원격지의 컴퓨터의 파일만 보여주는 형태입니다

 

아래 프로그램을 사용하시려면 몇가지 수정사항이 있습니다

원래 IP를 받아서 처리해야하지만 귀차니즘으로 인해 Fix 시켰습니다

 

##############################################

  private string stringMachineName = "192.168.0.100";
  private string Username = "Administrator";
  private string Password = "pwd";

##############################################

 

위의 해당 IP와 UserName 그리고 Password만 수정해 주면 동작은 한다

한가지 자신의 컴퓨터에 연결을 하면사용자 자격 증명은로컬 연결에 사용할 수 없습니다라는 에러메시지가 나옵니다.

 

그냥 쉽게 테스트 하려면 먼저 브라우저에서 \\203.232.153.0 /c$ 이런식으로 입력을 한 후 아이디와 패스워드 인증이 된다면 아래 프로그램 또한 그 IP에 대해서는 사용할 수 있습니다

 

OS가 서버군이나(2000, 2003) 2000 Professional 에서 사용할 수 있으며, XP부터보안이 강화되어서 일반적으로는 접근이 되지 않는걸로 알고 있습니다

 

참 그리고 방금 확인한 건데 CD-ROM에 있는건 파일은 읽혀지는데 오른쪽부분의 ListView에서는 오류가 나네요..

로컬파일과는 접근방법이 다르나 봅니다 ㅡ.ㅡ;;

 

 

그림 #1 [허접 프로그램]

사용자 삽입 이미지

 

그림 #2 [웹 브라우저에서 해당 IP로 접근한 화면]

사용자 삽입 이미지
 
 
조금은 생소한 WMI를 사용하였기에 코딩보다는 문법에 대한 명령때문에 몇시간 고생을 했었습니다
디렉토리를 얻어오려고 "SELECT * FROM Win32_Directory"를 쓰다가 C 드라이브에 있는 폴더라는 폴더 모두를 가져오게 되었으며 파일을 가져오는 걸 몰라서 헤매였었고, 자식 디렉토리를 가져오는 것도 ㅡ.ㅡ;;
여기저기 정보의 바다속을 헤매이겨 겨우 원하는 자료들을 찾았습니다.
한마디로 여기저기 짜집기라고나 할가요.. 으흐흐
 
몇가지 핵심(?)적임 쿼리를 적어봅니다
 
1. 선택된 노드(해당 디렉토리)의 하위 디렉토리를 얻어오는 쿼리(?)
ManagementObjectCollection queryCollection = this.getServiceCollection("ASSOCIATORS OF {Win32_Directory='"+ this.getFullPath(nodeCurrent.FullPath) +"'} WHERE AssocClass=Win32_SubDirectory ResultRole=PartComponent");
 
2. 선택된 노드(해당디렉토리)의 파일들을 가져오는 쿼리
ManagementObjectCollection queryCollection = this.getServiceCollection("ASSOCIATORS OF " + "{Win32_Directory='" + nodeCurrent + "'} " + "WHERE " + "AssocClass=CIM_DirectoryContainsFile " + "ResultClass=CIM_DataFile " + "ResultRole=PartComponent " + "Role=GroupComponent");
 
3. 원격컴퓨터의 드라이브를 가져오는 쿼리
ManagementObjectCollection queryCollection = this.getServiceCollection("SELECT * From Win32_LogicalDisk ");
 
그리고 여기서 getServiceCollection() 이라는 Method는 원격접근의 인증부분입니다
로컬이 아니기 때문에 접근을 하려면 하나하나의 작업마다 인증이 필요하겠죠
혹시나 해서 Method 내용을 추가시킵니다
 
  // Remote로 WMI의 쿼리를 실행시킨다
  private ManagementObjectCollection getServiceCollection(string stringQuery) {
   ManagementObjectSearcher query;
   ManagementObjectCollection queryCollection = null;
   ObjectQuery oq;
   // Connection to the remote computer
   ConnectionOptions co = new ConnectionOptions();
   co.Username = this.Username;
   co.Password = this.Password;
   ManagementScope ms = new ManagementScope("\\\\" + this.stringMachineName + "\\root\\cimv2", co);
   // Status
   updateStatus("Getting Service Infomation");
   // Query remote computer across the connection
   oq = new ObjectQuery(stringQuery);
   query = new ManagementObjectSearcher(ms, oq);
   try {
    queryCollection = query.Get();
   } catch (Exception err1) {
    MessageBox.Show ("Error : " + err1);
   }
   // Status
   updateStatus("Ready");
   this.Update();
   return queryCollection;
  }

'Windows' 카테고리의 다른 글

WMI로 Windows 관리 (2000.4.26)  (0) 2005.12.20
[펌] 복잡한 IT 인프라 관리「닷넷 WMI로 푼다」  (0) 2005.12.20
윈도우 콘솔 명령어들  (0) 2005.10.19