Сетевая Аутентификация при выполнении exe от WMI

У меня есть C# exe, который должен быть выполнен с помощью WMI и получить доступ к сетевому ресурсу. Однако, когда я получаю доступ к доле, я получаю UnauthorizedAccessException. Если я выполняю exe непосредственно, доля доступна. Я использую ту же учетную запись пользователя в обоих случаях.

Существует две части к моему приложению, клиент GUI, который работает на локальном ПК и процессе бэкенда, который работает на удаленном ПК. Когда клиент должен соединиться с бэкендом, он сначала запускает удаленный процесс с помощью WMI (код, воспроизведенный ниже). Удаленный процесс делает много вещей включая доступ к Каталогу использования сетевого ресурса. GetDirectories () и сообщает клиенту.

Когда удаленный процесс запускается автоматически клиентом, использующим WMI, он не может получить доступ к сетевому ресурсу. Однако, если я соединяюсь с удаленной машиной с помощью Удаленного рабочего стола и вручную запускаю процесс бэкенда, доступ к сетевому ресурсу успешно выполняется.

Пользователь specifed в вызове WMI и пользователе, зарегистрированном для сессии Удаленного рабочего стола, является тем же, таким образом, полномочия должны быть тем же, не так ли?

Я вижу в записи MSDN для Каталога. Существует (), это указывает, "Существует, метод не выполняет сетевую аутентификацию. Если Вы запрашиваете существующий сетевой ресурс без того, чтобы быть предварительно аутентифицируемым, Существует, метод возвратит false". Я предполагаю, что это связано? Как я могу удостовериться, что пользователь аутентифицируется правильно на сессии WMI?

ConnectionOptions opts = new ConnectionOptions();

opts.Username = username;
opts.Password = password;

ManagementPath path = new ManagementPath(string.Format("\\\\{0}\\root\\cimv2:Win32_Process", remoteHost));

ManagementScope scope = new ManagementScope(path, opts);

scope.Connect();

ObjectGetOptions getOpts = new ObjectGetOptions();
using (ManagementClass mngClass = new ManagementClass(scope, path, getOpts))
{
    ManagementBaseObject inParams = mngClass.GetMethodParameters("Create");
    inParams["CommandLine"] = commandLine;
    ManagementBaseObject outParams = mngClass.InvokeMethod("Create", inParams, null);
}

11
задан Louis Rhys 17 May 2012 в 03:21
поделиться

1 ответ

Перейдя по ссылке, предложенной Исаламоном выше (спасибо), я последовал совету Джестро и переписал его с помощью psexec.exe (который можно загрузить с http : //technet.microsoft.com/en-us/sysinternals/bb897553.aspx ) вместо WMI. Кажется, что делать это таким образом - непросто, но, похоже, это работает.

Новый код для тех, кто сталкивается с подобными проблемами:

Process proc = new Process();
proc.StartInfo.FileName = "PsExec.exe";
proc.StartInfo.Arguments = string.Format("\\\\{0} -d -u {1}\\{2} -p {3} {4}",
                                         remoteHost,
                                         domain,
                                         username,
                                         password,
                                         commandLine);
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
2
ответ дан 3 December 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: