Powershell for Windows

30.11.2011

01.06.2010

Получение списка членов локальной группы на всех компьютерах доменной сети.


function Seach-LocalGroupMemberDomenNetwork(){
param(
$Domen,
$GroupSID

)

function Ping ($Name){
$ping = new-object System.Net.NetworkInformation.Ping
if ($ping.send($Name).Status -eq "Success") {$True}
else {$False}
trap {Write-Verbose "Error Ping"; $False; continue}
}


[string[]]$Info
[string[]]$Computers


# Получам список компьютеров доменной сети
$Computers = Get-QADComputer -Service $Domen -OSName '*XP*','*Vista*','*7*' -SizeLimit 0 -ErrorAction SilentlyContinue |
Select-Object name -ExpandProperty name

foreach ($Computer in $Computers){
# Проверяем доступен компьютер или нет
$Alive = Ping $Computer
if ($Alive -eq "True"){Write-Host "Seach $Computer" -BackgroundColor Blue

# Получаем имя группы
Trap {Write-Host "Error WMI $Computer";Continue}
$GroupName = Get-WmiObject win32_group -ComputerName $Computer |
Where-Object {$_.SID -eq '$GroupSID'} |
Select-Object name -ExpandProperty name

if ($GroupName){
# Получаем список членов локальной группы
Trap {Write-Host "Error ADSI $Computer";Continue}
$Users = ([ADSI]"WinNT://$Computer/$GroupName").psbase.invoke("Members") |
% {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}

# Записываем результаты
$Info += $Users | % {$_ | Select-Object @{e={$Computer};n='Computer'},@{e={$_};n='Login'}}
}
}
}
# Вывод результатов
$Info

}

Для переменой $GroupSID данные можно найти в документе Well-known security identifiers in Windows operating systems.

Пример:

Seach-LocalGroupMemberDomenNetwork -Domen Mydomen -GroupSID S-1-5-32-544
Получаем список пользователей локальной группы администраторов на всех компьютерах домена.

25.09.2009

Импорт контактов из другого домена

Filed under: PowerShell, Windows — Метки: , , , , , , , , — Yamshikov Pavel @ 8:01 дп

Когда у вас работает Active Directory и почтовая система Exchange, то пользователи получают глобальную адресную книгу, в которой есть почтовые адреса всех пользователей AD и всех почтовых контактов заведенных в AD. Это очень удобно: достаточно набрать в Outlook-е фамилию и адрес будет найден автоматически или предложены варианты.

Не редко рядом с нашим доменом или лесом существуют другие: соседних организаций, подразделений, фирм и т.п. При интенсивной переписке с пользователями из этих доменов хочется иметь их адресную книгу, чтобы каждый раз не искать нужного человека и не выяснять какой у него почтовый адрес или номер телефона. Обычно пользователи сами создают контакты у себя в Outlook-е. Но тогда теряется преимущество глобальной адресной книги: каждый пользователь должен сам найти информацию и создать контакт у себя. Лучше если это сделает один раз администратор, и контакты будут доступны всем пользователям. Но заводить контакты в большом количестве достаточно обременительно. К тому же их надо периодически обновлять.

Для синхронизации лесов (доменов) существуют специальные приложения. Например, Microsoft Identity Lifecycle Manager (ILM) или его предыдущая версия Microsoft Identity Integration Server (MIIS). Это мощние универсальные продукты, которые позволяют синхронизировать учетные записи, их свойства, пароли, сертификаты и все остальные атрибуты, позволяют гибко настраивать списки синхронизируемых объектов и их атрибутов, правила разрешения конфликтов и т.д. С помощью этих продуктов можно решить поставленную задачу. Вот только они платные и сложные. И в простых случаях, как наш, нет необходимости их использовать – можно обойтись досточно простым скриптом.

Вот пример простого скрипта на Powershell, который импортирует учетные записи пользователей как контакты из другого домена. Для выполнения скрипта нужно иметь права на создание контактов в родном домене и права на чтение учетных записей во втором домене. Вы можете легко изменить список атрибутов, которые синхронизируются этим скриптом по аналогии.

Вот сам скрипт:

$base = [ADSI]»LDAP://ou=Contacts, ou=DEP,dc=domain,dc=ru»

$users = (new-object System.DirectoryServices.DirectorySearcher([ADSI]»LDAP://ou=DEP1,dc=domain1,dc=ru»,»(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(title=*)))»)).findAll()

$users | ForEach-Object {

$_ = $_.GetDirectoryEntry()
$NewContact = $base.Create(«contact»,»cn=» + $_.cn)

$NewContact.SetInfo()

$NewContact.extensionAttribute15 = $base.distinguishedName

$NewContact.displayname = $_.displayname
$NewContact.givenname = $_.givenname
$NewContact.sn = $_.sn
$NewContact.initials = $_.initials
$NewContact.description = $_.description

$NewContact.department = $_.department
$NewContact.title = $_.title
$NewContact.company = $_.company

$NewContact.telephoneNumber = $_.telephoneNumber
$NewContact.othertelephone = $_.othertelephone

$NewContact.ipPhone = $_.ipPhone
$NewContact.otherIpPhone = $_.otherIpPhone

$NewContact.mobile = $_.mobile
$NewContact.otherMobile = $_.otherMobile

$NewContact.facsimileTelephoneNumber = $_.facsimileTelephoneNumber
$NewContact.otherfacsimileTelephoneNumber = $_.otherfacsimileTelephoneNumber

if ($_.proxyaddresses) {

$NewContact.proxyaddresses = $_.proxyaddresses
$NewContact.targetAddress = $_.proxyaddresses -clike «SMTP:*»
$NewContact.mailNickname = $_.cn

}

$NewContact.SetInfo()

}

Источник

21.07.2009

Как удаленно перезагрузить контроллер домена Windows 2003 в DSRM

Filed under: Windows — Метки: , , , , , — Yamshikov Pavel @ 8:40 дп

Порой возникают ситуации, когда приходится администрировать инфраструктуры удаленно через RDP. Долго ли, коротко ли, приходит время перезагрузить контроллер домена в Directory Services Restore Mode (DSRM). Если контроллер доступен по RDP, т.е. ситуация не внештатная (например, необходимо перенести базу AD на другой диск), всё можно элегантно сделать не выезжая на точку. Поможет нам в этом утилита bootcfg. Подключаемся к контроллеру по RDP с полномочиями администратора домена.

Часть 1. Подготовительные действия.

Шаг 1. Смотрим содержимое файла boot.ini:

bootcfg /s имя_контроллера /query

Boot Loader Settings
——————–
timeout:30
default:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

Boot Entries
————
Boot entry ID: 1
OS Friendly Name: Windows Server 2003 Enterprise x64 Edition
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect

Шаг 2. Добавляем строку загрузки для DSRM:

bootcfg /s имя_контроллера /copy /id 1 /d DSRM

SUCCESS: Made a copy of the boot entry “1″

Теперь записей в boot.ini две:

bootcfg /s имя_контроллера /query

Boot Loader Settings
——————–
timeout:30
default:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

Boot Entries
————
Boot entry ID: 1
OS Friendly Name: Windows Server 2003 Enterprise x64 Edition
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect

Boot entry ID: 2
OS Friendly Name: DSRM
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect

Шаг 3. Добавляем ключ загрузки в DSRM для второй записи

bootcfg /s имя_контроллера /raw “/SAFEBOOT:DSREPAIR” /a /id 2

SUCCESS: Added the switch to OS entry for line “2″ in the BOOT.INI file.

Теперь вторая запись в boot.ini имеет дополнительный ключ:

bootcfg /s имя_контроллера /query

Boot Loader Settings
——————–
timeout:30
default:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

Boot Entries
————
Boot entry ID: 1
OS Friendly Name: Windows Server 2003 Enterprise x64 Edition
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect

Boot entry ID: 2
OS Friendly Name: DSRM
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect /safeboot:dsrepair

Собственно, всё. В качестве полировки можно изменить дефалтное время выбора варианта загрузки с 30 секунд до, предположим, пяти:

bootcfg /s имя_контроллера /timeout 5

SUCCESS: Changed the timeout value in the BOOT.INI.

bootcfg /s имя_контроллера /query

Boot Loader Settings
——————–
timeout:5
default:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

Boot Entries
————
Boot entry ID: 1
OS Friendly Name: Windows Server 2003 Enterprise x64 Edition
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect

Boot entry ID: 2
OS Friendly Name: DSRM
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect /safeboot:dsrepair

Часть 2. Перезагрузка.

Перед перезагрузкой сервера в DSRM необходимо обозначить в качестве загрузки по умолчанию второй, только что созданный вариант «DSRM»:

bootcfg /s имя_контроллера /default /id 2

SUCCESS: Changed the default OS entry in the BOOT.INI.

Проверяем результат:

bootcfg /s имя_контроллера /query

Boot Loader Settings
——————–
timeout:5
default:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

Boot Entries
————
Boot entry ID: 1
OS Friendly Name: DSRM
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect /safeboot:dsrepair

Boot entry ID: 2
OS Friendly Name: Windows Server 2003 Enterprise x64 Edition
Path: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
OS Load Options: /noexecute=optout /fastdetect

Выполняем перезагрузку контроллера:

shutdown /r /t 10 /f

Часть 3. Работы в DSRM.

Терминальные службы работают в DSRM. После старта системы можно зайти в нее под логином и паролем администратора восстановления и произвести требуемые действия. Предположим, мне необходимо провести сжатие и дефрагментацию базы AD и ее перемещение на другой диск.

ntdsutil –> files –> info –> compact to C:\NTDS.NEW –> quit –> quit

copy “C:\NTDS.NEW\ntds.sit” “C:\WINDOWS\NTDS\ntds.dit” (owerwrite = yes)

del C:\WINDOWS\NTDS\*.log

ntdsutil –> files –> info –> move db to D:\NTDS

move logs to D:\NTDS

quit –> quit

delete C:\NTDS.NEW

Теперь, когда работы завершены, необходимо вернуть первоначальную конфигурацию загрузки в boot.ini, чтобы после перезагрузки контроллер поднялся в рабочем режиме. Для этого выполняем команды:

bootcfg /s имя_контроллера /query

bootcfg /s имя_контроллера /default /id 2

shutdown /r /t 10 /f

Контроллер перезагрузится в штатном режиме.

Источник

Создайте бесплатный сайт или блог на WordPress.com.