Как стать автором
Поиск
Написать публикацию
Обновить

Управление списками пользователей OCS 2007 с использованием PowerShell GUI script

Данный пост для тех кто все еще использует Microsoft Office Communications Server 2007 R2. Хотелось бы представить на общее обозрение GUI для сценария LCSAddContacts.wsf ( входит в состав OCS Resource Kit ).

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

Необходимые условия:


  • скрипт необходимо запускать на сервере 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()
}

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.