PDA

Показать полную графическую версию : Проверка, запущено ли приложение от конкретного Пользователя


Ua-life
16-03-2015, 11:12
Добрый день. Так как у меня файловый вариант 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
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/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

Iska
16-03-2015, 15:55
В случае непустой коллекции «"SELECT * FROM Win32_Process WHERE Name = '1cv8.exe'"» — проверьте каждый из объектов, её составляющих, методом «.GetOwner()»: GetOwner method of the Win32_Process class (Windows) (https://msdn.microsoft.com/ru-ru/library/aa390460(v=vs.85).aspx) на предмет совпадения имени пользователя и домена владельца процесса с именем текущего пользователя/домена.

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

Ua-life
16-03-2015, 17:02
В случае непустой коллекции «"SELECT * FROM Win32_Process WHERE Name = '1cv8.exe'"» — проверьте каждый из объектов, её составляющих, методом «.GetOwner()»: GetOwner method of the Win32_Process class (Windows) (https://msdn.microsoft.com/ru-ru/library/aa390460(v=vs.85).aspx) на предмет совпадения имени пользователя и домена владельца процесса с именем текущего пользователя/домена.

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




© OSzone.net 2001-2012