웹서버에서 원격파일서버로 파일복사할 때 사용되는 방법

 

참고글

1. ASP.NET에서 공유 폴더 액세스

2. 네트워크 드라이브(공유 폴더) 작업하기

3. 네트워크 드라이브 목록 뽑기

 

방법

1. 가장해서 전송하는 경우

web.config 에 가장(impersonate) 정보를 등록하여 사용

이 부분은 참고글을 보면 자세한 사항이 나와 있습니다.

 

2. 네트워크 드라이버 잡아서 하는 경우

- batch 파일로 가상디렉토리를 잡고 UNC 명으로 파일복사

 

batch 파일 정보

net use * /DELETE /YES
net use z: \\가상디렉토리경로\hgjung "hgjung" /user:hgjung /persistent:YES

 

 

- Win32 API에 있는 "WNetUseConnection" 를 사용하여 가상디렉토리를 잡고 UNC 명으로 파일복사

 

WNetUseConnection 사용방법

[code csharp]
NetworkDriveHelper.Connect("\\가상디렉토리경로\hgjung", "hgjung", "hgjung", null);

public class NetworkDriveHelper
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct NETRESOURCE
    {
        public uint dwScope;
        public uint dwType;
        public uint dwDisplayType;
        public uint dwUsage;
        public string lpLocalName;
        public string lpRemoteName;
        public string lpComment;
        public string lpProvider;
    }
    [DllImport("mpr.dll", CharSet = CharSet.Auto)]
    internal static extern int WNetUseConnection(
                IntPtr hwndOwner,
                [MarshalAs(UnmanagedType.Struct)] ref NETRESOURCE lpNetResource,
                string lpPassword,
                string lpUserID,
                uint dwFlags,
                StringBuilder lpAccessName,
                ref int lpBufferSize,
                out uint lpResult);
    /// <summary>
    /// 공유 폴더에 대한 네트워크 연결을 만든다.       
    /// 그 드라이브 이름은 StringBuilder 를 통해 값이 반환된다.
    /// </summary>
    /// <param name="remoteAccessUri">원격 공유폴더 경로</param>
    /// <param name="remoteUserId">원격 사용자 아이디</param>
    /// <param name="remotePassword">원격 비밀번호</param>
    /// <param name="localDriveName">사용가능한 드라이브 명, NULL일때 시스템이 자동으로 설정한다.</param>
    /// <returns>
    /// 0    : 성공 (0 이 아닌 값은 오류가 발생했음을 알리는 오류 코드)
    /// 85   : 네트드라이버를 설정할때, 네트워크 드라이버가 이미사용중일 때(시스템에 자동으로 생성되게 하면 localDriveName에 NULL를 입력 sb로 반환한다.)
    /// 234  : capacity 값은 공유 폴더의 경로를 담을 수 있도록 충분히 주어야 한다. 그렇지 않으면 오류 코드 234를 반환할 것이다.
    /// 1203 : 공유폴더경로 오류
    /// 1326 : 사용자/암호가 일치 하지 않는다.
    /// </returns>
    static public int Connect(string remoteAccessUri, string remoteUserId, string remotePassword, string localDriveName)
    {
        int capacity = 64;
        uint resultFlags = 0;
        // flags 가 0x80 이 아닌 값이 사용되면 StringBuilder는 일반적으로 공유 폴더의 UNC 이름을 반환한다.
        uint flags = 0;
        System.Text.StringBuilder sb = new System.Text.StringBuilder(capacity);
       
        NETRESOURCE ns = new NETRESOURCE();
        ns.dwType = 1;           // 공유 디스크
        ns.lpLocalName = localDriveName;   // 로컬 드라이브 지정하지 않음
        ns.lpRemoteName = remoteAccessUri;
        ns.lpProvider = null;
        int result = WNetUseConnection(IntPtr.Zero,
            ref ns,
            remotePassword,
            remoteUserId,
            flags,
            sb,
            ref capacity,
            out resultFlags);
        return result;
    }
}
[/code]

 

파일복사는 반드시 UNC 명으로 해야합니다. (이유는 네트워크 드라이브 정보는 각 계정의 프로필정보에 저장이 되므로 실행하는 계정의 틀리면 네트워크 드라이브로 접근할 수 가 없습니다.)

 

파일복사

File.Copy("D:\1.txt", \\가상디렉토리경로\hgjung\1.txt, true);

 

 

3. IIS에 가상디렉토리 잡아서 하는 경우

웹서버와 파일서버에 동일한 계정과 비밀번호를 생성하고 IIS에 가상디렉토리를 파일서버의 공유폴더로 잡아놓고 복사하면 됩니다.

 

Posted by hgjung

댓글을 달아 주세요