Метка: powershell
[PowerShell] Блокировка пользователей в AD с истекшим паролем
Я уже выкладывал скрипт для блокировки компьютеров в AD с Last Logon больше 90 дней, теперь пришло время пользователей. Для блокировки использую PowerShell с командлетами Quest. Скрипт ищет пользователей в определенном контейнере, если у них пароль не менялся более 90 дней назад, то блокирует учетку и делает пометку в поле Notes этой учетки.
$Date = (Get-Date -format d) Get-QADUser -PasswordNotChangedFor 90 -SearchRoot 'contoso.com/Users' | ` Disable-QADUser | ` Set-QADUser -Notes "Disabled - $Date, password expired > 90 days ago" | ` Select name
Для поиска учеток использую параметр – PasswordNotChangedFor со значением 90 дней, этого достаточно, чтобы отсеить отпускников, командировочных и т.д. Если этот скрипт запускать регулярно, то стоит добавить фильтр на уже заблокированные учетки, чтобы каждый раз не перезаписывать поле Notes. Фильтр можно взять из скрипта блокировки компьютеров (ссылка выше).
Тормозной поиск учеток ActiveDirectory в SharePoint 2010
Проблема медленного поиска учетных записей AD в SharePoint 2010 нервирует администраторов уже очень давно. Соглаитесь, что на поиск учетки не может уходить около 30 секунд. А если необходимо добавить ста пользователям различные права доступа на портале? Ужас!
Но не все знают, что проблема решается очень просто, одной командой на PowerShell. Запускаем SharePoint 2010 Management Shell и ввводим следующую команду:
Set-SPSite -Identity "http://portal.contoso.com" -UserAccountDirectoryPath "DC=contoso,DC=com"
Естественно, необходимо поменять название домена и сайта. Можно не ограничиваться уровнем домена, а указать путь до какого-нибудь контейнера OU с пользователями и группами.
[PowerShell] Блокировка ПК с Last Logon больше 90 дней
При большом парке компьютеров в домене сложно выявлять те, на которые давно никто не логинился. Тут PowerShell с командлетами Quest приходит на помощь. Простенький скрипт блокирует компьютеры, на которые никто не логилился больше 90 дней и вносит комментарий с датой блокровки в поле Description.
$Date = (Get-Date -format d) Get-QADComputer -NotLoggedOnFor 90 -SearchRoot 'contoso.com/Computers' -LdapFilter '(!(userAccountControl:1.2.840.113556.1.4.803:=2))' | Disable-QADComputer | Set-QADComputer -Description "Disabled - $Date, LastLogon > 90 days" | Select name
Параметре –NotLoggedOnFor отвечает за значение LastLogon, т.е. больше скольки дней;
Фильтр -LdapFilter '(!(userAccountControl:1.2.840.113556.1.4.803:=2))' исключает уже заблокированные ПК.
[PowerShell] Обновление данных учетных записей в ActiveDirectory
Есть XML файл с актуальными данными сотрудников, из которого нужно обновить некоторые данные у учетных записей в ActiveDirectory (далее – AD). Уникальным индификатором является GUID (Как получить GUID и objectGUID из ActiveDirectory), которые уже выгружены из AD. Как прочитать данные из XML файла с помощью PowerShell я уже писал, поэтому здесь опишу часть скрипта, которая непосредственно вносит изменения в AD. Для работы с AD использую командлеты Quest Powershell.
XML файл имеет следующую структуру:
Последовательно считываем все учетки, берем GUID и остальные данные. В AD изменения вносятся следющей командой:
Set-QADUser $xmluser.GUID -Title $xmluser.title -Description $xmluser.title -Department $xmluser.department.Trim() -Notes $xmluser.info | Out-Null
Казалось бы вопрос решен, но в AD не есть не только пользователи, но и контакты. А командлет Set-QADUser работает только с учетными записями. Если необходимо взаимодействовать с учетными записями и контактами, как в моем случае, то используем командлет Set-QADObject:
Set-QADObject $xmluser.GUID -ObjectAttributes @{title=$xmluser.title;description=$xmluser.title;department=$xmluser.department.Trim();info=$xmluser.info} | Out-Null
Trim () – удаляет пробелы в строке.
Полное описание командлетов Set-QADObject и Get-QADObject с примерами.
Можно также отключать и включать учетные записи в AD с помощью командлета Set-QADObject:
Set-QADObject $xmluser.GUID -ObjectAttributes @{userAccountControl='512'} | Out-Null
512 – вкл, 514 – выкл.
[PowerShell] Данные из XML файла
Есть XML файл с данными сотрудников компании следующей структуры:
Необходимо из некого выгружать данные с помощью PowerShell. Скрипт достаточно простой получился:
# Пробелы в квадратных скобках нужно убрать [ xml ]$xmlfile = Get-Content "D:\xml\test.xml" foreach($xmluser in $xmlfile.domainusers.user) { Write-Host $xmluser.ФИО Write-Host $xmluser.Телефон }
В примере скрипт выводит данные из двух тэгов – ФИО и телефон.
Импорт данных из XML файла в список SharePoint с помощью PowerShell
Появилась задача загрузить данные из файла XML в список SharePoint 2010. XML имеет следующую структуру:
В SharePoint 2010 заранее создал список — Список пользователей, с соответствующими полями. Вот скрипт на PowerShell, который возьмет данные из файла XML и загурузит в список SharePoint:
if(!(Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction:SilentlyContinue)) { Add-PSSnapin Microsoft.SharePoint.Powershell #Set these two variables accordingly $WebURL = “http://portal.contoso.com/” $ListName = "Список пользователей" $XMLFilePath = "C:\scripts\xml\test.xml" #Get the Web $web = Get-SPWeb $WebURL #Get the List $ProjectList = $web.Lists[$ListName] #import xml file [*xml]$ProjectXmlFile = Get-Content $XMLFilePath foreach ($XMLProject in $ProjectXmlFile.domainusers.user) { $NewProject = $ProjectList.Items.Add() $NewProject["ФИО"] = $XMLProject.ФИО $NewProject["Отдел"] = $XMLProject.Отдел $NewProject["Должность"] = $XMLProject.Должность $NewProject["Комната"] = $XMLProject.Комната $NewProject["Рабочий телефон"] = $XMLProject.Телефон $NewProject["Адрес электронной почты"] = $XMLProject.Почта $NewProject.Update() Write-Host "Project $($XMLProject.ФИО) has been Added to External Projects list!" }
* в коде есть место — [*xml], так звездочку нужно удалить.
Это скрипт подойдет только для разовой загрузки данных, т.к. скрипт не заменяет данные в списке SharePoint, а еще раз их туда запишет, если его повторно запустить. Т.е. в списке будет две Ивановой, и две Соколовой.
Как узнать версию SharePoint
Все время забываю, где можно посмотреть версию SharePoint. Так что это напоминалка для себя.
1. Версию SharePoint можно посмотреть в Центре администрирования –> Параметры системы –> Управление серверами в этой ферме.
2. С помощью PowerShell:
Get-SPFarm | Select BuildVersion
Командлет доступен только через Командную консоль SharePoint 2010, если через обычную консоль PowerShell, то необходимо добавить оснастку Microsoft.SharePoint.Powershell.
if(!(Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction:SilentlyContinue)) { Add-PSSnapin Microsoft.SharePoint.Powershell } get-spfarm | select BuildVersion
3. Еще один вариант:
([Microsoft.SharePoint.Administration.SPFarm]::Local).buildversion
[PowerShell] Как получить GUID и objectGUID из ActiveDirectory
При выгрузке свойства objectGUID учетных записей пользователей из ActiveDirectory при помощи Quest Powershell выяснилась одна особенность. objectGUID в результате выгрузки отличается от оригинала в AD, т.е. его потом нельзя использовать для поиска учеток в AD без преобразования.
Тут все дело в представлении. Для примера:
Get-QADUser USER | fl objectguid,guid
В результате получим два разных варианта:
objectGUID : 3F8C2B60E1E26C44B6D20FF8F6C3028F
Guid : 602b8c3f-e2e1-446c-b6d2-0ff8f6c3028f
Guid совпадает с оригиналом из AD, а objectGUID его преобразованная версия в формат HexString. Чтобы не забивать себе голову обратным преобразованием, просто используем свойство Guid.
Для наглядного примера можно использовать эти команды:
$guid = (Get-QADUser USER).guid Get-QADUser $guid
В результате должны отобразиться данные USER.
Полезные ссылки по этой теме:
[PowerShell] Как удалить файлы месячной давности
Простенький скрипт на PowerShell для удаления файлов, которые старше месяца:
$date = (Get-Date).AddMonths(-1) $pathFolder = "D:\test1" Get-ChildItem -Path $pathFolder | where {!$_.PSIsContainer} | foreach { if ($_.LastWriteTime -lt $date) { $file = $pathFolder + "\" + $_ Remove-Item $pathFolder $file -whatif } }
За основу взял скрипт отсюда.
[PowerShell] Последний модифицированный файл в каталоге
Найти последний модифицированный файл в каталоге можно так:
$path = "D:\test1" $file = Get-ChildItem -Path $path | Sort-Object LastWriteTime | Select-Object -Last 1 $file.Name