Необходимо было написать скрипт завода сайтов в 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