Вдохновившись постом @StuxForce решил написать упрощённый вариант автоматической установки и конфигурирования клиента MicroSIp на компьютеры доменной сети. Получился вполне рабочий вариант, который легко можно настроить под свою компанию.

Для реализации данной затеи нам понадобится:

  1. Сам клиент MicroSip (качаем с официального сайта)

  2. В папке MicroSip будут:

    1. Distr — в ней хранится неизменяемая часть программы;

    2. Settings — туда мы кладем файлы Contacts.xml и microsip.ini;

    3. Users — в нее мы будем генерировать файл личных настроек пользователя.

  3. Русификация программы выполняется путем добавления в папку Distr файла langpack_russian.txt.

  4. Размещаем папку MicroSip сетевой директории (например:Netlogon).

Итак вот сам скрипт, постарался детально прокомментировать. Возможно кому-то будет данный материал полезен.

Получаем статус процесса с именем MicroSip и завершаем его если таковой имеется:

# Получаем статус процесса с именем MicroSip
$process = Get-Process -Name "MicroSip" -ErrorAction SilentlyContinue 
# Если процесс Microsip не равен 0,то
if ($process -ne $null) 
    {
    # Принудительно завершаем процесс Microsip
    Stop-Process -Name "MicroSip" 
   }

Проверяем наличие установленного клиента MicroSip:

# Путь до директории с программой
$dir_microsip = "$env:APPDATA\MicroSIP"
# Проверяем существует ли $dir_microsip       
if (!(Test-Path -Path $dir_microsip)) 
    {
    # Создаем папку Microsip  
    New-Item -Path "$env:APPDATA\MicroSIP" -ItemType Directory
    # Копируем программу Microsip из сетевой дириктории в AppData пользователя
    Copy-Item -Path "\\ИМЯ_СЕРВЕРА\NETLOGON\soft\Microsip\Distr\*" -Destination "$env:APPDATA\MicroSIP" -Force 
}

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

# Путь до ярлыка
$link_microsip = "$env:USERPROFILE\Desktop\Microsip.lnk" 
# Проверяем существует ли ярлык на рабочем столе 
if (!(Test-Path -Path $link_microsip))
    {
    # Создяем ярлык на рабочем столе пользователя если он не существует
    $target = "$env:APPDATA\MicroSIP\microsip.exe"
    $file = "$env:USERPROFILE\Desktop\Microsip.lnk"
    $shell = New-Object -comObject Wscript.Shell
    $shortcut = $shell.CreateShortcut($file)
    $shortcut.TargetPath = $target
    $shortcut.Save()
    echo "Ярлык Microsip успешно добавлен!"
    }

Принудительно обновляем файл контактов

# Принудительно обновляем файл контактов 
$contacts = "\\ИМЯ_СЕРВЕРА\NETLOGON\soft\Microsip\Settings\Contacts.xml"
Copy-Item -Path $contacts -Destination "$env:APPDATA\MicroSIP" -Force

Если есть необходимость то можно каждый раз удалять файл конфигурации, но тогда потеряется история вызовов — они хранятся именно в нем (пока не разобрался как вынести в отдельный или если есть другие варианты напишите — добавлю в статью)

#Чистим старый файл конфигурации
Remove-Item  -Path "$env:APPDATA\MicroSIP\microsip.ini"

Далее собираем файл настроек для пользователя:

# Путь до конфигурационного файла
$conf_user = "$env:APPDATA\MicroSIP\microsip.ini" 
# Проверяем существует ли ярлык на рабочем столе 
if (!(Test-Path -Path $conf_user))
    {
    # Получаем данные из полей доменной ученой записи пользователя ActiveDirectiry
    $UserName = $env:username
    $Filter = "(&(objectCategory=User)(samAccountName=$UserName))"
    $Searcher = New-Object System.DirectoryServices.DirectorySearcher
    $Searcher.Filter = $Filter
    $ADUserPath = $Searcher.FindOne()
    $ADUser = $ADUserPath.GetDirectoryEntry()
    $ADDisplayName = $ADUser.DisplayName
    $ADipPhone = $ADUser.ipPhone

    # Выбираем пароль для отдела
    # В конфигурационном файле пароль будет зашифрован
    if (($ADipPhone -ge 100) -eq ($ADipPhone -le 199))
        {
         $pass = пароль
        } 
    elseif (($ADipPhone -ge 200) -eq ($ADipPhone -le 299))
        {
         $pass = пароль
        }
    elseif (($ADipPhone -ge 300) -eq ($ADipPhone -le 399))
        {
         $pass = пароль
        }
    elseif (($ADipPhone -ge 400) -eq ($ADipPhone -le 499))
        {
         $pass = пароль
        }
    elseif (($ADipPhone -ge 500) -eq ($ADipPhone -le 599))
        {
         $pass = пароль
        }
    elseif (($ADipPhone -ge 600) -eq ($ADipPhone -le 699))
        {
         $pass = пароль
        }
    elseif (($ADipPhone -ge 700) -eq ($ADipPhone -le 799))
        {
         $pass = пароль
        }

    # Создаем пустой файл конфигурации пользователя
    $conf_user = New-Item -Path "\\ИМЯ_СЕРВЕРА\NETLOGON\soft\Microsip\Users\$env:UserName.ini" -ItemType File -Force
    # Заполняем данными из ActiveDirectory переменную $txt
    $txt =  "[Account1]
            label = $ADipPhone
            AuthID = $ADipPhone
            Username = $ADipPhone
            DisplayName = $ADDisplayName
            Password = $pass
            Server = ИМЯ_СЕРВЕРА_PBX
            Domain = ИМЯ_СЕРВЕРА_PBX

            [Settings]
            accountId = 1"
    # Перенаправляем вывод $txt в $conf_user
    echo $txt | out-file $conf_user -encoding UTF8
    # Пусть до файла с общими настройками программы MicroSip
    $conf_simple = "\\ИМЯ_СЕРВЕРА\NETLOGON\soft\MicroSip\Settings\microsip.ini"
    # Копируем из из сетевой директории файл общих настроек в профиль пользователя
    Copy-Item -Path $contacts -Destination "$env:APPDATA\MicroSIP" -Force
    # Добавляем пользовательские настройки в файл общих настроек (объединяем файлы - общий + пользовательский)
    Add-Content -Path "$env:APPDATA\MicroSIP\microsip.ini" -Value (Get-Content -Path "$conf_user") -Force
    # Запуск MicroSip после внесения изменений
    Start-Process -FilePath "$env:APPDATA\MicroSIP\microsip.exe" 
    }

Запускаем ранее завершенный процесс MicroSip если изменения не понадобились:

# Запуск MicroSip
$process = Get-Process -Name "MicroSip" -ErrorAction SilentlyContinue 
# Перезапускаем MicroSip
if (!($process -ne $null)) 
   {
    # Если процесс Microsip не найден, запускаем его
    Start-Process -FilePath "$env:APPDATA\MicroSIP\microsip.exe" 
  }

Теперь можно создать политику в AD и при запуске системы выполнять данный скрипт под пользователем.

Прошу строго не судить, если есть чем дополнить (исправить) пишите в комментариях — буду рад и обязательно добавлю в статью.

Комментарии (4)


  1. ildarz
    00.00.0000 00:00
    +2

    Stop-Process -Name "MicroSip"

    echo "Процесс MicroSip завершен успешно!"

    С таким подходом вас в будущем может ждать много разных неожиданных открытий. :) Останавливаете процессы, удаляете файлы, копируете файлы - всегда проверяйте результат. Да и в целом - если запускаете команду, от безошибочного выполнения которой в дальнейшем что-то зависит, проверяйте результат и делайте обработку ошибок.

    if (!(Test-Path -Path $dir_microsip))

    Допустим, как проверка на отсутствие установки прокатит. Но вот дальше определять по наличию каталога наличие функционирующей софтины нужной версии, да еще в месте с полным доступом для пользователя - это такое себе.

    # Проверяем существует ли ярлык на рабочем столе

    А если есть, но ведет не туда? Ярлыки проще пересоздавать.


  1. leonid_seredkin Автор
    00.00.0000 00:00

    if (!(Test-Path -Path $dir_microsip))

    Верно подмечено. Это проверка для того, чтоб не копировать лишний раз прогу)) А прога вроде сама обновляется.


  1. 321785
    00.00.0000 00:00

    А чем PowerShell DesireStateConfiguration не угодил?


    1. leonid_seredkin Автор
      00.00.0000 00:00

      Если честно не применял его никогда, обязательно попробую, спасибо за идею