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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Хочу все знать (http://forum.oszone.net/forumdisplay.php?f=23)
-   -   Как запретить запуск двух копий 1С8 (http://forum.oszone.net/showthread.php?t=346494)

ee0066 22-09-2020 11:03 2934589

Как запретить запуск двух копий 1С8
 
Всем привет! У меня такой вопрос, казалось бы его уже тут разжевывали сто раз.

Как запретить запуск двух копий 1С8? Тут на форуме нашел тему и получил ответ на свой вопрос, но не до конца. Так как пользователи работают по RDP с 1С то нужна проверка.

Есть такой код который отлично работает под локальным пользователем:

Код:

bitVersion =  "'64'"
    strPath =  "1cv8\8.3.10.2252\bin"
 strProcess =  "1cv8c.exe"
 runProcess = "'1cv8c.exe'"
strcomputer = "."

set objwmiservice = getobject("winmgmts:" _
    & "{impersonationlevel=impersonate}!\\" _
    & strcomputer & "\root\cimv2")

set colprocesses = objwmiservice.execquery( _
    "select name from win32_process " _
    & "where name = " & runProcess)

if colprocesses.count = 0 then
  set objshell = wscript.createobject("wscript.shell")
  set objenv = objshell.environment("process")
      If bitVersion = "'64'" Then
        ProgramFilesPath = "%ProgramFiles%"
      Else
        ProgramFilesPath = "%ProgramFiles(x86)%"
      End If
    objshell.run """" + ProgramFilesPath + "\" + strPath + "\" + strProcess + ""
else
  msgbox "Копия программы уже запущена. ", 48, "Внимание"
end if

Так же есть код:
Код:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _
    "Select Name From Win32_Process " _
    & "Where Name = '1cv8.exe'")

Set objShell = Wscript.CreateObject("Wscript.Shell")
Set objEnv = objShell.Environment("Process")
strCurrentUser = UCase(objEnv("UserDomain") & "\" & objEnv("UserName"))

For Each objProcess in colProcesses
  If objProcess.GetOwner(strUser, strDomain) = 0 Then
    If UCase(strDomain & "\" & strUser) = strCurrentUser Then
      MsgBox "Копия программы уже запущена. ", 48, "Внимание"
      Wscript.Quit
    End If
  End If
Next
objShell.Run """" + objEnv("ProgramFiles") + "\1cv81\bin\1cv8.exe"""

Тот и тот код vbs мне нравятся но связи с тем что я полный ноль в vbs помогите решить проблему. Суть проблемы такова. Я использую второй код, все бы ничего но тут проблема с путем к 1С он ProgramFiles а мне нужно ProgramFiles (х86) казалось ничего не обычного пропиши путь и будет тебе счастье. Прописал и не работает. Я думаю из-за того что в имени пробел и его нужно как-то экранировать либо прописовать путь через переменную как в первом примере где проверяться разрядность и пути к 1С. Помогите пожалуйста исправить второй код или первый для работы под RDP на текушего пользователя. Спасибо. Поиском пользовался ничего не нашел так же читал про vbs но реально нет времени его сейчас изучать.

NickM 22-09-2020 11:31 2934592

Цитата:

Цитата ee0066
Я думаю из-за того что в имени пробел и его нужно как-то экранировать либо прописовать путь через переменную как в первом примере где проверяться разрядность и пути к 1С. »

Цитата:

Цитата ee0066
objEnv() »

Возвращает переменные окружения Windows, в Вашем случае нужно вернуть %ProgramFiles(x86)%, без пробела.

Код:

objShell.Run """" + objEnv("ProgramFiles(x86)") + "\1cv81\bin\1cv8.exe"""

ee0066 22-09-2020 12:01 2934593

Написал как вы посоветовали чудо не случилось так же не находит путь и не запускает 1С

Написал как вы посоветовали чудо не случилось так же не находит путь и не запускает 1С %ProgramFiles(x86)%

Petya V4sechkin 22-09-2020 12:17 2934596

ee0066, можете тупо вписать свой путь:
Код:

objShell.Run """полный путь к EXE-файлу"""

ee0066 22-09-2020 12:31 2934597

Petya V4sechkin,
Код:

objShell.Run("""c:\ProgramFiles (x86)\1cv8\8.3.8.1675\bin\1cv8.exe""")
Ошибка: Не удается найти указанный файл

Спасибо большое NickM, ответ на вопрос получил и выкладываю рабочий код.

Код:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _
    "Select Name From Win32_Process " _
    & "Where Name = '1cv8.exe'")

Set objShell = Wscript.CreateObject("Wscript.Shell")
Set objEnv = objShell.Environment("Process")
strCurrentUser = UCase(objEnv("UserDomain") & "\" & objEnv("UserName"))

For Each objProcess in colProcesses
  If objProcess.GetOwner(strUser, strDomain) = 0 Then
    If UCase(strDomain & "\" & strUser) = strCurrentUser Then
      MsgBox "Копия программы уже запущена. ", 48, "Внимание"
      Wscript.Quit
    End If
  End If
Next

objShell.Run """" + objEnv("ProgramFiles(x86)") + "\1cv8\8.3.8.1675\bin\1cv8.exe"""



Время: 08:01.

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