Чтение скрытого общего ресурса в C#
-
02-07-2019 - |
Вопрос
Итак, у меня есть небольшое приложение на C#, которому необходимо периодически проверять содержимое каталогов на нескольких компьютерах в сети.Я думал, что могу просто прочитать \hostname\C$ как путь к каталогу, но с обычным классом Directory, похоже, нет способа аутентификации на других серверах, чтобы вы могли получить доступ к скрытому общему ресурсу.Я уверен, что есть простой способ сделать это, который я упустил из виду, но на данный момент я немного в тупике.
Решение
От http://bytes.com/forum/thread689145.html:
Все процессы работают в контексте регистрации учетной записи пользователя.Если вы хотите открыть файл на другом компьютере, ваше приложение должно работать в контексте пользователя, у которого есть разрешения на открытие файлов на этой машине.Вы можете сделать это с подражанием.
Кажется, самый простой способ — предоставить текущему пользователю соответствующие права на других машинах.
Другие советы
Чтобы пройти аутентификацию с использованием общего ресурса, к которому у пользователя, запускающего процесс, нет разрешения (что часто происходит с административными общими ресурсами), попробуйте выполнить команду net use:
net use SERVERNAME\IPC$ /user:USERNAME PASSWORD
Попробуйте запустить это в отдельном процессе перед кодом, который фактически пытается получить доступ к общему ресурсу, например:
ProcessStartInfo psi = new ProcessStartInfo(
"net", "use " + SERVERNAME + @"\IPC$ /user:" + USERNAME + " " + PASSWORD);
Process p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
p.Close();
// The code to access the share follows...
Это полезно, если нецелесообразно давать разрешение на общий ресурс для учетной записи пользователя, запускающей процесс, например.для модели безопасности, в которой приложению конечного пользователя необходимо получить доступ к данным в общем ресурсе, к которому сам пользователь не должен иметь прямого доступа.
Вы ищете способ установить текущего пользователя во время выполнения?
Если нет, то пока пользователь, запускающий процесс, имеет доступ к этим машинам, это подойдет вам:
DirectoryInfo di = new DirectoryInfo(@"\\machineName\c$\temp");
FileInfo[] files = di.GetFiles();
foreach (FileInfo f in files)
{
Debug.WriteLine(f.Name);
}