none
Deploy через sccm 1c. RRS feed

  • Вопрос

  • Всем Привет.

    задача деплоить новую версию 1с на пк ( около 400 штук), но деплоить нужно на те машины, на которых стоит определенная версия 1с.

    делаю отдельную коллекцию get запросом.

    вот то,что у меня получилось..

    select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System  INNER JOIN SMS_G_System_INSTALLED_SOFTWARE ON SMS_G_System_INSTALLED_SOFTWARE.ResourceID = SMS_R_System.ResourceId   WHERE    SMS_G_System_INSTALLED_SOFTWARE.ProductName LIKE "%8.3.10.2299%"

    увы этим запросом, он показывает коллекцию пк на которых стоят любые версии 1с.

    Подскажите , что можно поправить, что бы Sccm собрал коллекцию устройств где стоит определенная версия? 




    • Изменено Dedman2k3 26 сентября 2018 г. 14:04
    26 сентября 2018 г. 14:03

Ответы

  • Прошу прощения. Недопонял, сейчас исправим. 

    Попробуйте так:

    Select distinct SMS_R_SYSTEM.ResourceID  from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.resourceid  = SMS_R_System.resourceid where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = '1С Предприятие' and SMS_G_System_ADD_REMOVE_PROGRAMS.Version = '8.3.10.2299'

    Так же можно оббежать те машины что в онлайне используя CMPivot. Там есть тип "Installed Software" там можно отсеять по версии и там же на основе результата сделать коллекцию. Но это запрос напрямую к машинам будет а не в БД, Т.е только к тем что в онлайне.

    • Предложено в качестве ответа Alexander RusinovModerator 26 сентября 2018 г. 18:58
    • Изменено Демин Илья 26 сентября 2018 г. 19:09
    • Отменено предложение в качестве ответа Dedman2k3 27 сентября 2018 г. 8:16
    • Помечено в качестве ответа Dedman2k3 1 октября 2018 г. 12:31
    26 сентября 2018 г. 16:46

Все ответы

  • Добрый день!

    Попробуйте:

    select distinct SMS_R_System.Name, SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName, SMS_G_System_ADD_REMOVE_PROGRAMS.Version from  SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like "%Имя того что ищете%" 

    Если нужно собирать определенной битности например х64 тогда можно так попробовать:

    select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System where SMS_R_System.ResourceId in (select SMS_R_System.ResourceID from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS_64 on SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName like "%Имя того что ищете%")


    26 сентября 2018 г. 14:22
  • вот это %Имя того что ищете% откуда брать?  это имя?  если брать имя  из панели управления\ программы\ программы и компоненты\ удаление или изменение программы 

    то там все версии 1с отображаются как "1С:предприятие 8"

    так, что этот вариант наверно не подойдет...

    26 сентября 2018 г. 15:56
  • запустите на одной из машин в PowerShell (локально или удаленно - по вкусу) :

    get-wmiobject win32_product -computername "Имя узла с 1с" | select name

    Это имя и используйте


    26 сентября 2018 г. 16:39
  • напишите на одной из машин в PowerShell (локально или удаленно - по вкусу) :

    get-wmiobject win32_product -computername "Имя узла с 1с" | select name

    Это имя и используйте


    Илья, вопрос в том что бы выгрести ПО определенной версии, а не имени

    The opinion expressed by me is not an official position of Microsoft

    26 сентября 2018 г. 16:42
    Модератор
  • Прошу прощения. Недопонял, сейчас исправим. 

    Попробуйте так:

    Select distinct SMS_R_SYSTEM.ResourceID  from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.resourceid  = SMS_R_System.resourceid where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = '1С Предприятие' and SMS_G_System_ADD_REMOVE_PROGRAMS.Version = '8.3.10.2299'

    Так же можно оббежать те машины что в онлайне используя CMPivot. Там есть тип "Installed Software" там можно отсеять по версии и там же на основе результата сделать коллекцию. Но это запрос напрямую к машинам будет а не в БД, Т.е только к тем что в онлайне.

    • Предложено в качестве ответа Alexander RusinovModerator 26 сентября 2018 г. 18:58
    • Изменено Демин Илья 26 сентября 2018 г. 19:09
    • Отменено предложение в качестве ответа Dedman2k3 27 сентября 2018 г. 8:16
    • Помечено в качестве ответа Dedman2k3 1 октября 2018 г. 12:31
    26 сентября 2018 г. 16:46
  • Вот запрос для CMPivot  

    InstalledSoftware | order by ProductName desc | distinct ProductName, ProductVersion


    1C:Enterprise 8 (8.3.8.1861) 8.3.8.1861
    1C:Enterprise 8 (8.3.9.1850) 8.3.9.1850
    1C:Enterprise 8 (x86-64) (8.3.11.3034) 8.3.11.3034
    1C:Предприятие 8.1 8.1.9
    1C:Предприятие 8.2 (8.2.19.83) 8.2.19.83

    • Изменено Stratofort 27 сентября 2018 г. 5:59
    27 сентября 2018 г. 5:57
  • Прошу прощения. Недопонял, сейчас исправим. 

    Попробуйте так:

    Select distinct SMS_R_SYSTEM.ResourceID  from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.resourceid  = SMS_R_System.resourceid where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = '1С Предприятие' and SMS_G_System_ADD_REMOVE_PROGRAMS.Version = '8.3.10.2299'

    Так же можно оббежать те машины что в онлайне используя CMPivot. Там есть тип "Installed Software" там можно отсеять по версии и там же на основе результата сделать коллекцию. Но это запрос напрямую к машинам будет а не в БД, Т.е только к тем что в онлайне.

    делал вот так:

    select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.resourceid  = SMS_R_System.resourceid where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = '1C:Предприятие 8' and SMS_G_System_ADD_REMOVE_PROGRAMS.Version = '8.3.10.2580'

    в итоге sccm собрал коллекцию из 0 машины... как минимум штук 200 тачек точно есть с версией 8.3.10.2580..

    27 сентября 2018 г. 8:00
  • Вот запрос для CMPivot  

    InstalledSoftware | order by ProductName desc | distinct ProductName, ProductVersion


    1C:Enterprise 8 (8.3.8.1861) 8.3.8.1861
    1C:Enterprise 8 (8.3.9.1850) 8.3.9.1850
    1C:Enterprise 8 (x86-64) (8.3.11.3034) 8.3.11.3034
    1C:Предприятие 8.1 8.1.9
    1C:Предприятие 8.2 (8.2.19.83) 8.2.19.83

    а у меня наверно этой фичи нету.. "Начиная с версии 1806 CMPivot  предоставляет доступ к состоянию устройств в вашей среде в режиме реального времени"

    старая sccm стоит.. system Centr 2012 R2 configuration manager sp1

    5.00.8239.1000

    27 сентября 2018 г. 8:07
  • Если 1С версии 8, то зачем фильтровать ПК только с определенной версией? Ставить на все 400, т.к. разные релизы 1С 8 спокойно живут вместе.

    Всегда обновляли всем разом.

    27 сентября 2018 г. 8:24
  • Есть сервера которые  с разными версиями.

    например есть 4 сервера 1с с 8.3.10 версией, а есть с 1с 8.3.13 версией, и есть я на все поставлю версию 8.3.13, то у тех у кого  8.3.10 будет ошибка, что версия клиент сервера отличаются..

    27 сентября 2018 г. 16:01
  • например есть 4 сервера 1с с 8.3.10 версией, а есть с 1с 8.3.13 версией, и есть я на все поставлю версию 8.3.13, то у тех у кого  8.3.10 будет ошибка, что версия клиент сервера отличаются..

    Не будет такой ошибки. Это было в версиях 8.0 и м.б. в 8.1

    Уже давно в клиентской части 1С разные релизы ставятся в уникальные подпапки, а для запуска нужного используется специальный загрузчик.

    • Изменено Рыхлый 27 сентября 2018 г. 16:12
    27 сентября 2018 г. 16:10
  • например есть 4 сервера 1с с 8.3.10 версией, а есть с 1с 8.3.13 версией, и есть я на все поставлю версию 8.3.13, то у тех у кого  8.3.10 будет ошибка, что версия клиент сервера отличаются..

    Не будет такой ошибки. Это было в версиях 8.0 и м.б. в 8.1

    Уже давно в клиентской части 1С разные релизы ставятся в уникальные подпапки, а для запуска нужного используется специальный загрузчик.

    У нас сейчас такая проблема есть.

    какую версию 1с последнюю поставил, та и запускается и автоматически не выбирается та версия которая стоит на сервере.

    28 сентября 2018 г. 6:15
  • Вы откуда исполняемый файл клиента 1С запускаете? Список папок с "проблемного клиента и путь в ярлыке запуска покажите.

    По-умолчанию должен запускаться 1cestart.exe из подпапки common.

    Если запускать 1cv8.exe напрямую из подпапки релиза, то будет проблема несовместимости сервера и клиента при несовпадении версий.

    28 сентября 2018 г. 8:44
  • Вы откуда исполняемый файл клиента 1С запускаете? Список папок с "проблемного клиента и путь в ярлыке запуска покажите.

    По-умолчанию должен запускаться 1cestart.exe из подпапки common.

    Если запускать 1cv8.exe напрямую из подпапки релиза, то будет проблема несовместимости сервера и клиента при несовпадении версий.

    Специально для этого установил тестовый стенд.

    Сервер версия: - 8.3.12.1567

    на клиентском пк поставились 2 версии 1с сначала 8.3.12.1567, потом 8.3.13.1513.

    Запускаю ярлык 1с который лежит: "C:\Program Files (x86)\1cv8\common\1cestart.exe"

    Ниже скриншот.


    Естественно пишет ошибку:

    • Изменено Dedman2k3 28 сентября 2018 г. 10:33
    28 сентября 2018 г. 10:31
  • тему можно считать закрытой, т.к. переходит в плоскость 1с а не sccm..
    1 октября 2018 г. 12:31
  • Можно прописать конкретную платформу для запуска каждой базы

    28 марта 2019 г. 6:34
  • Перед проведением обновления 1С (серверной и клиентской части) подготавливается приложение SCCM для установки новой версии клиентской части (в интернете можно найти полезные флаги тихой установки клиента 1С), тестируется. Дополнительно подготавливается приложение SCCM для удаления прежней версии клиентской части 1С, тестируется.

    В день обновления 1С:

    1. обновляется сервер 1С, после установки новой версии сервера, прежняя удаляется;

    2. создается развертывание SCCM для установки новой версии клиентской части 1С;

    Через 2-3 недели (когда большая часть ПК обновлена), создаётся развёртывание SCCM для удаления прежней версии клиентской части 1С.

    Для работы подойдет SCCM 2012 R2. Развёртывание приложения лучше создавать для коллекции пользователей 1С. В методе обнаружения (для 2 приложений SCCM) использовал скрипт.




    • Изменено Mikhail_sa 30 марта 2019 г. 6:23
    30 марта 2019 г. 5:54
  • Прилагаю текст скрипта VBScript в методе определения (для приложения SCCM установки 1С версии 8.3.13.1644), приложение SCCM нужно протестировать перед использованием

    ' скрипт проверяет, установлено ли приложение с заданным именем
    ' (объект RegExp не используется)
    '
    ' входные данные
    '  имя приложения (строка)
    '  номер версии (строка с числами, разделёнными точкой)
    '
    ' выходные данные
    '  0, если найдено и установленная версия равна или больше
    '  1, если найдено и установленная версия младше
    '  2, если не найдено
    '
    ' на 64-разрядных системах запускать в 64-разрядном процессе
    '
    ' создано на основе
    ' https://gallery.technet.microsoft.com/37e834bc-3c64-4c23-b448-3659d3ac2dcf#content
    '
    Option Explicit
    
    Dim bFound, bUpdateNeeded
    Dim objWMIService, colProcessorDevices, objProcessorDevice, bArch64
    
    'вывод на экран
    Const bAllowOutput = false
    
    ' имя приложения
    Const strEtalonDisplayName = "1C:Предприятие 8 (8.3.13.1644)"
    ' версия
    Const strEtalonVersion = "8.3.13.1644"
    
    Const strComputer = "."
    Const strKey1 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    Const strKey2 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
    
    ' определяем разрядность ОС
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
        
    Set colProcessorDevices = objWMIService.ExecQuery _
    	("Select * from Win32_Processor")
    
    bArch64 = false
    For Each objProcessorDevice in colProcessorDevices
     If (objProcessorDevice.AddressWidth = "64") Then
      bArch64 = true
     End if
    Next
    
    if bAllowOutput then
     WScript.Echo "Arch x64"
     if bArch64 Then
      WScript.Echo "yes"
     else
      WScript.Echo "no"  
     End if
    end if
    
    if bArch64 Then
    ' для 64-разрядной ОС выполнять проверку в другом ключе реестра
     bFound = FindSoftware(strKey2, strEtalonDisplayName, strEtalonVersion, bUpdateNeeded)
    else
     bFound = FindSoftware(strKey1, strEtalonDisplayName, strEtalonVersion, bUpdateNeeded)
    End If
    
    if bFound Then
     if bUpdateNeeded Then
    '  Wscript.Quit 1
    '  Wscript.Echo "NEED UPDATE"
     else
    '  Wscript.Quit 0
      Wscript.Echo "OK"
     end if
    else
    ' Wscript.Quit 2
    ' Wscript.Echo "NOT FOUND"
    end if
    
    Function FindSoftware(strKey, strEtalonDisplayName, strEtalonVersion, ByRef bUpdateNeeded)
     Dim strSubkey, arrSubkeys, objReg, intRet1
     Dim strDisplayName, strDisplayVersion, strQuietUninstall, intMajorVersion, intMinorVersion
    
     Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
     Const strComputer = "."
     Const strEntry1a = "DisplayName"
     Const strEntry1b = "QuietDisplayName"
     Const strEntry1c = "DisplayVersion"
     Const strEntry1ca = "MajorVersion"
     Const strEntry1cb = "MinorVersion"
     Const strEntry1d = "QuietUninstallString"
    
     FindSoftware = false
     bUpdateNeeded = true
    
     Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
    
     intRet1 = objReg.EnumKey(HKLM, strKey, arrSubkeys)
    
     if intRet1 <> 0 Then
    ' если не найдены ключи в реестре
      Exit Function
     end if
    
     if IsNull(arrSubkeys) then
    ' если ключ найден, но нет подключей
      Exit Function
     end if
    
     For Each strSubkey In arrSubkeys
    ' если найдены ключи в реестре
    ' цикл для каждого ключа
      intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, strEntry1a, strDisplayName)
      If intRet1 = 0 And Len(strDisplayName) > 0 Then
       If strDisplayName = strEtalonDisplayName Then
        FindSoftware = true
    
        intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, strEntry1c, strDisplayVersion)
        objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry1ca, intMajorVersion
        objReg.GetDWORDValue HKLM, strKey & strSubkey, strEntry1cb, intMinorVersion
        objReg.GetStringValue HKLM, strKey & strSubkey, strEntry1d, strQuietUninstall
        
        if bAllowOutput then
         WScript.Echo strKey & strSubkey
         WScript.Echo strEntry1a & ": " & strDisplayName
         WScript.Echo strEntry1c & ": " & strDisplayVersion
         WScript.Echo strEntry1ca & ": " & intMajorVersion
         WScript.Echo strEntry1cb & ": " & intMinorVersion
         WScript.Echo strEntry1d & ": " & strQuietUninstall
        end if
        
        if intRet1 = 0 And Len(strDisplayVersion) > 0 Then
         if CheckPOVersion(strEtalonVersion, strDisplayVersion) then
          bUpdateNeeded = false
         else
          bUpdateNeeded = true
         end if
         if bUpdateNeeded = false then
          Exit Function
         end if
        end if
       End If
      End If
     Next
    End Function
    
    ' True, если установленная версия больше или равна
    ' False, в другом случае
    Function CheckPOVersion(ByVal strExpectedVersion, ByVal strCurrentVersion)
     Dim arrCurrentVersion, arrExpectedVersion
     Dim versionPartCount
    	
     CheckPOVersion = True
    	
     arrCurrentVersion = Split(strCurrentVersion, ".", -1, 1)
     arrExpectedVersion = Split(strExpectedVersion, ".", -1, 1)
    	
     For versionPartCount = 0 To 3
      if bAllowOutput then
       WScript.Echo "---"
       WScript.Echo arrCurrentVersion(versionPartCount)
       WScript.Echo arrExpectedVersion(versionPartCount)
      end if
      If CInt(arrCurrentVersion(versionPartCount)) > CInt(arrExpectedVersion(versionPartCount)) Then
       Exit Function
      ElseIf CInt(arrCurrentVersion(versionPartCount)) < CInt(arrExpectedVersion(versionPartCount)) Then
       CheckPOVersion = False
       Exit Function
      End If
     Next
    End Function
    

    30 марта 2019 г. 7:21
  • Mikhail_sa, можете опубликовать Ваш скрипт в галереях, в таком случае у пользователей будет больше шансов его найти

    The opinion expressed by me is not an official position of Microsoft

    30 марта 2019 г. 7:47
    Модератор
  • Можете поспособствовать, чтобы Microsoft разрешил опубликовать скрипт? Сейчас при попытке публикации появляется уведомление на английском языке, что недостаточно привилегий (текст: "Sorry, you don't have privilege to upload a sample"). Задал вопрос, сообщили, что для публикации в галерее нужны баллы и медали (кол-во не сообщили).


    • Изменено Mikhail_sa 1 апреля 2019 г. 13:14
    1 апреля 2019 г. 12:25