Process.start() выдает ошибку при попытке запуска от имени администратора

У меня есть приложение, разработанное в vb.net, которому нужны права администратора. Я установил level = "requireAdministrator" в манифесте приложения. Мой клиент хочет, чтобы это приложение запускалось локальным пользователем из-за некоторых ограничений в их организации. Поэтому я создал еще одно приложение «Launcher», которое фактически сохранит учетные данные администратора в зашифрованном формате и будет использовать сохраненные учетные данные для запуска «исходного» приложения.

Все работает нормально, если я использую учетную запись «Администратор» (встроенная учетная запись). Но если я использую учетные данные вручную созданной учетной записи администратора — строка process.start() выдает ошибку «Запрошенная операция требует повышения прав» Я действительно не мог определить разницу между встроенным администратором и созданным вручную учетная запись администратора. Я подтвердил, что оба пользователя (встроенные и созданные вручную) являются членами администраторов и домашних пользователей. Я перепробовал все возможности, создав разных пользователей с разными группами пользователей и даже с разными ОС (Windows 7 и Windows 10 — как 32-, так и 64-разрядные версии) — но все работает так же, как описано выше. Есть ли что-то, что я должен изменить в своем коде?

     Dim psi As New System.Diagnostics.ProcessStartInfo()
        psi.FileName = (AppToStart)
        psi.RedirectStandardError = True
        psi.RedirectStandardOutput = True
        psi.CreateNoWindow = True
        psi.UseShellExecute = False
        psi.UserName = TbUser.Text
        psi.Password = ConvertToSecureString(TbPass.Text)
        psi.Domain = ""
        Dim p As Process = Process.Start(psi)

Дополнительная информация: здесь я запускаю это приложение «Launcher» как обычный пользователь (не администратор), и приложение работает хорошо, и оно действительно повышает привилегии, если

TbUser.Text = «Администратор» и TbPass.Text = 123 (пароль администратора).

Но это не повышение привилегий, если

TbUser.Text = «Adminuser» (который также является администратором, принадлежит к той же группе «Администраторы») и TbPass.Text = 321 (пароль для Adminuser).


person MaliCMT    schedule 02.05.2016    source источник
comment
Возможный дубликат Повышение привилегий не работает с UseShellExecute=false   -  person GSerg    schedule 02.05.2016


Ответы (1)


К сожалению, вы не можете этого сделать, и вот почему...

В основном verb не распознается, когда psi.UseShellExecute = False, это должно быть psi.UseShellExecute = True. Вы делаете это, пытаясь использовать runas в качестве повышенного разрешения.

В вашей ситуации вы бы не использовали verb = runas, убедитесь, что приложение уже запущено с правильными разрешениями.

Дополнительные сведения о повышении привилегий см. здесь , Ганс Пассант сказал, что лучше...

person zaggler    schedule 02.05.2016
comment
@MaliCMT: В дополнение к этому вы можете создать фоновое приложение, которое вы запускаете с повышенными привилегиями. Ваше фоновое приложение, в свою очередь, запустит нужный вам процесс с перенаправленным выводом, а затем фоновое приложение закроется. Теперь вам просто нужно найти нужный процесс, получив идентификатор из фонового приложения или просто выполнив поиск по имени. - person Visual Vincent; 02.05.2016
comment
@zaggler Ты прав. На самом деле я поставил .verb = runas как часть тестирования различных возможностей и забыл удалить его из кода при публикации. Я удалил строку. Спасибо за ваш отзыв. К сожалению, ваш ответ не ответил на мой вопрос. Я сделал свой вопрос немного более ясным. - person MaliCMT; 02.05.2016