Имя: Пароль:
1C
1С v8
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 https://youtu.be/bFDDJqToPTM думаю поможет разобраться с вариантом №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С работать не будет