Откройте браузер по умолчанию как обычный пользователь (C ++) - PullRequest
3 голосов
/ 22 февраля 2010

В настоящее время я использую ShellExecute «open», чтобы открыть URL-адрес в браузере пользователя, но в Win7 и Vista возникают некоторые проблемы, поскольку программа работает с повышенными правами как служба.

Когда ShellExecute открывает браузер, он, кажется, читает профиль «Local Admin» вместо пользователя. Так, например, если пользователь на клавиатуре имеет Firefox в качестве браузера по умолчанию, он может открыть IE (что по умолчанию для администратора).

Я знаю, что глагол "runas" можно использовать для поднятия, но как вы делаете это наоборот? Есть ли способ открыть URL-адрес в браузере по умолчанию на рабочем столе обычного пользователя из службы?

Ответы [ 3 ]

4 голосов
/ 22 февраля 2010

ShellExecute выполнит программу в контексте того же сеанса и того же пользователя, что и выполняемый вами процесс.

Если вы хотите использовать другой сеансовый или пользовательский токен, вы можете использовать CreateProcessAsUser Win32 API.

Существует несколько способов получения токена пользователя, например, вы можете вызвать Win32 API:

  • LogonUser , если вы знаете имя пользователя и пароль
  • WTSQueryUserToken для любого идентификатора сеанса.
  • OpenProcessToken если у вас есть другой дескриптор процесса
2 голосов
/ 13 октября 2010

Через некоторое время тестирования лучший способ определить браузер по умолчанию следующий:

ПРИМЕЧАНИЕ: это странно, но это правда ... Нечего сказать, что приложение является приложением по умолчанию для какой-то тип файла или веб-протокол, например «http». Что важно для определения дефолта веб-браузер - это то, что зарегистрировано в пункте меню «Пуск» (см. раздел «Рег» ниже). Так что забудьте все HKCR \ http, HKCU \ Software \ Classes \ http, HKLM \ Software \ Classes \ http и их друзей.

  1. чтение из "HKEY_CURRENT_USER \ Software \ Clients \ StartMenuInternet"
  2. чтение командной строки из "HKEY_LOCAL_MACHINE \ Software \ Clients \ StartMenuInternet \\ shell \ open \ command"
  3. усечь командную строку после ".exe"

Конечно, сначала нужно выдать себя за зарегистрированного пользователя.

Если это решение не работает (как с w2k), используйте обработчик для протокола http.

Чтобы фактически запустить браузер по умолчанию из службы, мы используем дополнительный процесс, который находится внутри службы с использованием пользовательского контекста, вошедшего в систему. Этот процесс запускает приведенную выше командную строку (используя ShellExecute на платформах> = Vista). Обязательно используйте тот же уровень целостности (средний), что и у пользователя по умолчанию (иначе IE не будет работать, потому что он использует DDE).

НТН.

0 голосов
/ 22 февраля 2010

У Аарона Маргозиса есть пример из семи этапов нативного кода на http://blogs.msdn.com/aaron_margosis/archive/2009/06/06/faq-how-do-i-start-a-program-as-the-desktop-user-from-an-elevated-app.aspx. Не поможет вам от вашего обслуживания, если это то, что у вас есть - я согласен, что ваш сервис не должен пытаться запустить приложение как вошел в систему пользователя, тем более что его может и не быть.

...