Доступ к подключенным дискам при олицетворении в 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")
возвращает истину, иFile.Exists(@"S:\file.txt")
также возвращает истину.
Однако при олицетворении в контексте ASP.NET с той же локальной учетной записью толькоFile.Exists(@"\\machine\folder\file.txt")
возвращает истину.File.Exists(@"S:\file.txt")
возвращает ложь
Я тестирую с IIS 7, работающим на моем локальном компьютере с Windows 7 Professional, хотя это потребуется для работы как в IIS 6, так и в IIS 7.
Олицетворение обрабатывается парой классов в C #, которые я включу здесь:
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, мы делаем что-то вроде этого:
Impersonation.ImpersonateUser("DOMAIN", "username", "password");
if (!File.Exists(@"S:\file.txt"))
throw new WeCannotContinueException();
Я понимаю, что использование подключенных дисков - не лучшая практика, но по старым причинам это желательно для нашего бизнеса.Возможно ли использовать олицетворение в ASP.NET для доступа к подключенным дискам?