Вдохновившись постом @StuxForce решил написать упрощённый вариант автоматической установки и конфигурирования клиента MicroSIp на компьютеры доменной сети. Получился вполне рабочий вариант, который легко можно настроить под свою компанию.
Для реализации данной затеи нам понадобится:
Сам клиент MicroSip (качаем с официального сайта)
-
В папке MicroSip будут:
Distr — в ней хранится неизменяемая часть программы;
Settings — туда мы кладем файлы Contacts.xml и microsip.ini;
Users — в нее мы будем генерировать файл личных настроек пользователя.
Русификация программы выполняется путем добавления в папку Distr файла langpack_russian.txt.
Размещаем папку 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)
leonid_seredkin Автор
00.00.0000 00:00if (!(Test-Path -Path $dir_microsip))
Верно подмечено. Это проверка для того, чтоб не копировать лишний раз прогу)) А прога вроде сама обновляется.
321785
00.00.0000 00:00А чем PowerShell DesireStateConfiguration не угодил?
leonid_seredkin Автор
00.00.0000 00:00Если честно не применял его никогда, обязательно попробую, спасибо за идею
ildarz
С таким подходом вас в будущем может ждать много разных неожиданных открытий. :) Останавливаете процессы, удаляете файлы, копируете файлы - всегда проверяйте результат. Да и в целом - если запускаете команду, от безошибочного выполнения которой в дальнейшем что-то зависит, проверяйте результат и делайте обработку ошибок.
Допустим, как проверка на отсутствие установки прокатит. Но вот дальше определять по наличию каталога наличие функционирующей софтины нужной версии, да еще в месте с полным доступом для пользователя - это такое себе.
А если есть, но ведет не туда? Ярлыки проще пересоздавать.