У меня есть 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);
}
Перейдя по ссылке, предложенной Исаламоном выше (спасибо), я последовал совету Джестро и переписал его с помощью 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();