문제

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

나는 이미 다른 프로젝트의 더 좋은 클래스에서 WnetAddConnection2 등을 이미 마무리했습니다. 그래서 코드를 바로 던졌습니다.

당사의 웹 서비스는 시스템 계정에 따라 실행되는 Ultidev Cassini (IIS 대신)에서 실행됩니다. "지정된 장치 이름은 유효하지 않습니다"에 대한 오류 코드를 얻습니다. 또한 Web.config 파일의 다른 사용자를 동일한 결과로 가장했습니다.

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

또한 WNETADDConnection과 동일한 결과와 함께 C#의 동등한 "NET 사용"명령을 실행하려고 시도했습니다.

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

누구든지 해결 방법을 아는 사람이 있습니까? 시스템 스타트 업에서 드라이브를 매핑하는 것만으로도 솔루션이지만 시스템/가장 한 사용자가 어떻게 액세스 할 수 있습니까?

Ultidev Cassini 링크 : ultidev

해결책: Ultidev Cassini 서비스를 관리자 하에서 로그온하도록 설정했으며 모든 것이 작동합니다. ASP .NET 사칭은 계획대로 작동하지 않아야합니다.

도움이 되었습니까?

해결책

Local_System 계정은 익명을 제시합니다 네트워크의 자격 증명. 익명 (모든 사람)이 공유에 액세스 할 수있는 경우 UNC 네트워크 공유를 사용 하여이 정보에 액세스 할 수 있습니다.

당신은 또한 수 Cassini를 Windows 서비스로 설치하십시오 다른 사용자로 실행하도록 구성 할 수 있습니다.

다른 팁

로컬 시스템 계정을 사용하는 경우 본질적으로 네트워크에 액세스 할 수 없다고 생각합니다 [FOO]. 나는 가장 한 사람이 당신의 유일한 실행 가능한 길이라고 말하고 싶습니다. 기술적으로 공유에 대한 액세스 컨트롤을 누구나 공유를 읽거나 쓸 수 있지만 솔루션보다 더 많은 문제를 가져올 수 있습니다.

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

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;
        }

    }

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

나는 여전히 주식에 액세스 할 수있는 사용자를 가장합니다.

나는 실제로 이것을 전에 해왔지만, 1997 년과 같이 아주 오래 전부터 델파이 2와 함께 NT 3.51을 이겼습니다.

나는 메모리에서 실행 중이지만 다음과 같은 것으로 생각합니다. Win API를 사용합니다.

wnetaddConnection2 ()

통화 정보 : http://msdn.microsoft.com/en-us/library/aa385413(vs.85).aspx

pinvoke.net에서 c# 서명을 얻을 수 있습니다. http://www.pinvoke.net/default.aspx/mpr/wnetaddconnection2.html

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

~할 것 같다 로컬 시스템이 도메인 계정의 사용자 이름과 비밀번호를 전달함에 따라 서비스를 실행할 수 있어야합니다. 시스템 계정에 네트워크 액세스가 허용되는지 여부는 모르겠습니다.

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

따라서 UNC 네트워크 공유에 대한 액세스는 Windows 서비스 내에서 원격 자원에 액세스하려고 할 때 이동하는 방법입니다. 'Joe'사용자 계정의 컨텍스트에 따라 Windows 서비스를 실행하거나 'MyServiceAccount'와 같은 더미 광고 계정을 만들고 UNC에 해당 계정 권한을 부여하거나 가장 할 수 있으며 가장 할 수 있습니다. Windows Service는 가장하는 핸들이있는 NetLogon () 함수를 사용하여 로컬 워크 스테이션에 로그인 한 다음 UNC에 액세스하십시오.

이를 수행하는 방법에는 여러 가지가 있지만 모두 사용자 계정으로 내려 오는 것은 매핑 된 드라이브 및 UNC 액세스와 관련이 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top