Скрипт создания файла экспорта данных для Live@Edu
14 Июль 2009
Наш вуз стал участником программы от Microsoft под название Live@Edu. Это нечто бесплатной почтовой системы с ящиком в 25Gb и в дальнейшем с тесной интеграцией с продуктами Microsoft. При этом в систему можно загрузить необходимых пользователей через csv файл и тем самым завести всех кому необходима данная система. Пока был написан простенький скрипт для генерации csv файла с необходимыми данными внутри и для последующей его отсылки человеку который нас курирует. Так как до 2009.07.01 необходимо было завести не меньше 500 учеток для подтверждения внедрения данного продукта в организации. По этому скрипт очень простой. В дальнейшем он будет дописан и расширен функционал.
#Requires -PSSnapin Quest.ActiveRoles.ADManagement
#########################################################################################
# Created: Zakharchenko Andrey Ruslanovich
# Date: 2009.06.28
# Description: Экспорт сотрудников в CSV для создания почтовых ящиков в систему Live@Edu
#########################################################################################
#--- функция генерации пароля
Function New-Password ([int]$intPasswordLength){
#--- проверяем что пароль больше 4 символов
if ($intPasswordLength -lt 4) {return "password cannot be <4 chars"}
#--- наборы символов для генерации
$strNumbers = "1234567890"
$strCapitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$strLowerLetters = "abcdefghjkmnpqrstuvwxyz"
$strSymbols = "!%^&*()+=/?{}[]~,.<>:"
#--- собственно сама генерация пароля
$rand = new-object random
for ($a=1; $a -le $intPasswordLength; $a++){
if ($a -gt 3){
$b = $rand.next(0,4) + $a
$b = $b % 3 + 1}
else { $b = $a }
switch ($b){
"1" {$b = "$strNumbers"}
"2" {$b = "$strCapitalLetters"}
"3" {$b = "$strLowerLetters"}
"4" {$b = "$strSymbols"}}
$charset = $($b)
$number = $rand.next(0,$charset.Length)
$RandomPassword += $charset[$number]
}
return $RandomPassword
}
#--- объявляем переменные
$SQLServer = "SQLSERVER"
$DBName = "DB_SOTRUDNIC"
$i = 0
$domain = 'bguep.info'
#--- создаем подключение к Microsoft SQL Server
$SQLConnection = new-object System.Data.SqlClient.SqlConnection("Initial Catalog=$DBName;Data Source=$SQLServer;Integrated Security=SSPI")
$SQLConnection.Open()
#--- основной цикл выполнения
ForEach ($user in Get-QADUser -searchroot "OU=БГУЭП,DC=isea,DC=ru" -IncludedProperties WebPage,LogonName,AccountIsDisabled -SizeLimit 0 ) {
#ForEach ($user in Get-QADUser -searchroot "OU=Информационное Управление,OU=БГУЭП,DC=isea,DC=ru" -IncludedProperties WebPage,LogonName,AccountIsDisabled -SizeLimit 0 ) {
if ($user.webpage){
if (!($user.webpage -match "^Q")) {
#--- ищем, что пользователь является сотрудником вуза (проверяем по "рег. номеру")
$query = "SELECT TOP (1) регном FROM dbo.BankCustomer WHERE регном = " + $($user.WebPage -replace "[^0-9 \d]") + ""
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($query, $SQLConnection)
$SQLReader = $SQLCommand.ExecuteScalar()
#--- вытаскиваем должность сотрудника
$query = "SELECT TOP (1) Должность FROM dbo.Customer WHERE регном= " + $($user.WebPage -replace "[^0-9 \d]") + ""
#--- проверяем, что "рег. номер" не пустой и пользователь не отключен в AD
if ($SQLReader -and !$user.AccountIsDisabled) {
#--- создаем объект для дальнейщего экспорта
$export = "" | Select-Object @{name='EmployeeID';expression={$user.webpage}}, `
@{name='FullName';expression={$user.DisplayName}}, `
# @{name='Post';expression={(New-Object System.Data.SqlClient.SqlCommand(("SELECT TOP (1) Должность FROM dbo.Customer WHERE регном= " + $($user.WebPage -replace "[^0-9 \d]") + ""), $SQLConnection)).ExecuteScalar()}}, `
@{name='Email';expression={(($user.LogonName).ToLower() + "@$domain")}}, `
@{name='Password';expression={(New-Password (10))}}
$export
$i++
}
}
}
}
Write-Output "Итого пользователей: $($i)"
$SQLConnection.Close()
#########################################################################################
# Created: Zakharchenko Andrey Ruslanovich
# Date: 2009.06.28
# Description: Экспорт сотрудников в CSV для создания почтовых ящиков в систему Live@Edu
#########################################################################################
#--- функция генерации пароля
Function New-Password ([int]$intPasswordLength){
#--- проверяем что пароль больше 4 символов
if ($intPasswordLength -lt 4) {return "password cannot be <4 chars"}
#--- наборы символов для генерации
$strNumbers = "1234567890"
$strCapitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$strLowerLetters = "abcdefghjkmnpqrstuvwxyz"
$strSymbols = "!%^&*()+=/?{}[]~,.<>:"
#--- собственно сама генерация пароля
$rand = new-object random
for ($a=1; $a -le $intPasswordLength; $a++){
if ($a -gt 3){
$b = $rand.next(0,4) + $a
$b = $b % 3 + 1}
else { $b = $a }
switch ($b){
"1" {$b = "$strNumbers"}
"2" {$b = "$strCapitalLetters"}
"3" {$b = "$strLowerLetters"}
"4" {$b = "$strSymbols"}}
$charset = $($b)
$number = $rand.next(0,$charset.Length)
$RandomPassword += $charset[$number]
}
return $RandomPassword
}
#--- объявляем переменные
$SQLServer = "SQLSERVER"
$DBName = "DB_SOTRUDNIC"
$i = 0
$domain = 'bguep.info'
#--- создаем подключение к Microsoft SQL Server
$SQLConnection = new-object System.Data.SqlClient.SqlConnection("Initial Catalog=$DBName;Data Source=$SQLServer;Integrated Security=SSPI")
$SQLConnection.Open()
#--- основной цикл выполнения
ForEach ($user in Get-QADUser -searchroot "OU=БГУЭП,DC=isea,DC=ru" -IncludedProperties WebPage,LogonName,AccountIsDisabled -SizeLimit 0 ) {
#ForEach ($user in Get-QADUser -searchroot "OU=Информационное Управление,OU=БГУЭП,DC=isea,DC=ru" -IncludedProperties WebPage,LogonName,AccountIsDisabled -SizeLimit 0 ) {
if ($user.webpage){
if (!($user.webpage -match "^Q")) {
#--- ищем, что пользователь является сотрудником вуза (проверяем по "рег. номеру")
$query = "SELECT TOP (1) регном FROM dbo.BankCustomer WHERE регном = " + $($user.WebPage -replace "[^0-9 \d]") + ""
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($query, $SQLConnection)
$SQLReader = $SQLCommand.ExecuteScalar()
#--- вытаскиваем должность сотрудника
$query = "SELECT TOP (1) Должность FROM dbo.Customer WHERE регном= " + $($user.WebPage -replace "[^0-9 \d]") + ""
#--- проверяем, что "рег. номер" не пустой и пользователь не отключен в AD
if ($SQLReader -and !$user.AccountIsDisabled) {
#--- создаем объект для дальнейщего экспорта
$export = "" | Select-Object @{name='EmployeeID';expression={$user.webpage}}, `
@{name='FullName';expression={$user.DisplayName}}, `
# @{name='Post';expression={(New-Object System.Data.SqlClient.SqlCommand(("SELECT TOP (1) Должность FROM dbo.Customer WHERE регном= " + $($user.WebPage -replace "[^0-9 \d]") + ""), $SQLConnection)).ExecuteScalar()}}, `
@{name='Email';expression={(($user.LogonName).ToLower() + "@$domain")}}, `
@{name='Password';expression={(New-Password (10))}}
$export
$i++
}
}
}
}
Write-Output "Итого пользователей: $($i)"
$SQLConnection.Close()

.gif)

#Requires -PSSnapin Quest.ActiveRoles.ADManagement
Это такое шаманство компьютерное?
MZorin
>#Requires -PSSnapin Quest.ActiveRoles.ADManagement
это шаманство говорит, что скрипт без оснастки Quest.ActiveRoles.ADManagement не запустится. Так же можно указать, что скрипт заточен скажем под PoSh 1.0 или PoSh 2.0
Вот пример скрипта, который заточен только под PoSh 2.0
#Requires -Version 2.0
$psversiontable
[PS] <9> C:\Bin> .\test.ps1
Не удается выполнить сценарий "test.ps1", так как он содержит инструкцию "#requires" в строке 1 для версии 2.0 Windows PowerShell, не совместимую с установленной версией 1.0Windows PowerShell.
В строка:1 знак:10
+ .\test.ps1 <<<<
[PS] <10> C:\Bin>
Если бы у меня был он, скрипт бы нормально отработал и отобразил системную переменную доступную в PoSh 2.0. Так же как я уже сказал выше это дело удобно проверить, чтоб перед выполнением скрипта была загружена нужная оснастка.
Браво!