Для получения различной информации об учетных записях компьютера (серверах и рабочих станциях) в домене Active Directory можно использовать PowerShell командлет Get-ADComputer. Это один из наиболее полезных командлетов для выборки и поиска компьютеров по разным критериям в домене AD
Допустим, ваша задача – найти в Active Directory все неактивные компьютеры, которые не регистрировались в домене более 120 дней и заблокировать учетные записи этих компьютеров.
Прежде чем приступить к работе с командлетом Get-ADComputer, необходимо установить и импортировать модуль Active Directory Module для Windows PowerShell.
Import-Module activedirectory
Add-WindowsCapability –online –Name “Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0”
Вывести атрибуты компьютера с помощью Get-ADComputer
Справка о параметрах командлета Get-ADComputer вызывается стандартно с помощью Get-Help:
Get-Help Get-ADComputer
Чтобы получить информацию о доменной учетной записи конкретного компьютера или сервера, укажите его имя в качестве аргумента параметра —Identity:
Get-ADComputer -Identity SRV-DB01
DistinguishedName : CN=DB01,OU=Servers,OU=MSK,DC=winitpro,DC=ru DNSHostName : DB01.winitpro.ru Enabled : True Name : DB01 ObjectClass : computer ObjectGUID : 1234567c-13f8-4a2c-8b00-b30a32324103 SamAccountName : DB01$ SID : S-1-5-21-3243682314-1360322815-2238451561-4318 UserPrincipalName :
Командлет вернул только базовые свойства объекта Computer из AD . Нас интересует время последней регистрации компьютера в домене AD, но этой информация в выводе команды нет. Выведем все доступные свойства (атрибуты) данного компьютера из Active Directory:
Get-ADComputer -Identity SRV-DB01 -Properties *
Этот список атрибутов компьютера также доступен в графической консоли Active Directory Users and Computers (
dsa.msc
) на вкладке редактора атрибутов.
Get-ADComputer -Filter * -Properties * | Get-Member
Как вы видите, время последнего входа данного компьютера в сеть указано в атрибуте компьютера LastLogonDate – 6/2/2022 3:59:30 AM.
Командлет Get-ADComputer позволяет вывести в результатах команды любые из свойств компьютера. Уберем всю лишнюю информацию, оставив в выводе только значения атрибутов Name и LastLogonDate.
Get-ADComputer -identity SRV-DB01 -Properties * | FT Name, LastLogonDate -Autosize
Итак, мы получили данные о последнем времени регистрации в домене для одного компьютера. Теперь нам нужно изменить команду так, чтобы она возвращала информацию о времени последней регистрации в сети для всех компьютеров домена. Для этого заменим параметр –Identity на —Filter:
Get-ADComputer -Filter * -Properties * | FT Name, LastLogonDate -Autosize
Мы получили таблицу, которая содержит только 2 поля: имя компьютера и дата LastLogonData. Вы можете добавить в эту таблицу другие поля объекта Computer из AD. Чтобы вывести данные о компьютерах в определенном контейнере домена (OU), воспользуйтесь параметром SearchBase:
Get-ADComputer -SearchBase ‘OU=Moscow,DC=winitpro,DC=loc’ -Filter * -Properties * | FT Name, LastLogonDate -Autosize
Отсортируем результаты запроса по времени последнего логина в сеть (поле LastLogonDate) с помощью команды Sort:
Get-ADComputer -Filter * -Properties * | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
Итак, мы получили список компьютеров домена и время их последнего входа в сеть Active Directory. Теперь мы хотим заблокировать учетные записи компьютеров, которые не использовались более 120 дней.
С помощью Get-Date получим в переменной значение текущей даты и вычтем из текущей даты 120 дней:
$date_with_offset= (Get-Date).AddDays(-120)
Полученную переменную с датой можно использовать в качестве фильтра запроса Get-ADComputer по полю LastLogonDate
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
Таким образом, мы получили список неактивных компьютеров, которые не регистрировались в домене более 120 дней. С помощью командлета Set-ADComputer или Disable-ADAccount вы можете отключить эти учетные записи.
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonData -lt $date_with_offset } | Set-ADComputer -Enabled $false -whatif
Теперь можно заблокировать все найденные учетные записи компьютеров:
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonData -lt $date_with_offset} | Set-ADComputer -Enabled $false
Использование фильтров в Get-ADComputer
С помощью аргумента -Filter командлета Get-ADComputer вы можете выбрать несколько компьютеров Active Directory по определенным критериями. Здесь можно использовать подстановочные знаки (wildcards) и логические операторы сравнения. В качестве фильтров можно использовать только базовые атрибуты компьютера.
Получить общее количество активных (незаблокированных) компьютеров в Active Directory:
(Get-ADComputer -Filter {enabled -eq "true"}).count
Вы можете использовать множественные фильтры для поиска компьютеров по нескольким параметрам сразу. Для этого используются логические операторы сравнения PowerShell (-and, -eq , -ne , -gt , -ge , -lt , -le , -like , -notlike , -and , -or , и т.д.).
Посчитать количество серверов с Windows Server в домене:
(Get-ADComputer -Filter {enabled -eq "true" -and OperatingSystem -Like '*Windows Server*' }).count
Получить список компьютеров в определенном OU, имена которых начинаются с BuhPC:
Get-ADComputer -Filter {Name -like "BuhPC*"} -SearchBase ‘OU=Moscow,DC=winitpro,DC=loc’ -Properties IPv4Address | Format-table Name,DNSHostName,IPv4Address | ft -Wrap –Auto
При поиске по OU вы можете использовать дополнительный параметр -SearchScope 1, который означает, что нужно искать только в корневом разделе. Параметр -SearchScope 2 означает рекурсивный поиск компьютеров во всех вложенных OU.
Выбрать все рабочие станции с ОС Windows 10:
Get-ADComputer -Filter {OperatingSystem -like '*Windows 10*'}
Получить список серверов в домене с версией ОС, IP адресом и установленным Service Pack:
Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"' -Properties Name,Operatingsystem, OperatingSystemVersion, OperatingSystemServicePack,IPv4Address | Sort-Object -Property Operatingsystem | Select-Object -Property Name,Operatingsystem, OperatingSystemVersion, OperatingSystemServicePack, IPv4Address| ft -Wrap –Auto
На выходе получили такую красивую таблицу со списком Windows Server в AD.
Полезные примеры использования командлета Get-ADComputer
Ниже представлены еще несколько полезных примеров команд с использованием командлета Get-ADComputer, которые можно использовать для выборки и поиска компьютеров домена по определенными критериям.
Атрибут -LDAPFilter позволяет использовать в качестве параметра командлета Get-ADComputer различные LDAP запросы, например:
Get-ADComputer -LDAPFilter "(name=*db*)"|ft
Выбрать заблокированные компьютеры в определенном OU:
Get-ADComputer -filter * -SearchBase ‘OU=Computers, dc=winitpro,dc=loc’ | Where-Object {$_.enabled -eq $False}
Чтобы удалить все аккаунты компьютеров в домене, не авторизовавшиеся в домене более 6 месяцев, можете воспользоваться командой:
get-adcomputer -properties lastLogonDate -filter * | where { $_.lastLogonDate -lt (get-date).addmonths(-6) } | Remove-ADComputer
Вывести время последней смены пароля компьютера в Active Directory. По умолчанию пароль должен меняться компьютером автоматически раз в 30 дней, если пароль компьютера не совпадает с паролем в AD, доверительные отношения компьютера с доменом будут нарушены:
Get-ADComputer –Identity pc123456 -Properties PasswordLastSet
Результат выполнения команды Get-ADComputer можно выгрузить в текстовый файл:
Get-ADComputer -Filter { OperatingSystem -Like '*Windows Server 2019*' } -Properties OperatingSystem | Select DNSHostName, OperatingSystem | Format-Table -AutoSize C:\Script\server_system.txt
Также вы можете получить выборку компьютеров и экспортировать его в CSV файл:
Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem,OperatingSystemServicePack | Export-CSV All-Windows.csv -NoTypeInformation -Encoding UTF8
Или получить HTML файл отчета со списком компьютеров и нужных атрибутов компьютера:
Get-ADComputer -Filter {OperatingSystem -Like '*Windows Server 2012*' } -Properties * | Select-Object Name,OperatingSystem | ConvertTo-Html | Out-File C:\ps\ad_computer.html
Можно удалено получить различную информацию с компьютеров AD через WMI (или CIM). Например, вывести серийные номера всех серверов в домене:
Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"' | Select-Object Name | Foreach-Object {Get-CimInstance Win32_Bios -ComputerName $_.Name -ErrorAction SilentlyContinue | Select-Object PSComputerName,SerialNumber}
Чтобы выполнить определенной действие со всеми компьютерами из полученного списка нужно использовать цикл Foreach. В этом примере мы хотим получить список серверов в домене с моделью и производителем:
$Computers = Get-ADComputer -Filter {OperatingSystem -Like '*Windows Server*'}
Foreach ($Computer in $Computers)
{
$Hostname = $Computer.Name
$ComputerInfo = (Get-WmiObject -Computername $Hostname Win32_ComputerSystem)
$Manufacturer = $Computer.Manufacturer
$Model = $Computer.Model
Write-Host "Name: $Hostname"
Write-Host "Manufacturer: $Manufacturer"
Write-Host "Model: $Model"
Write-Host " "
$Content = "$Hostname;$Manufacturer;$Model"
Add-Content -Value $Content -Path "C:\PS\ServersInfo.txt"
}
Либо можно использовать более короткий синтаксис цикла. Допустим нам нужно выполнить определенную команду на всех компьютерах в определенном OU. В этом примере мы с помощью Invoke-Command выполним на всех серверах команду обновления настроек групповых политик:
get-adcomputer -SearchBase "OU=Servers,DC=winitpro,DC=loc" -Filter * | %{ Invoke-Command -Computer $_.Name -ScriptBlock {gpupdate /force} }
С помощью Get-ADComputer и логон скриптов PowerShell вы можете контролировать различные параметры компьютера или хранить различную полезную информацию в атрибутах компьютера в AD (можно например добавить имя пользователя в описание компьютера).
Я, например, контролирую состояние агента SCCM на компьютерах пользователей. При загрузке каждого компьютера на нем отрабатывает логон скрипт, который с помощью Set-ADComputer сохраняет состояние службы ccmexec в свободный атрибут компьютера — extensionAttribute10.
Затем с помощью следующей команды я могу найти компьютеры, на которых отсутствует или не запушена служба CCMExec:
get-adcomputer -filter {extensionAttribute10 -ne "SCCM Agent:Running"} -SearchBase “OU=Computers,OU=MSK,DC=winitpro,DC=ru” -properties dNSHostName,extensionAttribute10,LastLogonDate |select-object dNSHostName,extensionAttribute10,LastLogonDate
Не подскажите почему не работает? Windows Server 2012R2 в домене:
PS C:\Users\aaa> Import-Module activedirectory
Import-Module : Указанный модуль «activedirectory» не был загружен, так как ни в одном из каталогов модулей не был обна
ружен действительный файл модуля.
строка:1 знак:1
+ Import-Module activedirectory
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (activedirectory:String) [Import-Module], FileNotFoundException
+ FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand
PS C:\Users\aaa> Get-ADComputer -Identity w302028
Get-ADComputer : Имя «Get-ADComputer» не распознано как имя командлета, функции, файла сценария или выполняемой програм
мы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:1
+ Get-ADComputer -Identity w302028
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-ADComputer:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\Users\aaa>
Попробуй скачать и установить Windows RSAT package, не знаю как с 2012, но с 10-кой так прокатило. ) А уже потом Import-Module activedirectory
Как узнать кто ввел ПК из ОУ domain.local/Computers в домен?
Официального способа узнать кто ввел ПК в домен не знаю. В некоторых случаях полезная информация может быть на вкладке Security объекта в домене. Посмотрите есть ли в списке ACL персонально чья-то учетная запись, права которой не наследованы с верхнего уровня. Скорее всего это и есть пользователь, который ввел компьютер в домен
Я применяю триггер в журнале событий, срабатывающий при возникновении EventID 4741:
Get-WinEvent -maxevents 1 -FilterHashtable @{LogName = «Security»;ID = 4741;StartTime = (Get-Date).AddSeconds(-120)} | Select TimeCreated, `
@{n = «Computer name»;e = {([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq «TargetUserName»} | %{$_.’#text’}}}, `
@{n = «Created by»;e = {([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq «SubjectUserName»} | %{$_.’#text’}}}, `
@{n=»DC»;e={([xml]$_.ToXml()).Event.System.Computer}}
где Created by (SubjectUserName) и есть та учетка, от имени которой вводили компьютер в домен.
Скажите пожалуйста вот есть команда:
Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem,OperatingSystemServicePack,IPv4Address,Description| Export-CSV All-Windows.csv -NoTypeInformation -Encoding UTF8
Как еще можно в этот же файл добавить данные из учетки Job Title, Departament.
То есть можно ли за раз файл получить — ip, имя компьютера, описание, должность, отдел, ОС, версия сервис пака
Тут не понятно, как вы хотите сопоставлять компьютер с пользователем (какой пользователь работает за каким компьютером)
Как вариант — настроить логон скрипт, чтобы он сохранял в поле компьютеры descriptoin имя текущего пользователи при входе в систему
Возможно ли в PS выяснить какой из пользователей и на каком компьютере авторизовывался и время входа? Спасибо!
В AD этой информации нет, но можно написать собственные Logon скрипты, которые бы записывали данные в учетные записи AD пользователей и компьютеров. Тогда в дальнейшем с помощью PowerShell можно будет без труда собрать эти данные
Добрый день! Как сделать запрос ,чтобы узнать какие компьютеры входили в домен например 15.02.2017? Заранее спасибо за ответ.
$Search_From= [datetime]»02/15/2017 00:00:00″
$Search_To= [datetime]»02/16/2017 00:00:00″
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -gt $Search_From -AND LastLogonDate -lt $Search_To } | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
Есть команда Get-Item -Path ‘Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion’
в ее выводе есть строка UBR, которая показывает версию сборки ОС
Как мне собрать инфу в домене по сборкам ОС из файла, в котором перечислены нужные для аудита сети? Спасибо
Get-ADComputer -Filter * -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap –Auto > C:\temp\comps.txt просмотр всех компьютеров в домене и их имен операционных систем их версий ,сервис пак.
Get-ADComputer -Filter * -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap –Auto > C:\temp\comps.txt просмотр всех компьютеров в домене и их имен операционных систем их версий ,сервис пак. В статье выше написано про это. Читайте внимательно.
Это я пробовал и выдает он полную инфу
C100 Windows 10 Pro 10.0 (10586)
А мне нужен чтобы было C100 Windows 10 Pro 10.0 (10586.916)
Мне нужна полная версия ОС
Выполните мою команду и увидите доп строки. Вот как мне добиться получения полного вывода об ОС? Спасибо!
Из AD вы не получите полный номер сборки ОС. Он там просто не хранится.
В вашем случае вероятно, придется скриптом через WMI / PowerShell Remoting подключатся к каждому компьютеру из списка (или из AD) и проверять значение нужно ключа (естественно ПК должны быть доступны по сети).
Мне не принципиально брать это из АД.
Мне нужен рабочий скрипт, который обошел бы все доступные ПК из файла (либо по именам ПК, либо по ip адресам) и результат в файлик положить. Вот таких нет наработок?
Я бы делал как-то так (при условии, что у вас на компьютерах включен winrm):
cls
function Test-Host ($Name)
{
$ping = new-object System.Net.NetworkInformation.Ping
trap {Write-Verbose «Ошибка пинга»; $False; continue}
if ($ping.send($Name).Status -eq «Success» ) { $True }
else { $False }
}
#Зададим корневое OU, с которого будет начат поиск компьютеров
$SearchRoot=»OU=Workstations,DC=CORP,DC=DOMAIN,DC=RU»
$Comps = Get-ADComputer -ErrorAction SilentlyContinue -SearchBase $SearchRoot -Filter *
# Или берем из текстового файла
# $Comps = get-content comps.txt
foreach ($Comp in $Comps){
if (Test-Host $Comp.Name) {
$CompName = $Comp.Name
Write-Host $CompName
Invoke-Command -ComputerName $CompName -ScriptBlock {(Get-ItemProperty -Path ‘Registry::HKLM\Software\Microsoft\Windows NT\CurrentVersion’).UBR}
}
}
Доброго времени суток. Требуется извлечь из АД список всех ПК с ОС Windows ХР?
Пробовал строкой Get-ADComputer -Filter { OperatingSystem -Like ‘*XP*’ } -Properties OperatingSystem | Select Name, OperatingSystem | Format-Table -AutoSize C:\Script\XP.txt — не работает.
Что я делаю не так? Помогите плиз.
Подскажите, как сделать скрипт, по нажатию на который будет запрашивать имя ПК, далее вводим имя ПК и по нажатию на Enter выводит нужную информацию:
Get-ADComputer -Identity имя_ПК -Properties PasswordLastSet
Спасибо.
Самый простой вариант: у пользователя в диалоговом окне запрашивается имя ПК, в ответ возвращается всплывающее окно со значением атрибута PasswordLastSet:
Add-Type -AssemblyName Microsoft.VisualBasic
$PC = [Microsoft.VisualBasic.Interaction]::InputBox('Enter PC name', 'PC', "$env:computername")
$lstpwd = Get-ADComputer -Identity $PC -Properties PasswordLastSet | Select-Object PasswordLastSet
[System.Windows.MessageBox]::Show($lstpwd."PasswordLastSet" )
Спасибо!
У меня получилось вот так:
$Computername = Read-Host «Имя компьютера»
Get-ADComputer -Identity $Computername -Properties PasswordLastSet
но только информация не выводится, а сразу схлопывается (закрывается) окно powershell.
Что необходимо дописать в конце, что бы выводилась информация и команда начиналась по новой, не закрывая окно powershell.
Спасибо.
Я вам специально код показал, коорый выводит результат в всплывающем окне. Для пользователей это обычно проще.
Если хочется работать именно с консолью, чтобы не закрывалась консоль PowerShell, можно добавить в конце
Read-Host -Prompt "Press Enter to exit"
или
сделать паузу на несколько секунд
Start-Sleep -s 30
Спасибо!
Добрый день, тут еще отвечают на вопросы))
Команды показывают неправильное время регистрации. Проверил на своем рабочем ПК, предварительно выключив его. Затем включил и вошел в домен. На контроллере домена запросил информацию о своем ПК, команда показала что последняя регистрация была неделю назад. ПК перезагружается каждый день. В чем причина такого несоответствия?
На самом деле статья о примере использования командлета get-Aduser, а не lastLogon.
Вообще говоря lastLogon — это атрибут, который не реплицируется между контроллерами домена. В вашем случае просто оказалось, что компьютер регистрируется на одном DC, а вы запрашиваете информацию с другого.
Наверно правильнее использовать атриубут lastLogonTimestamp (он реплицируется)
Я нашел другой ответ. Использую команду из вашего примера:
Get-ADComputer -Filter * -Properties * | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
Именно значение LastLogonDate, как и LastLogonTimeStamp будут показывать устаревшие данные всегда, потому что обновляются примерно один раз в 12 дней.
А вот если применить команду для user1:
Get-ADUser user1 -Properties LastLogon | Select name, @{Name=»LastLogon»;Expression={[datetime]::FromFileTime($_.’LastLogon’)}}
где используется просто LastLogon, то там всё точно до секунды. Можете помочь с адаптацией этой команды для всех пользователей домена и сортировкой по времени наподобие этой ваше команды:
Get-ADComputer -Filter * -Properties * | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
Добрый день. Очень нужна помощь в написании такого вот скрипта:
В AD у объекта Компьютер есть атрибут employeeID. В нем хранится инвентарный номер физического компьютера.
1. Должен быть запрос на ввод инвентарного номера физического компьютера
2. Если в AD компьютера с таким инвентарным номером нет – выводится сообщение, что такой компьютер на найден.
3. Если в AD компьютера с таким инвентарным номером найден – выводится имя этого компьютера.
Добрый день!
Вот простейший скелет скрипта поиска по определенному полю компьютера в AD:
import-module activedirectory
$InvID = Read-Host -Prompt 'Vvedite inventarniy nomer'
$Computer = Get-ADComputer -Filter {employeeID -Like $InvID}
If ($Computer -eq $Null) {"Computer ne nayden"}
Else {write-host $Computer.dNSHostName}
Спасибо большое! Все работает! На базе вашего «скелета» доработал скрипт с «телом» 🙂
Add-Type -AssemblyName Microsoft.VisualBasic
$InvID = [Microsoft.VisualBasic.Interaction]::InputBox(‘Введите инвентарный номер компьютера’, ‘ПОИСК КОМПЬЮТЕРА В ACTIVE DIRECTORY’)
$Computer = Get-ADComputer -Filter {employeeID -Like $InvID}
If ($Computer -eq $Null) {[System.Windows.MessageBox]::Show(‘Компьютер с таким инвентарным номером не найден’, ‘РЕЗУЛЬТАТЫ ПОИСКА В ACTIVE DIRECTORY’)}
Else {[System.Windows.MessageBox]::Show($Computer.Name, ‘РЕЗУЛЬТАТЫ ПОИСКА В ACTIVE DIRECTORY’)}
Скажите а можно формировать отчеты по компьютерам домена с указанием длительности сессии, для отслеживания тех сотрудников которые не выключают свои компьютеры?
Тут нужно какие-то костыли громоздить. Встроенно — никак.
Например, можно на каждом компьютере создать задание планировщика, которое каждый час обновляет в AD данные 2 полей: врямя загрузки компьютера (boot time) и текущее время.
Потом делаем запрос через get-aduser и смотрим значение этих полей.
Эсли время загрузки вчерашняя, а текущее время — сегодня. Понимаем, что компьютер не перезагружался.
За основу можно брать скрипты из статьи https://winitpro.ru/index.php/2019/08/13/set-adcomputer-powershell/
Доброе время суток! Вот два shell запроса как про твой вопрос^
Get-ADComputer -Filter * -Properties * | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
С IPv4
Get-ADComputer -Filter * -Properties * | Sort LastLogonDate | FT Name, ipv4*, oper*, LastLogonDate -Autosize
Немного не то, но теперь есть от чего оттолкнуться. Спасибо.
Добрый день! Нужно выгрузить имя ПК и атрибут Описание.
Get-ADComputer -Filter * -Property * | Select-Object Name, Description
Начинается выгрузка, но после примерно 200 строчки выпадает ошибка:
Get-ADComputer : Сервер вернул следующую ошибку: недопустимый контекст перечисления.
строка:1 знак:1
+ Get-ADComputer -Filter * -Property * | Select-Object Name, Descriptio …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-ADComputer], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
Get-ADComputer -Filter {(Enabled -eq $true)} -Property Name, Description | Select Name, Description | Export-CSV Comps.csv -NoTypeInformation -Encoding UTF8
Был затык на отключенные ПК
Добрый день!
Скажите, а можно ли таким образом получить список компов в домене, у которых установлена веб-камера?
Через Get-ADComputer вы перебираете компьютеры в домене. Для каждого компьютера нужно через invoke-command или wmi запрос вам нужно получить какое-то свойство с этого компьютера, которое обозначает веб-камеру.
Типа такого:
Get-WmiObject Win32_PnPEntity | where {$_.caption -match 'camera'}
Посмотрите что это wmi запрос возвращает на компьютере с и без вебкамеры.
Добрый день, а каким скриптом можно получить кол-во хостов, присоединённых к домену за период времени?
Наверно проще всего сортировать, выбирать по атрибуту компьютера
whencreated
Почитать количество серверов с Windows Server — неверно.
Посчитать количество серверов с Windows Server — верно.
Добрый день, после переустановки windows на ПК пытаюсь сообразить скрипт по добавлению учетки ПК в АД в тот же контейнер где она была ранее. застопорился на одном моменте. нужно как то значение переменной $path = Get-ADComputer -identity $name -Properties * | FT DistinguishedName передать в массив и распарсить что бы вычлинить из этой переменной лишнее и оставить лишь путь для передачи его в другую команду.
Пример. вывод команды Get-ADComputer:
DistinguishedName
——————
CN=UK-121-01,OU=Подразделение по ИОТ и ТСО,OU=Пользователи,OU=SEVPKU,DC=mydomain,DC=local
мне нужно вычленить
OU=Подразделение по ИОТ и ТСО,OU=Пользователи,OU=SEVPKU,DC=mydomain,DC=local
и передать в виде переменной $path в команду
#Get-ADComputer -Identity $name | Move-ADObject -TargetPath $path
не подскажите как это сделать, скажу честно рано или поздно я приду к этому, но хочется решить данную проблему побыстрее) спасибо.
Получить OU текущего компьютера можно так:
(Get-ADOrganizationalUnit -Identity $(($adComputer = Get-ADComputer -Identity $env:COMPUTERNAME).DistinguishedName.SubString($adComputer.DistinguishedName.IndexOf("OU=")))).DistinguishedName
Доброго суток. Как мне узнать Forticlient была ли установлена на компьютер которая находиться в домене. Будет ли это команда показывать если даже этот комп отключен?Заранее благодарю.
Добрый день!
Get-ItemProperty HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice -Name ProgId
Запрос который дает информацию какой браузер используется в данный момент пользователем.
Вопрос:Как можно применить запрос ко всем ПК в домене?
Готового средства нет.
Можно запустить логон скрипт на всех, чтобы каждый компьютер складывал результат в файл на сетевой папки.
Можно опросить компьютеру удаленно через Invoke-Comman https://winitpro.ru/index.php/2020/07/27/powershell-invoke-command-zapuska-komand-na-udalennyx-kompyuterax/
$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"').Name
$results = Invoke-Command $computers -ScriptBlock {Get-ItemProperty HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice -Name ProgId}
$results | Select-Object PSComputerName, ProgId
Здравствуйте! Подскажите пожалуйста, можно ли через powershell вытащить информацию о авторизации одного пользователя на нескольких ПК
См логи аутентфикации пользователя в AD:
https://winitpro.ru/index.php/2020/04/23/user-domain-login-history-powershell/
или можно парсить логи на компьютерах:
https://winitpro.ru/index.php/2022/05/31/audit-sobytiya-vxoda-polzovatelej-v-windows/
Тут не опечатка?
Теперь можно заблокировать все найденные учетные записи компьютеров:
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonData -lt $datecutoff} | Set-ADComputer -Enabled $false
переменную мы выше вводили $date_with_offset= (Get-Date).AddDays(-120)
Да, опечатка. поправил. Спасибо за внимательность 🙂
Добрый день.
Подскажите, как в AD в поле «описание» рабочей станции добавить уже к имеющейся записи данные из переменной?
В данном примере поле «описание » заменяется данными из переменной $des1, а мне нужно, чтобы в поле описание уже к имеющимся данным в начало строки вставлялась запись из переменной.
$date_with_offset= (Get-Date).AddDays(-120)
$des1=»блокировка 120″
$comps = Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset -and name -like «d1022*» }
foreach ($comp in $comps) {set-adcomputer $comp.name -enabled $false -description($des1)}
Ну логично, что нужно сначала получить значенее поля, а потом добавить к нему ваши данные.
foreach ($comp in $comps)
{
$Computer = Get-ADComputer -Identity $comp.name -Properties description
$Computer | Set-ADComputer -Enabled $false -Description " $($Computer.Description),$des1"
}
Но вангую, у вас со временем там накопится куча маусора, т.к. при каждой итерации будут добавляться новые данные.
Вот в этой статье описано как можно хранить в description структурированные данные (типа атрибуты) и читать их:
$ComputerName = 'WKS-PC11S22'
$vendor,$Model,$SerialNumber,$Username,$LogonServer = ((Get-ADComputer -identity $ComputerName -Properties *).description).split("|")
https://winitpro.ru/index.php/2015/07/28/zapolnyaem-opisanie-kompyuterov-v-active-directory/
Не работает —
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonData -lt $date_with_offset} | Set-ADComputer -Enabled $false
Заблочил компы которые не входили в домен 5 мес. так —
get-adcomputer -properties lastLogonDate -filter * | where { $_.lastLogonDate -lt (get-date).addmonths(-6) } | Disable-ADAccount
Добрый день.
помогите пожалуйста начинающему.
есть скрипт рабочий который выдает некоторую информацию на указаном в скрипте ПК «itws» в файлик csv
подскажите как его модифицировать, что бы он вывел эту информацию не по одному ПК, а по всем ПК в домене, как не пытался прикрутить «Get-ADComputer» ничего не вышло….
за ранее спасибо.
$ArrComputers = «itws»
$OutputLog = «.\output.log»
$NotRespondingLog = «.\notresponding.log»
$ErrorActionPreference = «Stop»
Clear-Host
$data = ForEach ($Computer in $ArrComputers) {
try {
$computerSystem = get-wmiobject Win32_ComputerSystem -Computer $Computer
$computerBIOS = get-wmiobject Win32_BIOS -Computer $Computer
$computerOS = get-wmiobject Win32_OperatingSystem -Computer $Computer
$computerCPU = get-wmiobject Win32_Processor -Computer $Computer
$computerHDD = Get-WmiObject Win32_LogicalDisk -Computer $Computer -Filter drivetype=3
$Version = Get-WmiObject -Namespace «Root\CIMv2» `
-Query «Select * from Win32_ComputerSystemProduct» `
-computer $computer | select -ExpandProperty version
$MonitorInfo = gwmi WmiMonitorID -Namespace root\wmi -computername $computer |
Select -last 1 @{n=»Model»; e={[System.Text.Encoding]::ASCII.GetString($_.UserFriendlyName -ne 00)}},
@{n=»Serial Number»;e={[System.Text.Encoding]::ASCII.GetString($_.SerialNumberID -ne 00)}}
} catch {
$Computer | Out-File -FilePath $NotRespondingLog -Append -Encoding UTF8
continue
}
$props = [ordered]@{
‘User’ = $computerSystem.UserName
‘PC Serial Number’ = $computerBIOS.SerialNumber
‘CPU’ = $computerCPU.Name
‘Model’ = $computerSystem.Model
‘HDDSize’ = [math]::Round($computerHDD.Size/1GB)
‘RAM’ = [math]::Round($computerSystem.TotalPhysicalMemory/1GB)
‘OS’ = $computerOS.caption
‘PCName’ = $computerSystem.Name
#’Version’ = $Version
‘Monitor Model’ = $MonitorInfo.Model
‘Monitor Serial’ = $MonitorInfo.»Serial Number»
}
New-Object -Type PSCustomObject -Property $props
}
$data | Export-Csv ‘C:\work\Monitor_system_info.csv’ -NoType -Append
А как то можно выуживать информацию о том когда все пк и сервера в домене обновлялись ? Последнюю дату обновления добывать. Может через 2 скрипта( один стартует на машине и добывает данные обновления, а второй их записывает например в атрибут свободный… )
Через GPO на компьютере запускайте скрипт, который получает дату последней установки обновлений:
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 1).InstalledOn
И пишет ее в произвольный атрибут компьютера в AD с помощью Set-ADComputer (https://winitpro.ru/index.php/2019/08/13/set-adcomputer-powershell/)
В самом начале перед Get-HotFix, пропущен знак скобки — (
Добрые люди, подскажите пожалуйста, как написать скрипт в PowerShell!
В организации запрещено заходить одновременно, под своей учеткой, на нескольких компьютерах (не для всех учеток), т.к. влияет на работу в программах. И ест-но, все «забывают» об этом.
Требуется, ввести (выбрать из списка AD) имя пользователя и увидеть, на каких компьютерах запущена его УЗ в данный момент.
Можн при входе/выходе каждого пользователя писать в sql базу информацию о компьютере, времени, и тд.
Логирование входа (аутентификации) пользователей и компьютеров в домене в базу MSSQL https://winitpro.ru/index.php/2021/08/20/logirovanie-vhoda-polzovatelej-kompyuterov-bazu-dannih/
Или анализировать скриптом логи входа на всех DC:
Получаем логи (историю) входа пользователя в домен AD
https://winitpro.ru/index.php/2020/04/23/user-domain-login-history-powershell/
всем привет. скажите куда рыть? задача следующая хочу в домене найти компа которые как год уже невключались. затем хочу сделать фильтр чтоб в общем списке компов были только конкретные пк с конкретными названиями.
вот что делал
Get-ADComputer -Filter * -Properties * | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
получаю весь список тачек в домене ,
затем
$date_with_offset= (Get-Date).AddDays(-365)
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
теперь в этом общем списке хочу сделать фильтрацию имен пк по имени . но не-понимаю какое правило указать, и возможно ли в 1 запросе использовать 2 фильтра?
Можно дополнительно отфильтровать вывод с помощью where-object:
Get-ADComputer -Filter * -Properties * | where Name -like "*wks*"| FT Name, LastLogonDate -Autosize
ДД!
помогите допилить скрипт
$date_with_offset= (Get-Date).AddDays(-90)
Get-ADComputer -SearchBase ‘OU=PCs, dc=mydomain,dc=local’ -Properties * -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate | FT Name, LastLogonDate, OperatingSystem, IPv4Address, CanonicalName, -AutoSize
здесь я получаю компьютеры не авторизовавшиеся больше 90 дней со следующими атрибутами:
Имя, Последний логон, ОС, IP-адрес, и его путь расположения в OU.
Но мне в этом скрипте нужно как-то, куда-то добавить командлет, чтобы в конце выводил значение (.count) таких найденых компов, например из 1500 машин в этой OU (включая и его под OU) нашёл 300 машин не авторизовавшихся более 90 дней, а так же их сразу блочил, присваивая им значение — Disabled.
Как это реализовать? куда, что дописать?
а так же исключить из поиска сервера, только рабочие станции… (данным скриптом все ОС находит)
так как в данном главном OU имеются под OU с серверами, рабочими станциями Департаментов, Управлений, Отделов и т.д.
в продолжении: чтобы результат поиска в конце выводил примерно подобным значением
(Get-ADComputer -Filter {enabled -eq «true» -and OperatingSystem -Like ‘*все найденные рабочие станции с ОС Windows не авторизовавшихся более 90 дней, кроме серверов*’ }).count
Навскиду что-то такое получится:
$date_with_offset= (Get-Date).AddDays(-90)
(Get-ADComputer -Filter {enabled -eq "true" -and LastLogonDate -lt $date_with_offset -and OperatingSystem -Like '*Windows 1*'} -properties * |select Name, OperatingSystem,enabled).count
Ну и в Filter нельзя использовать все атрибуты компьютера, там набор ограниченный. Обычно после выборк через filter нужно откинуть лишних с помощью where-object.
$Computers = Get-ADComputer -Filter {OperatingSystem -Like ‘*Windows Server*’}
Foreach ($Computer in $Computers)
{
$Hostname = $Computer.Name
$ComputerInfo = (Get-WmiObject -Computername $Hostname Win32_ComputerSystem)
$Manufacturer = $Computer.Manufacturer
$Model = $Computer.Model
Write-Host «Name: $Hostname»
Write-Host «Manufacturer: $Manufacturer»
Write-Host «Model: $Model»
Write-Host » »
$Content = «$Hostname;$Manufacturer;$Model»
Add-Content -Value $Content -Path «C:\PS\ServersInfo.txt»
}
Не работает — потому что
$Manufacturer = $Computer.Manufacturer
$Model = $Computer.Model
Поменял
$Manufacturer = $ComputerInfo.Manufacturer
$Model = $ComputerInfo.Model