2010-04-19 1 views
2

짧은 버전 : 매핑 된 드라이브에 액세스하는 데 ASP.NET의 가장을 사용하거나 사용하지 않을 수 있습니까?ASP.NET에서 가장 할 때 매핑 된 드라이브에 액세스

긴 버전 : 나는 현재 네트워크 파일에 액세스 할 ASP.NET에서 가장을 사용하고

. 이것은 UNC 경로를 사용하는 모든 네트워크 파일에 대해 완벽하게 작동하지만 가장하는 사용자 계정에 대해 정의 된 매핑 된 드라이브의 파일에 액세스하지 못하고 있습니다.

예를 들어 네트워크에 파일이 \\machine\folder\file.txt 인 경우, S: 드라이브가 \\machine\folder에 매핑된다고 가정 해 봅시다. 전체 UNC 경로 인 \\machine\folder\file.txt과 더 짧고 매핑 된 드라이브 경로 S:\file.txt에 모두 액세스 할 수 있어야합니다.

분명히 표준 ASP.NET 프로세스는 액세스 할 수 없습니다.

매핑 된 S: 드라이브가있는 로컬 계정으로 실행되는 콘솔 응용 프로그램을 사용하는 경우 File.Exists(@"\\machine\folder\file.txt")을 호출하면 true가 반환되고 File.Exists(@"S:\file.txt")도 true를 반환합니다.

그러나 같은 로컬 계정으로 ASP.NET 컨텍스트에서 가장 할 때 File.Exists(@"\\machine\folder\file.txt") 만 true를 반환합니다. File.Exists(@"S:\file.txt")은 false를 반환합니다. 이 모두 실행해야합니다하지만

내가, 내 로컬 Windows   7 프로페셔널 상자에서 실행중인 IIS   7 테스트하고있어   6 IIS 및   7

신원 도용은 두 개의 클래스로 처리됩니다 IIS C#에서 내가 여기에 포함됩니다되는 :

Impersonation.ImpersonateUser("DOMAIN", "username", "password"); 

if (!File.Exists(@"S:\file.txt")) 
    throw new WeCannotContinueException(); 
:

public static class Impersonation 
{ 
    private static WindowsImpersonationContext context; 

    public static void ImpersonateUser(string username, string password) 
    { 
     ImpersonateUser(".", username, password); 
    } 

    public static void ImpersonateUser(string domain, string username, string password) 
    { 
     StopImpersonating(); 

     IntPtr userToken; 
     var returnValue = ImpersonationImports.LogonUser(username, domain, password, 
                ImpersonationImports.LOGON32_LOGON_INTERACTIVE, 
                ImpersonationImports.LOGON32_PROVIDER_DEFAULT, 
                out userToken); 
     context = WindowsIdentity.Impersonate(userToken); 
    } 

    public static void StopImpersonating() 
    { 
     if (context != null) 
     { 
      context.Undo(); 
      context = null; 
     } 
    } 
} 

public static class ImpersonationImports 
{ 
    public const int LOGON32_LOGON_INTERACTIVE = 2; 
    public const int LOGON32_LOGON_NETWORK = 3; 
    public const int LOGON32_LOGON_BATCH = 4; 
    public const int LOGON32_LOGON_SERVICE = 5; 
    public const int LOGON32_LOGON_UNLOCK = 7; 
    public const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8; 
    public const int LOGON32_LOGON_NEW_CREDENTIALS = 9; 
    public const int LOGON32_PROVIDER_DEFAULT = 0; 

    [DllImport("advapi32.dll", SetLastError = true)] 
    public static extern int LogonUser(
     string lpszUsername, 
     string lpszDomain, 
     string lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     out IntPtr phToken 
     ); 
    [DllImport("advapi32.dll", SetLastError = true)] 
    public static extern int ImpersonateLoggedOnUser(
     IntPtr hToken 
    ); 

    [DllImport("advapi32.dll", SetLastError = true)] 
    public static extern int RevertToSelf(); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    public static extern int CloseHandle(IntPtr hObject); 
} 

그런를 Page_Load 동안, 우리는 기본적으로 같은 것을 할

매핑 된 드라이브를 사용하는 것이 모범 사례는 아니지만 기존의 이유로 인해 우리 비즈니스에 바람직합니다. 매핑 된 드라이브에 액세스하기 위해 ASP.NET에서 가장을 사용하거나 사용하지 않을 수 있습니까?

+0

안녕하세요, Adam .. asp.net을 사용하여 매핑 된 드라이브에 액세스 할 수 있습니까? –

답변

1

아니요, 대신 심볼릭 링크를 사용할 수 있습니다. Mklink /d은 디렉토리 링크를 만듭니다.

+0

감사합니다. mklink가 도움이되는 유일한 방법은 매핑 된 드라이브 경로 (예 : 'S : \ file.txt')를 계속 사용할 수 있는지 여부입니다. 그러나 내가 잘못하지 않는 한, mklink가 이것을 허용하지 않는다고 생각합니다. – adamjcooper

+0

그리고 나 자신과 관심있는 다른 누구에게도 이것이 가능하지 않은 이유에 대해 자세히 설명 할 수 있습니까? – adamjcooper

+0

나는 이것이 효과가있을 것이라고 생각한다. 우리는 LocalSystem으로 실행되고 필요한 경우 사용자를 가장하는 (네이티브 C++) 서비스를 가지고 있습니다. 매핑 된 드라이브에 액세스 할 수 있습니다. 방금 Windows 7에서 이중 확인을 확인했습니다. 왜 이것이 ASP.NET에서 작동하지 않을지 모르겠다. – Luke

0

가장 된 사용자가 만든 매핑 된 드라이브에만 액세스 할 수 있습니다.

사용자 X로 가장하여 (예 : 인터넷 사용을 통해) 공유를 매핑하면 가장이 유효하면 해당 공유가 표시됩니다.

DriveInfo.GetDrives()을 통해 현재 액세스 할 수있는 매핑 된 드라이브를 확인할 수 있습니다. 드라이브 유형이 네트워크 인 드라이브는 현재 보안 컨텍스트에서 액세스 할 수 있습니다.

0

mklink solution from Scott을 시도했지만 ASP.NET에서 작동하지 않습니다.

arnshea의 대답은 전혀 작동하지 않습니다. 나는 심지어 도메인 관리자로 가장하고 모든 권한을 모든 사람, iuser 및 네트워크 서비스로 설정했습니다.

유일한 해결책 : 웹 응용 프로그램을 디자인 할 때 네트워크 리소스에 저장할지 여부와 UNC 프로토콜을 사용할지 여부를 결정해야합니다.

매핑 된 네트워크 드라이브는 일반 파일 작업을 위해 ASP.NET에서 작동하지 않습니다.