Понадобилось мне приводить название подразделений к стандартизованному виду. Который был заложен еще до меня. В базе по сотрудникам их подразделения написаны все в верхнем регистре. Что согласитесь в Active Directory это бы смотрелось не очень хорошо. По этому у меня появилась необходимость автоматизировать этот процесс. В ходе чего на свет появилась такая функция:
#########################################################################################
# Created: Zakharchenko Andrey Ruslanovich
# Date: 2009.07.17
# Description: Функция смена регистра подразделений/текста.
# Приведение его к общему стандарту.
#########################################################################################
Function Replace-Register ($text) {
#--- в цикле разрезаем текст на слова
Foreach ($var in ($text).Split(' ')) {
#--- проверяем если слово состоит из одного символа, делаем нижний регистр
if ($var.Length -eq 1) {
$j = $var.ToLower()
}
#--- если слово разделено "-" то отдельно с ним работаем
elseif ($var -cmatch '-') {
#--- переключатель
$switch = 0
#--- разделяем слово по "-"
Foreach ( $var1 in $var.Split('-')) {
#--- если это первое слово, то в конец добавляем "-"
if ($switch -eq 0 ) {
$j1 = $(($var1.Substring(0,1)).ToUpper()) + $(($var1.Substring(1)).ToLower()) + '-'
}
else {
$j1 = $(($var1.Substring(0,1)).ToUpper()) + $(($var1.Substring(1)).ToLower())
}
#--- собираем в строку
$j = $j + $j1
$switch++
}
}
#--- работа над обычными словами не подошедшими не под один фильтр
else {
$j = $(($var.Substring(0,1)).ToUpper()) + $(($var.Substring(1)).ToLower())
}
#--- собираем текст в строку
$textuot = $textuot + ' ' + $j
Remove-Variable j
}
#--- выводим результат
$textuot.Trim()
}
Ну и проверим чего у нас получилось:
[PS] <42> C:\>Replace-Register 'ИРКУТСКИЙ И БРАТСКИЙ ТОРГОВО-ЭКОНОМИЧЕСКИЕ КОЛЛЕДЖИ'
Иркутский и Братский Торгово-Экономические Колледжи
[PS] <43> C:\>Replace-Register 'иркутский и братский торгово-экономические колледжи'
Иркутский и Братский Торгово-Экономические Колледжи
[PS] <44> C:\>
Наш вуз стал участником программы от 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()
Сегодня у меня праздник! У меня день рожденье!
По просьбе трудящихся, попробую коротко рассказать о Access-based enumeration ставшей доступной в Windows Server 2008. Смысл технологии в том, что ссылки в корне DFS будут иметь связанный дескриптор безопасности, что позволит скрыть от пользователя те ссылки, на которые у него нету явных прав. Когда у вас в корне DFS присутствуют больше 100 ссылок на различные ресурсы, согласитесь это не очень удобно. Так же это дополнительное уселение безопасности за счет скрытия ресурсов от пользователя.
Что бы это работало, namespaces должен быть создан как «доменное пространство имен» с режимом работы DFS «Windows Server 2008″. Так же если namespaces создан как «изолированное пространство имен», но тогда это пространство должно находится на сервере под управлением Windows Server 2008. Вот в общем и все ограничения и рекомендации. Теперь я продемонстрирую минимум который необходим для включения Access-based enumeration и приведу пример его работы.
Для работы нам понадобится утилита dfsutil. Для включения Access-based enumeration необходимо сделать следующее:
C:\>dfsutil property ABDE enable \\isea.ru\Treasury
Обработка команды завершена.
Теперь мы подтвердим, что все сделали правильно:
C:\>dfsutil property ABDE \\isea.ru\Treasury
Пространство имен \\isea.ru\treasury: ABDE ВКЛЮЧЕНО
Обработка команды завершена.
Вот, все отлично, теперь дадим право чтения группам Study RO (res) и Study RW (res) на ссылку \\isea.ru\Study. для этого выполним следующую команду в конселе:
C:\>dfsutil property acl grant \\isea.ru\Treasury\Study "isea\Study RO (res):R" "isea\Study RW (res):R" protect replace
Обработка команды завершена.
После такого не хитрого действия у нас группам Study RO (res) и Study RW (res) будет данную ссылку видно, а от всех остальных она скроется.
Так же хочу объяснить:
protect отключает наследование разрешений от родительского раздела, у корня DFS \\isea.ru\Treasury по умолчанию стоит что его могут читаться все, по этому если не применить protrct у нас ссылка не скроется.
replace заменяет все ранее выданные права, то же самое делает в общем dfsutil property acl reset только она полностью удаляет все разрешения, а replace их заменяет на указанные.
#— полезные ссылки:
Enable Access-Based Enumeration on a Namespace
Distributed File System
P.S. для Windows Server 2003 читаем следующее
How to implement Windows Server 2003 Access-based Enumeration in a DFS environment
В четверг (25.06.2009) я прочитал свой первый доклад на четвертой встрече MCP клуба. Встреча проводится каждый последний четверг месяца. Вход свободный, надо только зарегистрировать свое желание посетить MCP клуб. Сделать это можно на сайте «Эксперт-Консалт». Доклад я читал на тему «Виртуализация — миф или реальность?» Речь в нем шла о новой системе виртуализации на основе Windows Server 2008. Данная система называется Hyper-V. Она доступна в двух вариантах. Первый это роль на сервере на Windows Server 2008 x64, а второй это бесплатная версия Microsoft Hyper-V Server 2008. Это по сути обычный Windows Server 2008 Core с единственной предустановленной ролью Hyper-V. При этом добавить еще какую-то роль не возможно. Так же на эту реализацию накладывается достаточно много ограничений по возможностям. Я имею введу про поддерживание большого количества памяти, процессоров и одновременно запущенных экземпляров виртуальных машин. Второй вариант это использовать просто Windows Server 2008 x64 в любом режиме установки. Добавить роль Hyper-V, при этом если на сервере установлена только одна роль Hyper-V, то есть некие так сказать бонусы в лицензировании.
Ну и про сам доклад, к сожалению записи нету. Начиная со следующей встречи, производить запись доклада будет обязательной
У меня же есть только презентация. Загрузить ее можно от сюда:
В ней я рассказал о том какие выгоды приносит для компании внедрение виртуализации. Привел какие типы виртуализации предлагает нам Microsoft. Остановился на виртуализации по средствам Hyper-V, Объяснил его структуру, как проходит взаимодействие «корневого раздела» с «дочерними разделами». и так далее. Кратко рассказал о самых интересных возможностях, которые добавятся с выходом Windows Server 2008 R2. В общем доклад получился кратким обзором возможности Hyper-V. Дальше было очень много заданных вопросов которые увы не записаны. Можно сказать, что народу очень интересна тема виртуализации, но не все ее могут попробовать. Я же старался как можно четче дать ответ и по возможности привести пример.
Я для себя сделал вывод следующий, что мне все же надо репетировать речь доклада, Так как я слишком часто запинался и сбивался.. Мне самому не понравилось в итоге как я прочитал доклад, но это ощущение сгладили вопросы
По этому у меня только положительные ощущения от данного мероприятия и я с удовольствием возьмись за следующий доклад, надо только определиться с темой.
Вот наконец и закончилась эпопея с продлением домена. Тяжело все же когда домен зарегистрирован на другого человека. Нужно потратить кучу времени, сил и желания для простого продления домена. Все же надо добить до конца мое желание о передаче его в nic.ru со сменой администратора домена, только больше всего удерживает, что необходимо подписывать доверенность у нотариуса. Это опять уйма потраченного времени и средств с обоих сторон. Хотя, надо один раз сделать и как говорится: забыть! Из-за не ясности с доменным именем, я приостановил публикации чего-либо. Сейчас постараюсь восстановить правду.