none
Проверка, запущено ли приложение от конкретного Пользователя RRS feed

  • Вопрос

  • Добрый день. Так как у меня файловый вариант 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С только от Имени Администратора и если нет то запустить. Спасибо.
    16 марта 2015 г. 8:29

Ответы

  • UserName = "mytest" - заменить на имя пользователя

    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


    • Изменено KazunEditor 16 марта 2015 г. 12:19
    • Предложено в качестве ответа Svolotch 16 марта 2015 г. 12:28
    • Помечено в качестве ответа Gigaline 16 марта 2015 г. 12:28
    16 марта 2015 г. 12:02
    Отвечающий

Все ответы

  • UserName = "mytest" - заменить на имя пользователя

    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


    • Изменено KazunEditor 16 марта 2015 г. 12:19
    • Предложено в качестве ответа Svolotch 16 марта 2015 г. 12:28
    • Помечено в качестве ответа Gigaline 16 марта 2015 г. 12:28
    16 марта 2015 г. 12:02
    Отвечающий
  • я вам ОЧЕНЬ благодарен но есть нюанс, постоянно запускается новый процесс 1С, а мне если уже запущен процесс под конкретным пользователем то его больше запускать не нужно, что в этом случаи подскажите?

    Заранее очень благодарен!

    16 марта 2015 г. 12:14
  • Если не меняете UserName = "mytest" , то процесс будет запускаться постояно, т.к. указан неверно. Для определения автоматом текущего пользователя.

    Строку

    UserName = "mytest"

    заменить на

    UserName = CreateObject("WScript.Network").UserName

    16 марта 2015 г. 12:19
    Отвечающий
  • Если не меняете UserName = "mytest" , то процесс будет запускаться постояно, т.к. указан неверно. Для определения автоматом текущего пользователя.

    Строку

    UserName = "mytest"

    заменить на

    UserName = CreateObject("WScript.Network").UserName

    а как понять " не меняете"?! Я например подставил UserName = "Администратор"

    или я ошибаюсь?)

    16 марта 2015 г. 12:21
  • все супер, так как и хотел

    изменил

    UserName = CreateObject("WScript.Network").UserName

    все работает прекрасно, я Вам очень признателен. Спасибо от души!

    16 марта 2015 г. 12:24
  • UserName = CreateObject("WScript.Network").UserName

    считывает имя того от кого запустился скрипт (и в дальнейшем идет проверка процесса в таким владельцем)

    если когото конкретно нужно указать то

    UserName = "Администратор"

    (только тут большие маленькие буквы могут ролять)

    16 марта 2015 г. 12:27
  • понял, буду знать, спасибо еще раз
    16 марта 2015 г. 12:28