Архив

Публикации с меткой ‘PowerShell’

Virtualization WMI Provider

21 Апрель 2009

Сегодня я хочу попытаться объяснить как используя PowerShell, можно управлять ролью виртуализации Hyper-v. Пока я для себя вижу такую возможность только через WMI провайдер под названием Virtualization WMI Provider. Знакомство начнем с класса Msvm_ComputerSystem он нам позволит узнать информацию о хост машине и о ВМ созданных на этом сервере. Читать далее…

Автоматизация процесса заведения веб узлов на сервере IIS 7.0

20 Апрель 2009

Необходимо было написать скрипт завода сайтов в IIS 7.0. Сайты хоть и редко заводились, но было неудобно, так как постоянно что-то забывалось. По этому решил все собрать в кучу. Вот что из этого получилось.

param ($domain, $password, $ipaddress)

#########################################################################################
#   Created:      Zakharchenko Andrey Ruslanovich
#   Date:         2009.04.20
#   Description: Добавление web узла на сервер IIS 7.0.
#                       Создание необходимых пользователей/групп/DNS записей
#             Установка пирмишенов на домашнюю папку сайта
#             Добавление ссылок для DFS
#########################################################################################
$text = "`n
`t Надо использовать следующий синтаксис скрипта:
`t -domain      - Название домена. Пример: domain.isea.ru
`t -password    - Предпологаемый пароль пользователя
`t -ipaddress   - ip адес сервера IIS 7.0
`t------------------------------------------------------------------------------------
`t Пример:
`t ./add-web-iis-site.ps1 -domain "
"domain.isea.ru"" -password ""uRusae8kie"" -ipaddress ""10.1.1.92"" "

if ((!$domain) -or (!$password) -or (!$ipaddress)) { Write-Warning $text; return; }

#--- объявление переменных
$user = "iis-$domain"
$userou = "OU=IIS Servers,OU=Domain Servers,OU=БГУЭП,DC=isea,DC=ru"
$groupou = "OU=Sites,OU=Groups,OU=БГУЭП,DC=isea,DC=ru"
$resourcegroupou = "OU=Sites,OU=Resources,OU=БГУЭП,DC=isea,DC=ru"
$diskmapgroupou = "CN=Sites Disk map (res),OU=Sites,OU=Resources,OU=БГУЭП,DC=isea,DC=ru"
$gp = "Site $domain"
$gpres = "Site $domain (res)"
$dir = "D:\Sites"
$dirhome = join-path $dir $domain
$dnsserver = "dc-02.isea.ru"
$zone = "isea.ru"
$class = 1
$ttl = 3600
$site = "www.$domain"

Write-Host "Загрузка оснастки IIS 7.0. Это может занять некоторое время"
Add-PSSnapin WebAdministration

Write-Host "Загрузка оснастки Active Directory. Это может занять некоторое время"
Add-PSSnapin Quest.ActiveRoles.ADManagement

Write-Host "Подключение к контроллеру домена DC-02. Это может занять некоторое время"
connect-QADService -service 'DC-02.isea.ru' | out-null

#--- создаем пользователя
if ($user.Length -ge 20 ) { $usertmp = $user.Substring(0,20) }
else { $usertmp = $user }
$create = New-QADUser -name $user -ParentContainer $userou -SamAccountName $usertmp  -UserPassword $password -FirstName $user -DisplayName $user -UserPrincipalName "$user@isea.ru"

#--- устанавливаем параметры пользователя
Set-QADUser $create.DN -PasswordNeverExpires $true -ObjectAttributes @{userWorkstations='IIS-02'} | out-null

#--- содаем группу
$gpcreate = New-QADGroup -ParentContainer $groupou -Name $gp -SamAccountName $gp

#--- ресурсную группу
$gprescreate = New-QADGroup -ParentContainer $resourcegroupou -Name $gpres -SamAccountName $gpres  -GroupScope 'DomainLocal'

#--- делаем добавления групп
Add-QADGroupMember -Identity $gprescreate.DN -Member $gpcreate.DN | out-null
Add-QADGroupMember -Identity $diskmapgroupou -Member $gprescreate.DN | out-null

#--- содаем целевую папку и настраиваем пермишины
New-Item $dirhome -type dir | out-null
$acl  = Get-Acl $dirhome
$inherit = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
$propagationn = [system.security.accesscontrol.PropagationFlags]"None"
$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule ("isea\$gpres", "Modify",$inherit, $propagationn, "Allow")
$acl.AddAccessRule($AccessRule)
$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule ("$user@isea.ru", "ReadAndExecute" ,$inherit, $propagationn, "Allow")
$acl.AddAccessRule($AccessRule)
$acl | Set-Acl $dirhome

#— Отключение от контроллера домена DC-02
Disconnect-QADService

#--- заводим записи в DNS
$wmi = [wmiclass]"\\$dnsserver\root\MicrosoftDNS:MicrosoftDNS_AType"
$wmi.CreateInstanceFromPropertyData($dnsserver, $zone, $site, $class, $ttl, $ipaddress) | out-null

$wmi = [wmiclass]"\\$dnsserver\root\MicrosoftDNS:MicrosoftDNS_CNAMEType"
$wmi.CreateInstanceFromPropertyData($dnsserver, $zone, $domain, $class, $ttl, $site) | out-null

#--- содаем web узел
New-Item iis:\Sites\$domain -bindings @{protocol="http";bindingInformation=$ipaddress+":80:$domain"} -physicalPath $dirhome | out-null
Set-ItemProperty -Path "IIS:\Sites\$domain"  -name username -value "ISEA\$usertmp" | out-null
Set-ItemProperty -Path "IIS:\Sites\$domain"  -name password -value $password | out-null

#--- сосздаем линк для DFS и назначаем права
dfsutil Link Add "\\isea.ru\Sites$\$domain" "\\IIS-01\Site$\$domain" | out-null
dfsutil property  acl reset "\\isea.ru\Sites$\$domain" | out-null
dfsutil property  acl grant "\\isea.ru\Sites`$\$domain" 'isea\Sites (res):R' protect | out-null
$tmp = "`"isea\"+$gpreS+'"'+ ':R'
dfsutil property  acl grant "\\isea.ru\Sites`$\$domain"  $tmp | out-null

ToDo
В дальнейшем хочется данный скрипт добавить:
1. возможностью проверки на существование пользователя/группы/веб узла/записей в DNS
2. избавится от страшной и ненужной переменной $tmp
3. найти способ настройки «анонимной проверки подлинности», а то пока вручную приходится прописывать
4. добавить генерацию пароля
—————————————
Предложения и замечания принимаются.

P.S. для для написания скрипта использовались PowerShell Snap-in for IIS 7.0 (x86) для упрвления IIS и PowerShell Commands for Active Directory для работы с AD

Находим у кого размер папки больше установленного значения.

17 Март 2009
Комментарии отключены

Сам скрипт user-dir-size.pl1

param ($path,$size,$diff,$min)
#$diff = "no";
$text = "`n
        `t Надо использовать следующий синтаксис скрипта:                              
        `t -path - путь до домашней папки                                            
        `t -size - размер папки, поддерживается сокращения: Gb,Mb,Kb                
        `t -diff - вычислить кто почти достиг придела в диапазоне: yes|no. Default no
        `t -min  - минимальный размер, используется в паре с -size                  
        `t---------------------------------------------------------------------------
        `t Пример:                                                                  
        `t ./user-dir-size.ps1 -path "
"E:\Homes\"" -size 1Gb                          
        `t ./user-dir-size.ps1 -path "
"E:\Homes\"" -size 1Gb -diff yes -min 900Mb"
 
if ((!$diff) -or ($diff -eq "no")) {
    if (!$path -or !$size ) {
    write-warning $text ;
    return
    }
    else{
Get-ChildItem -LiteralPath $path |  
Where-Object {$_.PSIsContainer} |  
ForEach-Object {  
    $u=$_
    $u | Get-ChildItem -Recurse |
    Measure-Object  Length -Sum |
    Where-Object {($_.sum -gt $size)} |
    Select @{name="Name"; expression={$u.name}},  
        count,  
        @{n="Summ"; e={"{0:n2}Mb" -f ($_.sum/1Mb)}}  
} | ConvertTo-Html -Head " <link rel='stylesheet' href='styles.css' type='text/css' />" |Out-file  "Превышена квота.html"
    }
}
else {
    if ((!$path -or !$size -or !$min) -or ($diff -ne "yes")) {
    write-warning $text ;
    return
    }
    else {Get-ChildItem -LiteralPath $path |  
Where-Object {$_.PSIsContainer} |  
ForEach-Object {  
    $u=$_
    $u | Get-ChildItem -Recurse |
    Measure-Object  Length -Sum |
    Where-Object {($_.sum -gt $min) -and ($_.sum -lt $size)} |
    Select @{name="Name"; expression={$u.name}},  
        count,  
        @{n="Summ"; e={"{0:n2}Mb" -f ($_.sum/1Mb)}}  
}| ConvertTo-Html -Head " <link rel='stylesheet' href='styles.css' type='text/css' />" |Out-file  "Близок к превышению.html"
 
    }
}

Таблица стилей styles.css

body {
background-color: #CCC;
}
body,table,td,th {font-family:Tahoma; color:black;Font-Size;12pt}
th {
font-weight:bold;
background-color: #99F ;
}
td {background-color: white; }
table {
background-color: #000;
text-align: center;
}

Данный скрипт считает общий объем домашней папки и выводи в красивую html табличку тех товарищей, чей объем папки превысил 1Gb места

Смена владельца папки/файла

Вот и мой первый так сказать скриптец который в папке с домашними папками доменных пользователей восстанавливает владельцев папки исходя из названии папки. Так как у нас в пусть до домашней папки выглядит так //server.domain.ru/Homes$/%username%. Вот сам скрипт:

Get-ChildItem -Path D:\Homes | ForEach-Object { icacls $_ /setowner "DOMAIN\$_" /T }

Рекомендую перед запуском скрипта запустить icacls D:\Homes /save C:\acl.txt /T для того чтоб на свякий случай сохранить дамп пермишенов.

P.S. все это дело для Windows Server 2008, так как icacls входит в его состав. Для Windows Server 2003 есть cacls.

Переместить пользователей по подразделениям исходя из их местонахождения в исходном домене

Спасибо товарищу Alexander Donin с форума Microsoft за помощь в написании данного скрипта на PowerShell для раскидывания пользователей по подразделениям исходя из их положения в исходном домене. Данный скрипт помогает раскидать пользователей в целевом доменене по подразделением при их переносе с помощью ADMT

#Заменить имя OU
$Ou="Migr_users"
#Заменить имя нового домена
$Domain1="DC=domain_new,DC=ru"
#Заменить имястарого домена
$Domain2="DC=domain_old,DC=ru"
#Ищем пользователей в OU
$Path1 = "LDAP://OU=" + $OU + "," + $domain1
$Path2 = "LDAP://" + $domain2
$Search = New-Object DirectoryServices.DirectorySearcher([ADSI]$Path1)
$Search.filter = "(&amp;(objectCategory=user)(cn=*))"
$Users = $Search.Findall()
# для каждого
foreach ($User_n in $Users ){
#находим соотв. в старом домене
$User = [ADSI]$User_n.Path
$USerName = [string]$User.Name
$Search2 = New-Object DirectoryServices.DirectorySearcher([ADSI]$Path2)
$Search2.filter = "(&amp;(objectCategory=user)(cn=$USerName))"
$User_old = $Search2.FindOne()
#меняем в пути имя домена
$User_old = [ADSI]$User_old.Path
$User_old_tmp = [string]$User_old.distinguishedName
$Path3 = [string]$user_old_tmp.Replace($domain2,$domain1)
#удаляем начало (СN=имя пользователя,)
$UserCN="CN=" + $user_old.CN + ","
$Path3 = "LDAP://" + [string]$Path3.Replace([string]$UserCN,"")
#собственно перемешение
$user.psbase.MoveTo([adsi]$Path3)
}
#Конец