2012-03-29 3 views
3

새 파일을 만들 특정 폴더를 폴링하는 Windows 서비스가 있습니다. 이 폴더는 C : 또는 D와 같은 로컬 드라이브 중 하나에있을 때 잘 작동합니다. 서비스가 매핑 된 드라이브에서 폴더를 찾지 못합니다.C#으로 작성된 Windows 서비스에서 매핑 된 폴더에 액세스

System.Security.Principal.WindowsIdentity userIdentity = 
      System.Security.Principal.WindowsIdentity.GetCurrent(); 
      System.Security.Principal.WindowsPrincipal principal = 
       new System.Security.Principal.WindowsPrincipal(userIdentity); 

      MappedDriveResolver mdr = new MappedDriveResolver(); 
      if (mdr.isNetworkDrive(folderPath)) 
      { 
       LoggingAppWrapper.LogDeveloperMessage(folderPath + " is on a Mapped drive", 1, TraceEventType.Information, string.Empty); 

      } 

MappedDriveResolver 내가 여기 How do I determine a mapped drive's actual path?

링크의 코드는 간단한 콘솔 응용 프로그램에서 잘 작동을 발견 클래스입니다 : 여기

는 폴더에 대한 검사를 수행하는 코드 폴링하기 전에 존재입니다 ,하지만 Windows 서비스의 일부일 때 실패합니다. 코드가 Windows 서비스에서 작동하도록하려면 어떻게해야할까요?

감사합니다.

+0

서비스가 실행되는 계정에 적절한 권한이 있는지 확실합니까? http://stackoverflow.com : [1] [1] [ "서비스를 사용할 수 있도록 네트워크 드라이브를"스레드에 대한 대답] 가 : – kpcrash

+0

나는이 답변이 도움이 될 것입니다 생각/a/4763324/3860297 – sekerg

답변

4

서비스를 실행하는 서버가 아닌 폴더에 UNC 경로를 사용하도록 서비스를 구성하는 것이 좋습니다.

매핑 된 드라이브는 사용자를위한 유용성 기능이며 사용자 프로필/환경에만 해당됩니다. 의미, 로그인 할 때 드라이브 X : \\ server1 \ share1에 매핑되지만 드라이브 X에 로그인하면 \\ server2 \ share2에 매핑 될 수 있습니다. 실제 매핑 프로세스는 "로그온 할 때 다시 연결"을 사용하여 프로필의 일부로 저장되거나 로그온 스크립트에 의해 처리됩니다.

서비스가 실행중인 계정을 확인하고 해당 사용자 환경에 매핑 된 드라이브가 있는지 확인해야합니다 (How to map a network drive to be used by a service).

편집 :.

이유 콘솔 응용 프로그램이 작동하고 서비스하는하지 않기 때문에 환경 사이의 차이가에서 실행중인 않는

이를 설명하기 위해,이 콘솔 응용 프로그램을, 그것을 컴파일 한 다음 스케줄 태스크로 실행하십시오. "path"변수를 사용자가 액세스 할 수있는 매핑 된 드라이브로 설정하십시오.

static void Main(string[] args) { 
     MappedDriveResolver mdr = new MappedDriveResolver(); 
     string logfile; 
     string path = @"I:\"; 
     string[] files; 

     // Write out "log" file to where this is running from 
     logfile = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); 
     logfile = Path.Combine(logfile, "log.txt"); 

     using (StreamWriter sw = new StreamWriter(logfile, true)) { 

      try { 
       sw.WriteLine("Checking path " + path); 
       if (mdr.isNetworkDrive(path)) { 
        sw.WriteLine("Network Drive: Yes"); 
       } else { 
        sw.WriteLine("Network Drive: No"); 
       } 
      } catch (Exception ex) { 
       sw.WriteLine("Exception: " + ex.Message); 
      } 

      try { 
       sw.WriteLine("Resolve path " + path); 
       string newpath = mdr.ResolveToUNC(path); 
       sw.WriteLine("Resolved path " + newpath); 
      } catch (Exception ex) { 
       sw.WriteLine("Exception: " + ex.Message); 
      } 

      try { 
       sw.WriteLine("Get file list from " + path); 
       files = Directory.GetFiles(path); 
       if (files == null || files.Length == 0) { 
        sw.WriteLine("No files found"); 
       } else { 
        sw.WriteLine(string.Format("Found {0} files.", files.Length)); 
       } 
      } catch (Exception ex) { 
       sw.WriteLine("Exception: " + ex.Message); 
      } 

      sw.Flush(); 
      sw.Close(); 
     } 
    } 

참고 :이 윈도우 7 작업 스케줄러

시험 1 인 : 그냥 더블 클릭하여 응용 프로그램을 실행합니다.
결과 : 성공

테스트 2 : 성공

테스트 3 :
결과 구성 예정으로 사용자 계정으로 실행하는 작업 "사용자가 로그온 한 경우에만 실행"으로 실행하도록 구성 예약 된 작업하여 사용자가 로그온했는지 여부에 관계없이 실행 "
결과 : 예외

테스트 4 :"로컬 서비스 "계정으로 실행되도록 예약 작업을 구성합니다.
결과 : 예외

시험 1 & 2 일을 그들이 현재 그것의 일부 매핑 된 드라이브를 포함하여 사용자 환경에 로그인 사용하고 있기 때문에.

테스트 3 & 4 매핑 된 드라이브가 구성되어 있지 않은 자체 사용자 환경이 만들어 졌으므로 실패합니다. 차이점이 무엇인지 순간적으로 알려주지 만, "대화 형"및 "비대화 형"환경은 몇 가지 중요한 의미에서 다릅니다.

+0

Ok ... 알 겠어.하지만 Console App에서는 코드가 작동하지만 Service에서는 작동하지 않는 이유는 무엇입니까? – Codehelp

+0

여기에 좋은 정보가 있습니다. [http://stackoverflow.com/questions/4396634/how-can-i-determine-if-a-given-drive-letter-is-a-local-mapped-usb-drive] ... 다시 콘솔 앱에서 제대로 작동하지만 서비스를 통해 실패합니다 !!! – Codehelp

+0

@ Codehelp 더 나은 설명과 테스트 방법을 추가했습니다. – Vermis

관련 문제