2009-09-16 5 views
0

매핑 된 네트워크 드라이브와 상호 작용하는 타사 프로세스를 실행해야하는 웹 서비스에서 작업하고 있습니다. 따라서이 드라이브를 프로그래밍 방식으로 웹 서비스에서 매핑해야합니다.C# - 웹 서비스에서 네트워크 드라이브로 연결

내가 이미 다른 프로젝트에 대한 더 좋은 수업 등 WNetAddConnection2을 싸서, 그래서 내가 바로의 코드를 던졌다.

우리의 웹 서비스는에서 실행 (대신 IIS의) UltiDev 카시니에서 실행됩니다 시스템 계정. 매번 "지정된 장치 이름이 유효하지 않습니다"라는 오류 코드가 나타납니다. 나는 또한 동일한 결과와 함께 web.config 파일에서 다른 사용자를 가장하려고 시도했습니다.

일반 사용자 계정으로 콘솔 프로그램에서 코드를 실행하면 드라이브가 잘 매핑됩니다.

WNetAddConnection과 동일한 결과를 사용하여 C에서 동일한 "net use"명령을 실행 해 보았습니다.

Windows 서비스 또는 시스템 사용자가 네트워크 드라이브를 매핑 할 수없는 이유를 알고있는 사람이 있습니까?

해결 방법을 알고 계십니까? 단순히 시스템 시작시 드라이브를 매핑하는 것이 해결책 일 수 있지만 시스템/가장 된 사용자가 어떻게 액세스 할 수 있습니까? UltiDev 카시니에 대한

링크 : UltiDev

해결책 : 나는 관리자에서 로그온 할 수 UltiDev 카시니 서비스를 설정하고 모든 노력하고 있습니다. ASP .Net 가장은 계획 한대로 작동하지 않아야합니다.

답변

2

로컬 시스템 계정을 사용하는 경우 본질적으로 네트워크 [foo]에 액세스 할 수 없다고 생각합니다. 나는 가장이 유일한 유일한 길이라고 말하고 싶습니다. 기술적으로는 공유에 대한 액세스 제어를 줄여 누구나 공유에 대한 읽기/쓰기가 가능하지만 솔루션보다는 문제가 많습니다.

+0

그러면 web.config 가장이 왜 작동하지 않습니까? Environment.Username을 우리의 로그에 인쇄하고 관리자를 인쇄하지만, UltiDev 프로세스를 보면 여전히 로컬 시스템 아래에 있습니다. UltiDev가 이상한 일을 할 수 있습니까? – jonathanpeppers

+1

로컬 시스템 계정에 네트워크 액세스 권한이 있지만 네트워크 리소스에 익명 자격 증명을 제공합니다. – bryanbcook

1

같은 문제가있었습니다. 문제는 코드가 실행중인 계정 때문에 발생합니다. 다음 클래스를 사용하여이 작업을 수행 할 수 있습니다. 파일 액세스/복사에 사용하는 것과 동일한 코드로 드라이브를 매핑해야합니다. 우리가 사용하는 패턴은 드라이브가 먼저 연결되어 있는지 항상 확인하는 것입니다. 그렇다면 연결을 해제 한 다음 다시 연결합니다. 그렇지 않다면, 우리는 단지 그것을 연결합니다. 설명하는 문제를 해결하는 것 같습니다.

public static class NetworkDrives 
    { 
     public static bool MapDrive(string DriveLetter, string Path, string Username, string Password) 
     { 

      bool ReturnValue = false; 

      if(System.IO.Directory.Exists(DriveLetter + ":\\")) 
      { 
       DisconnectDrive(DriveLetter); 
      } 
      System.Diagnostics.Process p = new System.Diagnostics.Process(); 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.CreateNoWindow = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.RedirectStandardOutput = true; 

      p.StartInfo.FileName = "net.exe"; 
      p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username; 
      p.Start(); 
      p.WaitForExit(); 

      string ErrorMessage = p.StandardError.ReadToEnd(); 
      string OuputMessage = p.StandardOutput.ReadToEnd(); 
      if (ErrorMessage.Length > 0) 
      { 
       throw new Exception("Error:" + ErrorMessage); 
      } 
      else 
      { 
       ReturnValue = true; 
      } 
      return ReturnValue; 
     } 
     public static bool DisconnectDrive(string DriveLetter) 
     { 
      bool ReturnValue = false; 
      System.Diagnostics.Process p = new System.Diagnostics.Process(); 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.CreateNoWindow = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.RedirectStandardOutput = true; 

      p.StartInfo.FileName = "net.exe"; 
      p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE"; 
      p.Start(); 
      p.WaitForExit(); 

      string ErrorMessage = p.StandardError.ReadToEnd(); 
      string OuputMessage = p.StandardOutput.ReadToEnd(); 
      if (ErrorMessage.Length > 0) 
      { 
       throw new Exception("Error:" + ErrorMessage); 
      } 
      else 
      { 
       ReturnValue = true; 
      } 
      return ReturnValue; 
     } 

    } 
+0

처음에 연결하지 않기 때문에 연결을 끊고 다시 연결할 수 없습니다. – jonathanpeppers

0

매핑 된 드라이브 대신 UNC 공유를 사용하여 연결할 수 있습니까?

나는 여전히 공유에 액세스 할 수있는 사용자로 가장 할 것입니다.

+0

우리가 상호 작용하는 당사의 타사 프로세스는 f : \ – jonathanpeppers

0

전 실제로 이것을 해봤지만, 1997 년과 Windows NT 3과 같이 오래 전이었습니다. 당신은 승리의 API 사용 : http://msdn.microsoft.com/en-us/library/aa385413(VS.85).aspx

: 호출에

WNetAddConnection2()

정보를

I 메모리에서 실행 해요,하지만 난 그게 이런 식 생각 델파이 2 (51)

당신은 pInvoke.net에서 C#을 서명을 얻을 수 있습니다 : http://www.pinvoke.net/default.aspx/mpr/WNetAddConnection2.html

참고 구성에 : 나는 당신이에 대한 도메인 계정을 설정해야합니다 생각 서비스를 실행하고 로컬 시스템 대신 해당 계정의 ID로 서비스를 실행하십시오. 사용자 이름과 암호로 null을 전달한다고 생각합니다.

로컬 시스템이 도메인 계정의 사용자 이름과 암호를 전달할 때 서비스를 실행할 수 있어야합니다. 시스템 계정에 네트워크 액세스가 허용되는지 여부는 알 수 없습니다.

+0

과 같은 일반 드라이브 문자로 작업해야합니다. 이미 WNetAddConnection2를 구현했습니다. – jonathanpeppers

+0

@Jonathan : 내 게시물에 구성 메모를 적용 했습니까? 로컬 시스템으로 실행되는 서비스에서는 작동하지 않을 것입니다. 네트워크 액세스 권한이 있고 연결된 공유에 액세스 할 수있는 적절한 권한이있는 도메인 계정을 설정해야합니다. 서비스는 로컬 시스템이 아닌 해당 계정으로 실행해야합니다. – JMarsch

0

'매핑 된 드라이브 문자'는 시스템 개념이 아닌 사용자 개념이라는 것을 명심해야합니다. 따라서 Joe가 Windows 컴퓨터에 로그인하면 매핑 된 드라이브가 Joe 사용자 계정에 연결됩니다. Windows 서비스가 실행 중일 때는 일반적으로 LOCAL_SYSTEM '사용자 계정'에서 실행됩니다. 즉, LOCAL_SYSTEM은 Joe의 매핑 된 드라이브 문자에 대해 알지 못합니다.

따라서 네트워크 공유에 대한 UNC 액세스는 Windows 서비스 내에서 원격 리소스에 액세스하려고 시도하는 방법입니다. 'Joe'사용자 계정의 컨텍스트에서 Windows 서비스를 실행할 수도 있고 'MyServiceAccount'와 같은 무명 AD 계정을 만들어 UNC에 계정 권한을 부여 할 수도 있고 가장을 사용할 수도 있습니다. Windows 서비스는 가장 핸들이있는 NetLogon() 함수를 사용하여 로컬 워크 스테이션에 로그인 한 다음 거기에서 UNC에 액세스합니다.

여러 가지 방법이 있지만 사용자 계정은 모두 매핑 된 드라이브 및 UNC 액세스와 연결됩니다.

행운을 비네,이 정보가 도움이 되었기를 바랍니다!