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