C # - Карта сетевого диска из веб-службы - PullRequest
0 голосов
/ 16 сентября 2009

Мы работаем над веб-сервисом, который должен запускать сторонний процесс, взаимодействующий с подключенным сетевым диском. Поэтому мы должны подключить этот диск программно из веб-службы.

Я уже обернул WNetAddConnection2 и т. Д. В более хороший класс для другого проекта, поэтому я добавил код.

Наш веб-сервис работает под управлением UltiDev Cassini (вместо IIS), который работает под системной учетной записью. Мы получаем код ошибки для: «указанное имя устройства недействительно» каждый раз. Я также попытался выдать себя за других пользователей в файле web.config, и результаты были те же.

Диск будет нормально отображаться при запуске кода из консольной программы под учетной записью обычного пользователя.

Я также попытался выполнить эквивалентную команду «net use» из C # с теми же результатами, что и для WNetAddConnection.

Кто-нибудь знает, почему служба Windows или системный пользователь не могут подключать сетевые диски?

Кто-нибудь знает обходной путь? Было бы просто сопоставить диск при запуске системы, но как мог бы системный / олицетворенный пользователь получить к нему доступ?

Ссылка для UltiDev Cassini: UltiDev

РЕШЕНИЕ: Я установил для службы UltiDev Cassini вход в систему с правами администратора, и все работает. Олицетворение ASP .Net не должно работать, как запланировано.

Ответы [ 6 ]

2 голосов
/ 16 сентября 2009

В учетной записи LOCAL_SYSTEM представлены анонимные учетные данные в сети . Вы можете использовать сетевой ресурс UNC для доступа к этой информации, при условии, что анонимный доступ (Все) имеет доступ к общей папке.

Вы также можете установить Cassini в качестве службы Windows , которую можно настроить для запуска под другим пользователем.

2 голосов
/ 16 сентября 2009

Если вы используете локальную системную учетную запись, то я считаю, что она по своей сути не в состоянии получить доступ к сети [foo]. Я бы сказал, что подражание - ваш единственный жизнеспособный путь. Технически вы могли бы уменьшить контроль доступа к общему ресурсу до такой степени, что любой мог читать / писать на нем, но это приносит больше проблем, чем решений.

1 голос
/ 16 сентября 2009

У нас была такая же проблема. Проблема возникает из-за учетной записи, под которой выполняется код. Вы можете обойти это, как мы сделали, используя следующий класс. Вы должны сопоставить диск с тем же кодом, который вы используете для доступа / копирования файлов. Шаблон, который мы используем, всегда проверяет, подключен ли диск первым. если это так, мы отключаем его, а затем снова подключаем. если нет, мы просто подключаем его. Кажется, вы прояснили проблему, которую вы описываете.

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;
        }

    }
0 голосов
/ 22 декабря 2014

Общая концепция, которую следует иметь в виду, заключается в том, что «отображаемые буквы дисков» являются концепцией пользователя, а не концепцией системы. Поэтому, когда Джо входит в систему Windows Computer, подключенные диски присоединяются к учетной записи пользователя Joe. Когда служба Windows работает, как правило, она работает под учетной записью пользователя LOCAL_SYSTEM, что означает, что LOCAL_SYSTEM не знает о назначенных буквах диска Джо.

Таким образом, UNC-доступ к общим сетевым ресурсам - это тот способ, который используется при попытке доступа к любому удаленному ресурсу из службы Windows. Обратите внимание, что вы можете запустить службу Windows в контексте учетной записи пользователя 'Joe', или вы можете создать фиктивную учетную запись AD с именем что-то вроде 'MyServiceAccount' и передать эту учетную запись в UNC, или вы можете использовать Impersonation и получить Служба Windows входит на локальную рабочую станцию, используя функцию NetLogon () с дескриптором олицетворения, а затем получает доступ к UNC оттуда.

Есть много способов сделать это, но все сводятся к учетным записям пользователей, связанных с подключенными дисками и доступом UNC.

Удачи, надеюсь, эта информация поможет!

0 голосов
/ 16 сентября 2009

Я действительно делал это раньше, но это было ОЧЕНЬ давно, например, в 1997 году, и Win NT 3.51 с Delphi 2

Я бегу по памяти, но думаю, что-то вроде этого: Вы используете Win API:

WNetAddConnection2 ()

Информация о звонке: http://msdn.microsoft.com/en-us/library/aa385413(VS.85).aspx

Вы можете получить подпись c # от pInvoke.net: http://www.pinvoke.net/default.aspx/mpr/WNetAddConnection2.html

Примечание к конфигурации: Я думаю, что вам нужно будет настроить учетную запись домена для службы и запустить службу с идентификатором этой учетной записи вместо локальной системы. Я думаю, что вы передаете null в качестве имени пользователя и пароля.

Вы можете иметь возможность запустить службу, когда локальная система передает имя пользователя и пароль учетной записи домена - я не знаю, разрешена ли системной учетной записи какой-либо доступ к сети вообще.

0 голосов
/ 16 сентября 2009

Вместо подключенного диска, вы могли бы подключиться с помощью общего ресурса UNC?

Я бы по-прежнему выдавал себя за пользователя, который имеет доступ к общему ресурсу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...