짧은 버전 : 매핑 된 드라이브에 액세스하는 데 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에서 가장을 사용하거나 사용하지 않을 수 있습니까?
안녕하세요, Adam .. asp.net을 사용하여 매핑 된 드라이브에 액세스 할 수 있습니까? –