Search
Write a publication
Pull to refresh

Управление списками пользователей 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()
}

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.