Я пытаюсь выяснить, существует ли каталог на основе поля ввода от пользователя. Когда пользователь вводит путь, я хочу проверить, существует ли путь на самом деле.проверить, существует ли каталог в сети C#
У меня уже есть код на C#. Он всегда возвращает 0, ЗА ИСКЛЮЧЕНИЕМ для строки «C: \ Program Files» ...
static string checkValidPath(string path)
{
//Insert your code that runs under the security context of the authenticating user here.
using (ImpersonateUser user = new ImpersonateUser("myusername", "", "mypassword"))
{
//DirectoryInfo d = new DirectoryInfo(quotelessPath);
bool doesExist = Directory.Exists(path);
//if (d.Exists)
if(doesExist)
{
user.Dispose();
return "1";
}
else
{
user.Dispose();
return "0";
}
}
}
public class ImpersonateUser : IDisposable
{
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
[DllImport("kernel32", SetLastError = true)]
private static extern bool CloseHandle(IntPtr hObject);
private IntPtr userHandle = IntPtr.Zero;
private WindowsImpersonationContext impersonationContext;
public ImpersonateUser(string user, string domain, string password)
{
if (!string.IsNullOrEmpty(user))
{
// Call LogonUser to get a token for the user
bool loggedOn = LogonUser(user, domain, password,
9 /*(int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS*/,
3 /*(int)LogonProvider.LOGON32_PROVIDER_WINNT50*/,
out userHandle);
if (!loggedOn)
throw new Win32Exception(Marshal.GetLastWin32Error());
// Begin impersonating the user
impersonationContext = WindowsIdentity.Impersonate(userHandle);
}
}
public void Dispose()
{
if (userHandle != IntPtr.Zero)
CloseHandle(userHandle);
if (impersonationContext != null)
impersonationContext.Undo();
}
}
Любая помощь приветствуется. Благодаря!
EDIT 4: Наконец-то найдено решение! См. Ответ ниже. Код BrokenGlass также сработал бы. Мне было проще добавить файл web.config.
EDIT 3: обновленный код для использования функций олицетворения BrokenGlass. Еще не удачи ...
EDIT 2: Я обновил код, чтобы попытаться использовать олицетворение, как предложено ниже. Он все равно терпит неудачу каждый раз. Я предполагаю, что использую олицетворение ненадлежащим образом ...
EDIT: В соответствии с запросом ChrisF, здесь функция, вызывающая функцию checkValidPath.
Frontend ASPX файл ...
$.get('processor.ashx', { a: '7', path: x }, function(o) {
alert(o);
if (o=="0") {
$("#outputPathDivValid").dialog({
title: 'Output Path is not valid! Please enter a path that exists!',
width: 500,
modal: true,
resizable: false,
buttons: {
'Close': function() { $(this).dialog('close'); }
}
});
}
});
Backend ASHX файл ...
public void ProcessRequest (HttpContext context) {
context.Response.Cache.SetExpires(DateTime.Now);
string sSid = context.Request["sid"];
switch (context.Request["a"])
{//a bunch of case statements here...
case "7":
context.Response.Write(checkValidPath(context.Request["path"].ToString()));
break;
Все, что есть выглядит правильно, вы подтверждено, что вы получаете в функции? –
Просто помните, что к моменту возвращения вашей функции ответ может быть устаревшим. Файловая система является общим ресурсом и может быть доступна другим процессам в любое время. –
Является ли параметр Path правильным путем? Это может быть вашей проблемой. – asawyer