Управление списками пользователей OCS 2007 с использованием PowerShell GUI script
Invite pending
Данный пост для тех кто все еще использует Microsoft Office Communications Server 2007 R2. Хотелось бы представить на общее обозрение GUI для сценария LCSAddContacts.wsf ( входит в состав OCS Resource Kit ).
При наличии большого количества пользователей и их постоянной текучкой возникает необходимость добавлять нового сотрудника в списки контактов существующих пользователей, а ему соответственно формировать новый список.
Работает сценарий от Майкрософта с входными данными находящимися в текстовых файлах, эти файлы как раз и формирует скрипт (source.txt и dest.txt). Более подробно описывать функционал скрипта LCSAddContacts.wsf я не буду, в интернете довольно много статей в русскоязычных источниках.
Принцип интерфейса взят из старых добрых двухпанельных файловых менеджеров. Слева выбирается OU источник справа OU назначения.

Выбранные пользователи добавляются в группу в списке контактов. Список групп хранится в файле groups.txt который расположен в одной папке со скриптом. В именах групп регистр имеет значение, т.е GroupA и Groupa будут считаться разными группами.
После нажатия кнопки создать|удалить скрипт немного «уходит в себя», может показаться, что он завис но это не так. После выполнения в поле RICHTEXTBOX заполняется лог полученный из сессии cmd.exe.
CheckBox «City» сделан исключительно из-за вложенности подразделений в структуре каталога Active Directory (в OU=City находятся OU-других подразделений находящихся в головном офисе компании).
Исходный код:
При наличии большого количества пользователей и их постоянной текучкой возникает необходимость добавлять нового сотрудника в списки контактов существующих пользователей, а ему соответственно формировать новый список.
Необходимые условия:
- скрипт необходимо запускать на сервере OCS
- учетная запись, от которой запускается скрипт, должна быть членом группы безопасности администраторов OCS
- установлены cmd-lets от Quest Software, Inc.
Описание:
Работает сценарий от Майкрософта с входными данными находящимися в текстовых файлах, эти файлы как раз и формирует скрипт (source.txt и dest.txt). Более подробно описывать функционал скрипта LCSAddContacts.wsf я не буду, в интернете довольно много статей в русскоязычных источниках.
Принцип интерфейса взят из старых добрых двухпанельных файловых менеджеров. Слева выбирается OU источник справа OU назначения.

Выбранные пользователи добавляются в группу в списке контактов. Список групп хранится в файле groups.txt который расположен в одной папке со скриптом. В именах групп регистр имеет значение, т.е GroupA и Groupa будут считаться разными группами.

После нажатия кнопки создать|удалить скрипт немного «уходит в себя», может показаться, что он завис но это не так. После выполнения в поле RICHTEXTBOX заполняется лог полученный из сессии cmd.exe.
CheckBox «City» сделан исключительно из-за вложенности подразделений в структуре каталога Active Directory (в OU=City находятся OU-других подразделений находящихся в головном офисе компании).
Исходный код:
ocs_contacts.ps1
Param (
$logs = "C:\OCS_Share\Contacts_script\logs\",
$errorfile = "ocs.log"
)
PROCESS {
$ErrorActionPreference = "SilentlyContinue"
Add-PSSnapin Quest.ActiveRoles.ADManagement -passthru
import-module ActiveDirectory
trap {
$_ | out-file "$logs$errorfile" -append -Encoding default
continue
}
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$domain = "example.com" # Имя домена
$GroupRoot = "CN=Users,DC=example,DC=com" # OU, откуда начинается поиск групп
$OuRoot = "DC=example,DC=com" # OU, откуда начинается поиск других OU
$OuFilter = "(!(name=*PC))(!(name=Domain Controllers))(!(name=Microsoft Exchange Security Groups))" # OU, которые надо исключить из списка подразделений (служебные и тд)
$GroupFilter = "(!(name=TerminalUsers))(!(name=RTC*))(!(name=KAVWSEE Administrators))" # Группы, которые надо исключить из отображаемого списка
############################### ДОБАВЛЕНИЕ СООБЩЕНИЯ В ЛОГ (RICHTEXTBOX) ##########################################
function LogAdd($msg)
{
$Log.text = $Log.text + $msg
}
############################## НАЗНАЧЕНИЕ SIP ПОЛЬЗОВАТЕЛЕЙ, OCS enable ##########################################
function OCS_enable ($user)
{
$Search = New-Object DirectoryServices.DirectorySearcher([ADSI]“”)
$Search.filter = “(&(objectClass=user)(sAMAccountName=$User))”
$results = $Search.Findall()
Foreach($result in $results){
$objUser = $result.GetDirectoryEntry()
# Set Variables
# 256 = EnabledForEnhancedPresence
$strPrimaryHomeServer = "CN=LC Services,CN=Microsoft,CN=OCSServerName,CN=Pools,CN=RTC Service,CN=Services,CN=Configuration,DC=example,DC=com"
$strPrimaryUserAddress = ("sip:$user@example.com")
$bInternetAccessEnabled = $False
$nOptionFlags = 256
# Set and enable OCS settings
$objUser.Put("msRTCSIP-PrimaryUserAddress", $strPrimaryUserAddress)
$objUser.Put("msRTCSIP-InternetAccessEnabled",$bInternetAccessEnabled)
$objUser.Put("msRTCSIP-OptionFlags", $nOptionFlags)
$objUser.Put("msRTCSIP-PrimaryHomeServer", $strPrimaryHomeServer)
$objUser.Put("msRTCSIP-UserEnabled", $True)
# Commit changes
$objUser.setInfo()
}
}
############################## При изменении OU ##########################################
function OUchanged
{
if ( $Citycheck.CheckState -eq "Checked")
{$global:objectunit = "OU="+$unit.SelectedItem+",OU=City"+","+$OuRoot }
else {$global:objectunit = "OU="+$unit.SelectedItem+","+$OuRoot }
$users.Items.Clear()
$usr = Get-ADUser -filter * -SearchScope Subtree -SearchBase $global:objectunit -Properties Enabled | Select-Object name |Foreach-Object {$_.name} | Sort-Object
$usr | Foreach-Object {$users.Items.Add($_)}
}
function OUchanged1
{
if ( $City1check.CheckState -eq "Checked")
{$global:objectunit1 = "OU="+$unit1.SelectedItem+",OU=City"+","+$OuRoot }
else {$global:objectunit1 = "OU="+$unit1.SelectedItem+","+$OuRoot }
$users1.Items.Clear()
$usr1 = Get-ADUser -filter * -SearchScope Subtree -SearchBase $global:objectunit1 -Properties Enabled | Select-Object name |Foreach-Object {$_.name} | Sort-Object
$usr1 | Foreach-Object {$users1.Items.Add($_)}
}
############################## При использовании списка подразделений вложеных в OU=City ##########################################
function Citychanged
{
$unit.Items.Clear()
if ( $Citycheck.CheckState -eq "Checked")
{
$tempDC = "OU=City"+","+$OuRoot
$unt = get-QADObject -SearchRoot $tempDC -Type 'organizationalUnit' -LdapFilter $OuFilter| Select-Object name|Foreach-Object {($_.name)} | Sort-Object
$unitList = $unt |Foreach-Object {$unit.Items.Add($_)}
}
else {
$OuFilter2 = $OuFilter+"(!(name=*МО))(!(name=MRIC))" # OU, которые надо исклюичть из списка подразделений в OU=City
$unt = get-QADObject -SearchRoot $OuRoot -Type 'organizationalUnit' -LdapFilter $OuFilter2| Select-Object name|Foreach-Object {($_.name)} | Sort-Object
$unitList = $unt |Foreach-Object {$unit.Items.Add($_)}
}
}
function City1changed
{
$unit1.Items.Clear()
if ( $City1check.CheckState -eq "Checked")
{
$tempDC = "OU=City"+","+$OuRoot
$unt1 = get-QADObject -SearchRoot $tempDC -Type 'organizationalUnit' -LdapFilter $OuFilter| Select-Object name|Foreach-Object {($_.name)} | Sort-Object
$unitList1 = $unt1 |Foreach-Object {$unit1.Items.Add($_)}
}
else {
$OuFilter21 = $OuFilter+"(!(name=*МО))(!(name=MRIC))(!(name=Главное управление юстиции))(!(name=Для огранизационно-кадрового управления))(!(name=Резервирование залов автомобилей)) (!(name=Торговля и услуги))(!(name=Управление антимонопольной и ценовой политики))(!(name=Управление идеологической работы))"
$unt1 = get-QADObject -SearchRoot $OuRoot -Type 'organizationalUnit' -LdapFilter $OuFilter21| Select-Object name|Foreach-Object {($_.name)} | Sort-Object
$unitList1 = $unt1 |Foreach-Object {$unit1.Items.Add($_)}
}
}
############################## При добавлении всем пользователям выбранного OU ##########################################
function allusrchk
{
if ($users.Items.Count -ne 0)
{
if ($allusr.CheckState -eq "Checked")
{
for($i=0; $i -lt $users.Items.Count; $i++){$users.SetItemChecked($i,$true)}
}
else
{
for($i=0; $i -lt $users.Items.Count; $i++){$users.SetItemChecked($i,$false)}
}
}
}
function allusrchk1
{
if ($users1.Items.Count -ne 0)
{
if ($allusr1.CheckState -eq "Checked")
{
for($i=0; $i -lt $users1.Items.Count; $i++){$users1.SetItemChecked($i,$true)}
}
else
{
for($i=0; $i -lt $users1.Items.Count; $i++){$users1.SetItemChecked($i,$false)}
}
}
}
############################## Выполнение скрипта lcsaddaces.wsf для создания пользователй ##########################################
function userscheck
{
Remove-Item "source.txt" -Force
Remove-Item "dest.txt" -Force
$users2 = $users.CheckedItems
$users3 = $users1.CheckedItems
foreach ($usr in $users2){Get-QADUser -SearchRoot $global:objectunit | Where {$_.name -match $usr} | Select-Object userprincipalname |Foreach-Object {("sip:"+$_.userprincipalname | out-file "source.txt" -Append -Encoding default)}}
foreach ($usr1 in $users3){Get-QADUser -SearchRoot $global:objectunit1 | Where {$_.name -match $usr1} | Select-Object userprincipalname |Foreach-Object {("sip:"+$_.userprincipalname | out-file "dest.txt" -Append -Encoding default)}}
foreach ($usr in $users2){Get-QADUser -SearchRoot $global:objectunit | Where {$_.name -match $usr} | Foreach-Object {ocs_enable $_.samAccountName}}
foreach ($usr1 in $users3){Get-QADUser -SearchRoot $global:objectunit1 | Where {$_.name -match $usr1} | Foreach-Object {ocs_enable $_.samAccountName}}
[string] $grp = $OCSgroup.SelectedItem
sleep -Seconds 60
$ans = cmd /c CScript lcsaddcontacts.wsf /usersfile:source.txt /contactsfile:dest.txt /contactsgroup:$grp
logadd $ans
$ans = cmd /c CScript lcsaddcontacts.wsf /usersfile:dest.txt /contactsfile:source.txt /contactsgroup:$grp
logadd $ans
$ans = cmd /c CScript lcsaddaces.wsf /usersfile:source.txt /acesfile:acesfile.txt
logadd $ans
}
############################## Выполнение скрипта lcsaddaces.wsf для удаления пользователй ##########################################
function userscheck1
{
Remove-Item "source_del.txt" -Force
Remove-Item "dest_del.txt" -Force
$users2 = $users.CheckedItems
$users3 = $users1.CheckedItems
foreach ($usr in $users2){Get-QADUser -SearchRoot $global:objectunit | Where {$_.name -match $usr} | Select-Object userprincipalname |Foreach-Object {("sip:"+$_.userprincipalname | out-file "source_del.txt" -Append -Encoding default)}}
foreach ($usr1 in $users3){Get-QADUser -SearchRoot $global:objectunit1 | Where {$_.name -match $usr1} | Select-Object userprincipalname |Foreach-Object {("sip:"+$_.userprincipalname | out-file "dest_del.txt" -Append -Encoding default)}}
[string] $grp = $OCSgroup.SelectedItem
$ans = cmd /c CScript lcsaddcontacts.wsf /usersfile:source_del.txt /contactsfile:dest_del.txt /contactsgroup:$grp /delete
logadd $ans
$ans = cmd /c CScript lcsaddcontacts.wsf /usersfile:dest_del.txt /contactsfile:source_del.txt /contactsgroup:$grp /delete
logadd $ans
}
################################################# ВЫВОД GUI ######################################################
$form = New-Object Windows.Forms.Form
$form.Height = 590
$form.Width = 1130
$form.Text = "OCS"
$button = New-Object Windows.Forms.Button
$button.text="Создать"
$button.Left ="110"
$button.Top = "500"
$button.add_click({userscheck})
$button1 = New-Object Windows.Forms.Button
$button1.text="Удалить"
$button1.Left ="510"
$button1.Top = "500"
$button1.add_click({userscheck1})
$labUnit = New-Object windows.Forms.Label
$labUnit.text = "Подразделение источник:"
$labUnit.left ="10"
$labUnit.top = "10"
$labUnit.width ="180"
$labUnit1 = New-Object windows.Forms.Label pochkaev_kv@mogispin.gov.by
$labUnit1.text = "Подразделение приемник:"
$labUnit1.left ="370"
$labUnit1.top = "10"
$labUnit1.width ="180"
$unit = New-Object windows.Forms.ComboBox
$unit.Left = "10"
$unit.Top = "35"
$unit.Width = "330"
$tempDC = "OU=City"+","+$OuRoot
$unt = get-QADObject -SearchRoot $tempDC -Type 'organizationalUnit' -LdapFilter $OuFilter| Select-Object name|Foreach-Object {($_.name)} | Sort-Object
$unitList = $unt |Foreach-Object {$unit.Items.Add($_)}
$unit.add_SelectedIndexChanged({OUchanged})
$unit1 = New-Object windows.Forms.ComboBox
$unit1.Left = "370"
$unit1.Top = "35"
$unit1.Width = "330"
$unt1 = get-QADObject -SearchRoot $tempDC -Type 'organizationalUnit' -LdapFilter $OuFilter| Select-Object name|Foreach-Object {($_.name)} | Sort-Object
$UnitList1 = $unt1 |Foreach-Object {$Unit1.Items.Add($_)}
$unit1.add_SelectedIndexChanged({OUchanged1})
$OCSgroup = New-Object windows.Forms.ComboBox
$OCSgroup.Left = "290"
$OCSgroup.Top = "480"
$OCSgroup.Width = "130"
$spisok = ".\groups.txt"
Get-Content $spisok | %{$untG += @($_.split())}
$untG |Foreach-Object {$OCSgroup.Items.Add($_)}
$City = New-Object windows.Forms.Label
$City.Text = "City"
$City.Left ="250"
$City.Top = "10"
$City.Width ="40"
$City1 = New-Object windows.Forms.Label
$City1.Text = "City"
$City1.Left ="610"
$City1.Top = "10"
$City1.Width ="40"
$Citycheck = New-Object windows.Forms.CheckBox
$Citycheck.left ="300"
$Citycheck.top = "5"
$Citycheck.Width = "20"
$Citycheck.Checked = "True"
$Citycheck.add_CheckedChanged({Citychanged})
$City1check = New-Object windows.Forms.CheckBox
$City1check.left ="660"
$City1check.top = "5"
$City1check.Width = "20"
$City1check.Checked = "True"
$City1check.add_CheckedChanged({City1changed})
$allusr = New-Object windows.Forms.CheckBox
$allusr.left ="13"
$allusr.top = "56"
$allusr.Width = "20"
$allusr.Checked = $false
$allusr.add_CheckedChanged({allusrchk})
$allusr1 = New-Object windows.Forms.CheckBox
$allusr1.left ="373"
$allusr1.top = "56"
$allusr1.Width = "20"
$allusr1.Checked = $false
$allusr1.add_CheckedChanged({allusrchk1})
$users = New-Object windows.Forms.CheckedListBox
$users.left = "10"
$users.top = "80"
$users.Width = "330"
$users.Height = "400"
$users.checkonclick = $true
$users1 = New-Object windows.Forms.CheckedListBox
$users1.left = "370"
$users1.top = "80"
$users1.Width = "330"
$users1.Height = "400"
$users1.checkonclick = $true
$WS = New-Object windows.Forms.TextBox
$WS.Text = " "
$WS.left ="500"
$WS.top = "90"
$WS.width ="100"
$WS.Enabled = $false
$Log = New-Object windows.Forms.RichTextBox
$Log.left= "710"
$Log.top="20"
$Log.width = "400"
$Log.height = "500"
$Log.ReadOnly = "true"
$form.controls.add($City)
$form.controls.add($Citycheck)
$form.controls.add($City1)
$form.controls.add($City1check)
$form.controls.add($allusr)
$form.controls.add($allusr1)
$form.controls.add($labunit)
$form.controls.add($unit)
$form.controls.add($labunit1)
$form.controls.add($unit1)
$form.controls.add($users)
$form.controls.add($users1)
$form.controls.add($button)
$form.controls.add($button1)
$form.controls.add($OCSgroup)
$form.controls.add($Log)
$form.Add_Shown({$form.Activate()})
$form.ShowDialog()
}