Eugie » 03 мар 2004, 14:11
Опять немного не то... надо определить, какому пользователю принадлежит десктоп, и принадлежит ли он кому-нубудь.
Более конкретно, процессу 'yyy' надо знать, может ли процесс, запущенный от пользователя 'xxx', рисовать чего-нибудь на экране. Процесс 'yyy' запускается через шедулер от пользователя 'xxx'.
Absurd, вопрос несколько отклонился от первоначального, однако
В WinNT/2000/XP есть специальные объекты для безопасного разделения доступа к системным ресурсам процессов, запущенных под разными логинами (в основном, сервисов): window stations
(терминалы) и desktops (рабочие столы). В рамках ОС могут существовать одновременно несколько терминалов, но только один из них - интерактивный - является видимым и именно с ним
взаимодействует пользователь. У каждого терминала может быть одновременно несколько десктопов, но
только один из них - активный - является видимым и служит для взаимодействия с пользователем. При создании процесса ОС назначает ему терминал, при этом сам процесс также может переназначить себе терминал. По умолчанию, доступ к активному десктопу интерактивного терминала получают только процессы, запущенные под логином текущего пользователя и сервисы под учетной записью LocalSystem. Процессам, запущенным под другими логинами, по умолчанию назначаются неинтерактивные терминалы, но при выполнении некоторых условий они также могут получит доступ к интерактивному.
Теперь от теории к практике. Task Scheduler как раз поступает в соответствии с умолчаниями: если процесс запускается под текущим логоном, ему назначается интерактивный терминал, а если под другим логоном - неинтерактивный. Поэтому в простейшем случае, если сам процесс не переназначил себе терминал и десктоп, достаточно узнать логин, под которым он запущен. В противном случае нужно непосредственно получать текущий десктоп в контексте интересующего процесса и сравнивать с десктопом интерактивного процесса.
К сожалению, простого способа получить десктоп/терминал нетекущего процесса WinAPI не предоставляет. Я могу предложить такие варианты: создать тред в контексте интересующего процесса, 1) и уже для нее использовать GetThreadDesktop, 2) либо в ThreadFunc вызывать GetProcessWindowStation.
[quote]
Опять немного не то... надо определить, какому пользователю принадлежит десктоп, и принадлежит ли он кому-нубудь.
Более конкретно, процессу 'yyy' надо знать, может ли процесс, запущенный от пользователя 'xxx', рисовать чего-нибудь на экране. Процесс 'yyy' запускается через шедулер от пользователя 'xxx'.
[/quote]
[b]Absurd[/b], вопрос несколько отклонился от первоначального, однако :)
В WinNT/2000/XP есть специальные объекты для безопасного разделения доступа к системным ресурсам процессов, запущенных под разными логинами (в основном, сервисов): window stations
(терминалы) и desktops (рабочие столы). В рамках ОС могут существовать одновременно несколько терминалов, но только один из них - интерактивный - является видимым и именно с ним
взаимодействует пользователь. У каждого терминала может быть одновременно несколько десктопов, но
только один из них - активный - является видимым и служит для взаимодействия с пользователем. При создании процесса ОС назначает ему терминал, при этом сам процесс также может переназначить себе терминал. По умолчанию, доступ к активному десктопу интерактивного терминала получают только процессы, запущенные под логином текущего пользователя и сервисы под учетной записью LocalSystem. Процессам, запущенным под другими логинами, по умолчанию назначаются неинтерактивные терминалы, но при выполнении некоторых условий они также могут получит доступ к интерактивному.
Теперь от теории к практике. Task Scheduler как раз поступает в соответствии с умолчаниями: если процесс запускается под текущим логоном, ему назначается интерактивный терминал, а если под другим логоном - неинтерактивный. Поэтому в простейшем случае, если сам процесс не переназначил себе терминал и десктоп, достаточно узнать логин, под которым он запущен. В противном случае нужно непосредственно получать текущий десктоп в контексте интересующего процесса и сравнивать с десктопом интерактивного процесса.
К сожалению, простого способа получить десктоп/терминал нетекущего процесса WinAPI не предоставляет. Я могу предложить такие варианты: создать тред в контексте интересующего процесса, 1) и уже для нее использовать GetThreadDesktop, 2) либо в ThreadFunc вызывать GetProcessWindowStation.