C # - Сопоставление сетевого диска с веб-сервисом
-
07-07-2019 - |
Вопрос
Мы работаем над веб-сервисом, который должен запускать сторонний процесс, взаимодействующий с подключенным сетевым диском.Итак, мы должны программно сопоставить этот диск с веб-сервисом.
Я уже завершил работу с WNetAddConnection2 и т.д.в более удобном классе для другого проекта, поэтому я сразу же вставил код.
Наш веб-сервис работает под управлением UltiDev Cassini (вместо IIS), который работает под системной учетной записью.Мы получаем код ошибки для:каждый раз "указанное имя устройства недопустимо".Я также попытался выдавать себя за других пользователей в файле web.config с теми же результатами.
Диск будет отображаться просто отлично, когда я запущу свой код из консольной программы под обычной учетной записью пользователя.
Я также попытался запустить эквивалентную команду "net use" из C # с точно такими же результатами, что и WNetAddConnection.
Кто-нибудь знает, почему служба Windows или Системный пользователь не смогут сопоставлять сетевые диски?
Кто-нибудь знает обходной путь?Простое сопоставление диска при запуске системы было бы решением, но как системный / олицетворяемый пользователь может получить к нему доступ?
Ссылка на UltiDev Cassini: Конечная цель
РЕШЕНИЕ: Я настроил службу UltiDev Cassini на вход в систему под управлением администратора, и все работает.ASP .Сетевое олицетворение не должно работать так, как планировалось.
Решение
В учетной записи LOCAL_SYSTEM представлены анонимные учетные данные в сети а>. Вы можете использовать общий ресурс сети UNC для доступа к этой информации, при условии, что анонимный доступ (Все) имеет доступ к общему ресурсу.
Вы также можете установить Cassini в качестве службы Windows , которую можно настроить работать под другим пользователем.
Другие советы
Если вы используете локальную системную учетную запись, то я считаю, что она по своей сути не может получить доступ к сети [foo]. Я бы сказал, что подражание - ваш единственный жизнеспособный путь. Технически вы могли бы уменьшить контроль доступа к общему ресурсу до такой степени, что любой мог читать / писать на нем, но это приносит больше проблем, чем решений. Р>
У нас была такая же проблема. Проблема возникает из-за учетной записи, под которой выполняется код. Вы можете обойти это, как мы сделали, используя следующий класс. Вы должны сопоставить диск с тем же кодом, который вы используете для доступа / копирования файлов. Шаблон, который мы используем, всегда проверяет, подключен ли диск первым. если это так, мы отключаем его, а затем снова подключаем. если нет, мы просто подключаем его. Кажется, это проясняет проблему, которую вы описываете.
public static class NetworkDrives
{
public static bool MapDrive(string DriveLetter, string Path, string Username, string Password)
{
bool ReturnValue = false;
if(System.IO.Directory.Exists(DriveLetter + ":\\"))
{
DisconnectDrive(DriveLetter);
}
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "net.exe";
p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username;
p.Start();
p.WaitForExit();
string ErrorMessage = p.StandardError.ReadToEnd();
string OuputMessage = p.StandardOutput.ReadToEnd();
if (ErrorMessage.Length > 0)
{
throw new Exception("Error:" + ErrorMessage);
}
else
{
ReturnValue = true;
}
return ReturnValue;
}
public static bool DisconnectDrive(string DriveLetter)
{
bool ReturnValue = false;
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "net.exe";
p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE";
p.Start();
p.WaitForExit();
string ErrorMessage = p.StandardError.ReadToEnd();
string OuputMessage = p.StandardOutput.ReadToEnd();
if (ErrorMessage.Length > 0)
{
throw new Exception("Error:" + ErrorMessage);
}
else
{
ReturnValue = true;
}
return ReturnValue;
}
}
Можно ли вместо подключенного диска подключиться с помощью общего ресурса UNC? Р>
Я бы по-прежнему выдавал себя за пользователя, который имеет доступ к общему ресурсу.
На самом деле я делал это раньше, но это было ОЧЕНЬ давно - где-то в 1997 году, и Win NT 3.51 с Delphi 2
Я использую память, но я думаю, что это выглядит примерно так:Вы используете Win API:
WNetAddConnection2()
Информация о звонке: http://msdn.microsoft.com/en-us/library/aa385413 (ПРОТИВ 85).aspx
Вы можете получить сигнатуру c # из pInvoke.net: http://www.pinvoke.net/default.aspx/mpr/WNetAddConnection2.html
Примечание по конфигурации:Я думаю, что вам нужно будет настроить доменную учетную запись для службы и запустить службу с идентификатором этой учетной записи вместо локальной системы.Я думаю, что вы передаете null в качестве имени пользователя и пароля.
Ты мог бы иметь возможность запускать службу от имени локальной системы, передавая имя пользователя и пароль учетной записи домена - я не знаю, разрешен ли системной учетной записи вообще какой-либо доступ к сети.
Общая концепция, которую следует иметь в виду, состоит в том, что «отображаемые буквы дисков» являются концепцией пользователя, а не концепцией системы. Поэтому, когда Джо входит в систему Windows Computer, подключенные диски присоединяются к учетной записи пользователя Joe. Когда служба Windows работает, как правило, она запускается под учетной записью пользователя LOCAL_SYSTEM, что означает, что LOCAL_SYSTEM не знает о назначенных буквах диска Джо.
Таким образом, UNC-доступ к общим сетевым ресурсам - это тот способ, который используется при попытке доступа к любому удаленному ресурсу из службы Windows. Обратите внимание, что вы можете запустить службу Windows в контексте учетной записи пользователя 'Joe', или вы можете создать фиктивную учетную запись AD с именем что-то вроде 'MyServiceAccount' и передать эту учетную запись в UNC, или вы можете использовать Impersonation и получить Служба Windows входит на локальную рабочую станцию, используя функцию NetLogon () с дескриптором олицетворения, а затем получает доступ к UNC оттуда.
Есть много способов сделать это, но все сводится к учетным записям пользователей, связанным с подключенными дисками и доступом UNC.
Удачи, надеюсь, эта информация поможет!