2009-06-04 7 views
8

Когда я запускаю службу в качестве LocalSystem учетной записи, можно использовать следующие коды для запуска программы с графическим интерфейсом под текущей учетной записи входа в систему:Как запустить программу GUI в службе Windows?

WTSGetActiveConsoleSessionId-> WTSQueryUserToken-> CreateProcessAsUser

Однако, когда я запускаю службу как мой личный аккаунт, программа GUI НЕ будет отображаться. Однако я вижу это в диспетчере задач.

Что делать, чтобы запустить программу GUI, когда служба работает под моей личной учетной записью?

ответ

2

John and jdigital оба справа. По моему мнению, услуги обычно могут иметь либо доступ к рабочему столу (вы должны использовать локальную систему), либо сетевой доступ (вам нужно указать учетную запись для запуска под ней).

Вам понадобится два разделить приложение на два - один, чтобы взаимодействовать с рабочим столом, а другой - по сети. Затем две части могут разговаривать друг с другом, чтобы передать информацию конечному пользователю.

+0

Я планирую запустить службу по моей учетной записи, чтобы она могла получить доступ к локальному и сетевому ресурсу. «будет говорить с ним, чтобы получать информацию и контролировать ее. Но странная вещь, как я писал ниже, заключается в том, что файлы, которые она создала, принадлежат« администратору », а не моей учетной записи (Vista OS). Это меня смущает. – trudger

0

Все это связано с разрешениями, которые я считаю.

Локальная система обладает достаточными полномочиями для олицетворения текущего пользователя, но в вашей учетной записи нет.

Вам нужно выяснить способ расширения прав доступа к службе, либо путем запроса учетных данных, либо подключения к вспомогательной службе, которая работает как LocalSystem.

(Почему вы хотите работать с вашей учетной записью вместо LocalSystem?)

Я уверен, что есть гораздо более подробные ответы, которые имеют дело с в и оформления сделать это, но на высоком уровне I подумайте, что это проблема.

+0

Спасибо John, есть две причины: 1) Локальная система не имеет права доступа к общим общим папкам в Vista 2) Все файлы, созданные службой LocalSystem, принадлежат «администратору». Мне нужны файлы, принадлежащие моей личной учетной записи. – trudger

0

Возможно, вы работаете на неправильной оконной станции или на рабочем столе. См. Это Microsoft reference on Window Stations and Desktops.

+0

Служба работает на моей личной учетной записи, и я вхожу в систему. Я только что проверил, программа работает, но не отображается. – trudger

+0

Если вы посмотрите на ссылку, вы увидите, что это не проблема разрешений. Microsoft использует оконные станции и настольные компьютеры для обеспечения различных уровней изоляции процессов. Есть способы обойти это, например SetProcessWindowStation и SwitchDesktop, но разделение приложения на две части - это обычно рекомендуемое решение. – jdigital

+0

Да, режим клиент/сервер - это то, что я планирую сделать. Это решит такую ​​проблему.Но странно, что, хотя служба работает на моей личной учетной записи, файлы, которые она создала, принадлежат «администратору», а не моей учетной записи. Вы можете проверить это свойство в «Свойства файла -> Деталь -> Владелец». Разве это не принадлежит моей учетной записи? – trudger

0

Я считаю, что то, что вы пытаетесь сделать, может считаться уязвимостью безопасности. В некоторых случаях это также маловероятно. Я думаю, что jdigital прав в том, что он связан с окнами и пытается получить доступ к текущей пользовательской оконной станции, и это рабочий стол. Это сильно запутывается, когда вы находитесь под сервером терминальных служб, где есть несколько текущих оконных станций. Microsoft действительно не хочет, чтобы вы делали то, что хотите, и с каждым выпуском окон они становятся все сложнее.

Я думаю, что лучше всего решить проблему под другим углом и просто создать приложение GUI, которое пользователь запускает (manaully или автоматически при входе в систему), и он разговаривает с вашим сервисом.

+0

Если это так, пользователь не получит уведомление, если он закрыл приложение GUI. Но, похоже, у меня нет другого выбора. :( – trudger

+0

@trudger: Нет. Пользователь также не получит уведомления, если они встанут и уйдут от компьютера, но это не значит, что вы отправляете наручники с вашим программным обеспечением. –

+0

Да, это делает чувства. использовать канал для связи между графическим интерфейсом и сервисом.Может быть, я могу также буферизовать эти события и показывать их пользователям при входе в систему. – trudger