Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Проверка, запущено ли приложение от конкретного Пользователя (http://forum.oszone.net/showthread.php?t=296972)

Ua-life 16-03-2015 11:12 2483265

Проверка, запущено ли приложение от конкретного Пользователя
 
Добрый день. Так как у меня файловый вариант 1С мне приходиться держать одну сессию данного приложения открыто. Очень хорошо с этим справлялся вот этот скрипт
[code][/Option Explicit

Const Above_Normal = 32768

Dim objSWbemObjectEx
Dim lngProcessID


With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
If .ExecQuery("SELECT * FROM Win32_Process WHERE Name = '1cv8.exe'").Count = 0 Then
Set objSWbemObjectEx = .Get("Win32_ProcessStartup")

objSWbemObjectEx.PriorityClass = Above_Normal

' Create method of the Win32_Process class (Windows) (http://msdn.microsoft.com/en-us/library/aa389388(v=vs.85).aspx)
If .Get("Win32_Process").Create( _
"""C:\Program Files (x86)\1cv82\8.2.16.352\bin\1cv8.exe""", _
"C:\Program Files (x86)\1cv82\8.2.16.352\bin", _
objSWbemObjectEx, _
lngProcessID _
) <> 0 Then
WScript.Echo "Can't start process [""%Program Files (x86)\1cv82\8.2.16.352\bin""."
End If

Set objSWbemObjectEx = Nothing
End If
End With

WScript.Quit 0
CODE]
но беда в том, что у меня терминальный сервер и если один из пользователей имеет запущенный процесс 1С то данный скрипт не выполняется.
Так как в данных скриптах я не силен прошу подсказать, что добавить в скрипт или переделать, что бы проверялся на запущенный процесс 1С только от Имени Администратора и если нет то запустить. Спасибо.

Ua-life 16-03-2015 15:45 2483380

Const Above_Normal = 32768

Dim objSWbemObjectEx
Dim lngProcessID
Dim colProcesses
Dim bUser
Dim strNameOfUser
Dim UserName
UserName = CreateObject("WScript.Network").UserName

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
Set colProcesses = .ExecQuery("SELECT * FROM Win32_Process WHERE Name = '1cv8.exe'")
Set objSWbemObjectEx = .Get("Win32_ProcessStartup")
bUser = False

For Each objProcess in colProcesses
Return = objProcess.GetOwner(strNameOfUser)
If Return = 0 Then
If strNameOfUser = UserName Then
bUser = True
End If
End If
Next

If Not bUser Then
objSWbemObjectEx.PriorityClass = Above_Normal

' Create method of the Win32_Process class (Windows) (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx)
If .Get("Win32_Process").Create( _
"""C:\Program Files (x86)\1cv82\8.2.16.352\bin\1cv8.exe""", _
"C:\Program Files (x86)\1cv82\8.2.16.352\bin", _
objSWbemObjectEx, _
lngProcessID _
) <> 0 Then
WScript.Echo "Can't start process [""%Program Files (x86)\1cv82\8.2.16.352\bin""."
End If

Set objSWbemObjectEx = Nothing
End If
End With

WScript.Quit 0

Iska 16-03-2015 15:55 2483383

В случае непустой коллекции «"SELECT * FROM Win32_Process WHERE Name = '1cv8.exe'"» — проверьте каждый из объектов, её составляющих, методом «.GetOwner()»: GetOwner method of the Win32_Process class (Windows) на предмет совпадения имени пользователя и домена владельца процесса с именем текущего пользователя/домена.

Update: ага, вижу, уже сами нашли ;). Только проверяйте ещё и совпадение домена — второй параметр метода «.GetOwner()».

Ua-life 16-03-2015 17:02 2483432

Цитата:

Цитата Iska (Сообщение 2483383)
В случае непустой коллекции «"SELECT * FROM Win32_Process WHERE Name = '1cv8.exe'"» — проверьте каждый из объектов, её составляющих, методом «.GetOwner()»: GetOwner method of the Win32_Process class (Windows) на предмет совпадения имени пользователя и домена владельца процесса с именем текущего пользователя/домена.

Update: ага, вижу, уже сами нашли ;). Только проверяйте ещё и совпадение домена — второй параметр метода «.GetOwner()».

Понял, спасибо


Время: 18:01.

Время: 18:01.
© OSzone.net 2001-