|
WQL запрос или средствами 1с узнать "запущена ли у юзера это программа"? |
☑ |
0
Guerro
23.08.19
✎
09:03
|
Менеджеры пользуются решением от EasyCeiling, и хочется поставить "защиту от дурака" в виде запрета запуска второй копии программы, много статей нашел, но решения не подходя, примеры:
1)Выборка по процессам, но тут не нельзя соотношение сделать user=его процесс. он просто выгружает все процессы windows.
locator= Новый COMОбъект("wbemscripting.swbemlocator");
service=locator.connectserver();
oP=service.execquery("select * from Win32_Process");
для каждого p из oP цикл
Если p.Name="EasyCeiling.exe" тогда
Сообщить(p.Name);
КонецЕсли;
КонецЦикла;
2)с помощью cmd проверить запущена ли программа, но тут нет возможности запуска файла с помощью программы(как видите программа просто запускается), а нужно чтобы открывался файл, с помощью программы.
@Echo off
chcp 1251 >nul
tasklist /FI "USERNAME eq admin" /FI "IMAGENAME eq EasyCeiling.exe" | find /i "EasyCeiling.exe"
if %errorlevel%==1 (start "" "F:\Program Files (x86)\EasyCeiling\EasyCeiling.exe") else (msg user "EasyCeiling уже запущен")
Как решить этот вопрос? Помогите, пожалуйста
|
|
1
NorthWind
23.08.19
✎
09:05
|
можно. GetOwner метод у процесса - получает юзера
|
|
2
NorthWind
23.08.19
✎
09:06
|
|
|
3
NorthWind
23.08.19
✎
09:08
|
но как я понимаю, этот метод небыстрый. Поэтому вызывать его надо только для тех процессов, которые уже совпали по названию. Не для всех.
|
|
4
SSSSS_AAAAA
23.08.19
✎
09:10
|
(0) В общем-то, любой запущенный ехе захватывается эксклюзивно. Намёк понят?
|
|
5
Guerro
23.08.19
✎
09:11
|
(4) ноу
|
|
6
Guerro
23.08.19
✎
09:11
|
(4) цикл по exe уже есть, но UserName не вытягивается
|
|
7
TormozIT
гуру
23.08.19
✎
09:30
|
Консоль запросов с поддержкой WQL думаю поможет разобраться с вариантом №1.
У процесса есть SessionId.
Вот скрипт на powerShell проверяющий наличие терминальной сессии для заданного имени пользователя.
The following PowerShell example checks for remote session open for a specified user.
PowerShell
$user = "<user name>"
$servers = gci servers.txt
foreach ($server in $servers){
$logons = gwmi win32_loggedonuser -computername $server
foreach ($logon in $logons){
if ($logon.antecedent -match $user){
$logonid = $logon.dependent.split("=")[1]
$session =gwmi win32_logonsession |? {$_.logonid -match $logonid}
if ($session.logontype -eq "10"){
Write-host "You have an active Terminal Server session on server $($server)"
}
}
|
|
8
TormozIT
гуру
23.08.19
✎
09:38
|
(7) +
Тебе нужны таблицы WMI
Win32_Process
Win32_SessionProcess
Win32_LoggedOnUser
|
|
9
Guerro
23.08.19
✎
09:41
|
(7) (8) сейчас попробую реализовать
|
|
10
Guerro
23.08.19
✎
10:05
|
Все еще проще, решил проблему тем, что в ЗапуститьПриложение(ДанныеДляЗапуска,,Истина), указал 3-ий параметр и пока не закроет, 1С работать не будет
|
|
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший