У меня есть С# exe, который нужно запустить с помощью WMI и получить доступ к сетевому ресурсу. Однако, когда я получаю доступ к ресурсу, я получаю UnauthorizedAccessException. Если я запускаю exe напрямую, доступ к нему доступен. Я использую одну и ту же учетную запись пользователя в обоих случаях.
В моем приложении есть две части: клиент GUI, который работает на локальном ПК и бэкэнд-процесс, который работает на удаленном ПК. Когда клиент должен подключиться к бэкэнд, он сначала запускает удаленный процесс с использованием WMI (код воспроизводится ниже). Удаленный процесс выполняет ряд действий, включая доступ к сетевому ресурсу с помощью Directory.GetDirectories() и отчёт для клиента.
Когда удаленный процесс запускается автоматически клиентом с использованием WMI, он не может получить доступ к сетевому ресурсу. Однако, если я подключаюсь к удаленному компьютеру с помощью удаленного рабочего стола и запускаю серверный процесс вручную, доступ к сетевому ресурсу успешно завершается.
Пользователь, указанный в вызове WMI, и пользователь, зарегистрированный для сеанса удаленного рабочего стола, одинаковый, поэтому разрешения должны быть одинаковыми, не так ли?
В записи MSDN для Directory.Exists() указано, что "метод Exists не выполняет сетевую проверку подлинности. Если вы запрашиваете существующий сетевой ресурс без предварительной аутентификации, метод Exists возвращает 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);
}