Описание скрипта

Был ли вам полезен этот скрипт?
Я знаю, как получить список локальных администраторов на удаленной машине через WMI:
Это приведет к возврату пользователей и групп:
Однако, если пользователь является членом SomeOtherGroup
выше, мне нужно знать, что он является членом – и, следовательно, местным администратором. Поэтому мне нужно расширить (вероятно, рекурсивно) всех членов группы.
Есть ли запрос WMI, который может самостоятельно присоединяться к win32_group
, расширяя все имена пользователей всех групп, являющихся локальными администраторами?
C:\> wmic useraccount get name,sid - sample output -
Name SID
admin S-1-5-21-615456588-3658538152-758053764-1009
myUser S-1-5-21-615456588-3658538152-758053764-1008 C:\> whoami /user - or -
C:\> wmic useraccount where name='%username%' get sid C:\> wmic useraccount where name='< username >' get sid - example - C:\> wmic useraccount where name='myUser' get sid - sample output - SID S-1-5-21-615456588-3658538152-758053764-1008
C:\> wmic useraccount where sid='< sid >' get name - example - C:\> wmic useraccount where sid='S-1-5-21-615456588-3658538152-758053764-1008' get name - sample output - Name myUser
В данной статье рассмотрено несколько способов, с помощью которых можно узнать идентификатор безопасности (SID) пользователя в операционной системе Windows 10.
SID
(Security Identifier) – идентификатор безопасности, это уникальный идентификатор (код) который присваивается любой создаваемой доменной или локальной учетным записям, а также группе и другим объектам безопасности.
Операционная система использует именно идентификаторы безопасности (SID) для контроля доступа к различным ресурсам, таким как объекты файловой системы, ключам реестра, сетевым каталогам, что означает, что даже если вы измените имя пользователя
, то это не повлияет на какие-либо предварительные настройки для этой учетной записи, поскольку каждая конфигурация привязана к SID, который остается постоянным.
Идентификатор безопасности может быть полезен во время выполнения определенных команд, связанных с безопасностью компьютера.
Чтобы включить удаленный доступ для другого ПК на WMI, необходимо добавить хосты в список trustedhost в winrm, если компьютеры не находятся в одном и том же домене.
Включить winrm
. На компьютере вы хотите получить доступ.
Проверьте, работает ли winrm или остановлен:
get-service winrm
Если он остановлен, введите:
enable-PSRemoting -force
Добавить доступ к удаленному хосту.
winrm s winrm/config/client '@{TrustedHosts="REMOTECOMPUTERNAME/IP"}'
Так что в моем случае:
winrm s winrm/config/client '@{TrustedHosts="laptopPC"}'
Чтобы проверить услугу winrm, вы можете ввести:
winrm quickconfig
Он предоставит текущий статус услуги, и при необходимости он настроит службу WinRM.
К сожалению, брандмауэр Windows блокирует удаленный доступ.
Теперь я могу подключить WMI от моего ноутбука к моему настольному ПК с помощью следующей командной строки:
get-wmiobject CIM_Memory -computername desktopPC { or IP } -credential zuka
И затем он запрашивает пароль. И вуаля! Я получил информацию о памяти, удаленный доступ. знак равно
Sub GetAdministrators(strComputerName) Dim objWMIService, strQuery, colItems, Path, strMembers Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") strQuery = "select * from Win32_GroupUser where GroupComponent = " & chr
& "Win32_Group.Domain='" & strComputerName & "',Name='Administrators'" & Chr
Set ColItems = objWMIService.ExecQuery(strQuery) strMembers = "" For Each Path In ColItems Dim strMemberName, NamesArray, strDomainName, DomainNameArray NamesArray = Split(Path.PartComponent,",") strMemberName = Replace(Replace(NamesArray
,Chr
,""),"Name=","") DomainNameArray = Split(NamesArray(0),"=") strDomainName = Replace(DomainNameArray
,Chr
,"") If strDomainName <> strComputerName Then strMemberName = strDomainName & "\" & strMemberName End If WScript.Echo strMemberName Next
End Sub
Function GetComputerName() Set objWMISvc = GetObject( "winmgmts:\\.\root\cimv2" ) Set colItems = objWMISvc.ExecQuery( "Select * from Win32_ComputerSystem", , 48 ) For Each objItem in colItems strComputerName = objItem.Name GetComputerName = strComputerName Next
End Function
GetAdministrators GetComputerName To execute it, simply run this a command prompt window:
cscript //nologo script.vbs. Следующий script будет работать даже на контроллере домена:
Sub GetAdministrators(strComputerName)
Dim objWMIService, strQuery, colItems, Path, strMembers
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
strQuery = "select * from Win32_GroupUser where GroupComponent = " & chr
& "Win32_Group. Domain='" & strComputerName & "',Name='Administrators'" & Chr
Set ColItems = objWMIService. ExecQuery(strQuery)
strMembers = ""
For Each Path In ColItems
Dim strMemberName, NamesArray, strDomainName, DomainNameArray
NamesArray = Split(Path. PartComponent,",")
strMemberName = Replace(Replace(NamesArray
,Chr
,""),"Name=","")
DomainNameArray = Split(NamesArray(0),"=")
strDomainName = Replace(DomainNameArray
,Chr
,"")
If strDomainName <> strComputerName Then
strMemberName = strDomainName & "\" & strMemberName
End If
WScript. Echo strMemberName
Next
End SubFunction GetComputerName()
Set objWMISvc = GetObject( "winmgmts:\\.\root\cimv2" )
Set colItems = objWMISvc. ExecQuery( "Select * from Win32_ComputerSystem", , 48 )
For Each objItem in colItems
strComputerName = objItem. Name
GetComputerName = strComputerName
Next
End Function
Чтобы выполнить его, просто запустите это окно командной строки:
cscript //nologo script.vbs.
The simpler way using ADSI does not include this information, but is less likely to get Access Denied types of errors.
$TMinus30 = [datetime]::Now.AddDays(-30).ToFileTime()
$Domains = 'ChinchillaFarm.COM','TacoTruck.Net'
$ServerHT = @{}
$Servers = ForEach($Domain in $Domains){Get-ADObject -LDAPFilter "(&(objectCategory=computer)(name=*))" -Server $Domain | ?{$_.lastLogonTimestamp -gt $TMinus30}}
$Servers.DNSHostName | %{$ServerHT.Add($_,$Null)}
ForEach($Server in ($Servers | ?{$(Test-Connection $_.DNSHostName -Count 1 -Quiet)})){ Try{ $GMembers = Get-WmiObject -ComputerName $Server -Query "SELECT * FROM win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='$Server',Name='Administrators'""" $Members = $GMembers | ?{$_.PartComponent -match 'Domain="(.+?)",Name="(.+?)"'}|%{[PSCustomObject]@{'Domain'=$Matches[1];'Account'=$Matches[2]}} } Catch{ $group = [ADSI]("WinNT://$Server/Administrators,group") $GMembers = $group.psbase.invoke("Members") $Members = $GMembers | ForEach-Object {[PSCustomObject]@{'Domain'='';'Account'=$_.GetType().InvokeMember("Name",'GetProperty', $null, $_, $null)}} } $ServerHT.$Server = $Members
} Then you just have to output to a file if desired. Here’s what I would do that should output something like what you want:
$ServerHT.keys|%{"`n"+("="*$_.length);$_;("="*$_.length)+"`n";$ServerHT.$_|%{"{0}{1}" -f $(If($_.Domain){$_.Domain+"\"}), $_.Account}} ===========
ServerSQL01
===========
ServerSQL01\SQLAdmin
TacoTruck\TMTech
TacoTruck\Stan2112
======
XWeb03
======
ChinchillaFarm\Stan2112
============
BrokenOld486
============
TMTech
Guest
Windows Management Instrumentation
(WMI)
— это базовая технология как для управления так и для слежения за работой платформы Windows.
Только пользователи локальной группы «Администраторы» имеют право запускать WMIC.
В основе структуры данных в WBEM лежит Common Information Model (CIM), реализующая объектно-ориентированный подход к представлению компонентов системы. C IM является расширяемой моделью, что позволяет программам, системам и драйверам добавлять в неё свои классы, объекты, методы и свойства.
Важной особенностью WMI является то, что хранящиеся в нём объекты соответствуют динамическим ресурсам, то есть параметры этих ресурсов постоянно меняются, поэтому параметры таких объектов не хранятся постоянно, а создаются по запросу потребителя данных. Хранилище свойств объектов WMI называется репозиторием и расположено в системной папке операционной системы Windows:
Так как WMI построен по объектно-ориентированному принципу, то все данные операционной системы представлены в виде объектов и их свойств и методов.
Все классы группируются в пространства имен, которые иерархически упорядочены и логически связаны друг с другом по определенной технологии или области управления. В WMI имеется одно корневое пространство имен Root, которое в свою очередь имеет 4 подпространства: CIMv2, Default, Security и WMI.
Классы имеют свойства и методы и находятся в иерархической зависимости друг от друга, то есть классы-потомки могут наследовать или переопределять свойства классов-родителей, а также добавлять свои свойства.
Свойства классов используются для однозначной идентификации экземпляра класса и для описания состояния используемого ресурса. Обычно все свойства классов доступны только для чтения, хотя некоторые из них можно модифицировать определенным методом. Методы классов позволяют выполнить действия над управляемым ресурсом.
Каждому экземпляру класса можно обратиться по полному пути, который имеет следующую структуру:
ComputerName
– имя компьютера
NameSpace
– название пространства имен
ClassName
– имя класса
KeyProperty1=Value1, KeyProperty2=Value2
– свойства объекта и значения, по
которому он идентифицируется.
Пример обращения к процессу с именем «Calc.exe», который запущен на локальной машине:
Экземпляры классов могут генерировать события, к которым можно подписываться. При наступлении события WMI автоматически создает экземпляр того класса, которому соответствует это событие. Такой механизм удобно использовать для выполнения определенной команды при наступлении определенного события, то есть следить за состоянием объектов операционной системы.
Общая безопасность в WMI реализуется на уровне операционной системы, а дополнительная политика безопасности основана на уровнях пространств имен и протокола DCOM. То есть если пользователь не имеет права делать какое-то действие через операционную систему, он не сможет это сделать и через WMI
. Если же пользователю дано какое-то право в операционной системе, то это ещё не означает, что это право будет и в WMI, так как в WMI действуют дополнительные параметры безопасности на уровне пространств имен.
Для вызова удаленных процедур WMI использует модель DCOM. В случае если возникает ошибка «Dcom Access Denied» то действия будут следующими: меня «Выполнить»->»dcomcnfg»->»Службы компонентов(Component Services)->Компьютеры->Мой компьютер->Свойства(правая кнопка мыши)->вкладка Безопасность COM Уровни олицетворения могут принимать следующие значения:
Уровни аутентификации (подлинности) могут принимать следующие значения:
wmimgmt.msc
— оснастка консоли управления MMC для настройки WMI на локальном компьютере.
winmgmt.exe
— консольная утилита управления WMI локального компьютера.
wbemtest.exe
— графическая утилита для взаимодействия со структурой WMI на локальном или удаленном компьютере.
wmic.exe
— консольная утилита для взаимодействия со структурой WMI на локальном компьютере.
mofcomp.exe
— компилятор MOF-файлов для расширения структуры WMI, управления библиотекой классов WMI и восстановления репозитория.
Сейчас я покажу практические примеры используемые в моей повседневной работе:
Удаление больших файлов с расширением .log
wmic datafile where «drive=’с:’ and Extension=’.log’ and FileSize>’100000′» call delete
Список заблокированный учетных записей(вывод в файл на диске с:)
Определение архитектуры (Как пример на
Server
2008)
wmic OS get OSArchitecture
Определяет тип сервера (Server 2008)
Команда возвращает числовое значение. Для
Windows 2008 Server
они
следующие
:
7 = Windows Server 2008 Standard Edition (full installation)
8 = Windows Server 2008 Datacenter Edition (full installation
10 = Windows Server 2008 Enterprise Edition (full installation)
12 = Windows Server 2008 Datacenter Edition (core installation)
13 =
Windows Server 2008 Standard Edition (core installation)
14 = Windows Server 2008 Enterprise Edition (core installation)
42 = Hyper-V Server 2008
wmic OS get OperatingSystemSKU
Как подключаться удаленным системам.
Завершить процесс по названию.
wmic.exe process where name=»calc.exe» delete
Wmic process where (caption=”notepad.exe”) call terminate
Получить более подробную справку по запуску команд.
process call /?:full
Если необходимо получить сведения о службе оповещения на компьютере
/node: service where name=»alerter» list
В
ывод сведений на экран
process where (name=»explorer.exe») get caption,commandline,handle
Чтобы представить вывод в файл в табличном режиме
/output:c:\table.htm process get /format:htable
path win32_process.name=»explorer.exe» get caption,commandline,handle
При соединении с удалёнными системами можно брать имена компьютеров из текстового файла (
server
1,
server
2,
server
3)
Сохранение во внешнем
XML
-файле историю запускаемых в текущей сессии
wmic
-команд и результаты их выполнения.
Ч
тобы запустить новый процесс
process call create cmd.exe
Подключение к другому компьютеру возможно ещё так
Ч
тобы перезагрузить компьютер
Ч
тобы выключить компьютер
В
ывод свойств операционной системы
os get /value
Вывод информация о состоянии всех зарегистрированных служб на компьютерах
server
1,
server
2,
server
3
/node:server1,server2,server3 /output:c:\service.htm service get name,displayname,state /format:htable
З
апуск и остановка служб
/node:server1 service where (name=»squid.exe») call startservice
П
ринудительно выключить компьютер
wmic os where primary=»TRUE» call win32shutdown 6
Для того чтобы запустить сервис надо (вывести список сервисов в системе)
service list brief
/output:c:\service.html service list full /format:htable
Ч
тобы работало wmic
, надо
Служба WMI должна быть помещена в автозапуск, а также должно быть разрешено соединение по DCOM:
1) В разделе реестра HKLM\SOFTWARE\MICROSOFT\OLE установите значение EnableDCOM в «Y», а также EnableRemoteConnect в «Y». Значение EnableRemoteConnect по умолчанию «N».
2) В разделе реестра \HKLM\SOFTWARE\Microsoft\wbem\cimom установите значение AutostartWin9X в «2». Установите значение EnableAnonConnections в «1».
3) Добавьте файл Winmgmt.exe в автозагрузку. Файл находится в каталоге \Windows\WBEM.
Модели
DCOM
сопоставлен
TCP
-порт 135.
netsh firewall add portopening TCP 135 DCOM_TCP135
Удаленно включаем службу удаленный рабочий стол (
Remote
Desktop
)
Вывод служб которые запускают с правами
LocalSystem
/output:c:\id\cns.html service where startname=»LocalSystem» get Caption,name,started
Список шар на локальном машине
Перечисление всех путей к папкам из которых запущены программы
wmic.exe process get «ExecutablePath», «ProcessID»
Драйверы в системе возможно останавливать или запускать например:
net stop beep
net start beep
sc stop beep
sc start beep
wmic sysdriver where name=’beep’ call PauseService
методы класса Win32_SystemDriver
StartService -> запускает службу или драйвер
StopService -> останавливает службу или драйвер
PauseService -> переводит службу или драйвер в состояние паузы
ResumeService -> восстанавливает состояние драйвера или службы
InterrogateService -> заставляет службу или драйвер обновить своё состояние в SCM
Create -> создаёт новую службу или драйвер
Change -> изменяет службы или драйвер
ChangeStartMode -> изменяет режим запуска службы или драйвера
Delete -> удаляет службу или драйвер
Выключаем локальную машину.
ping -n seconds 127.0.0.1>nul&wmic OS WHERE Primary=»TRUE» CALL Win32Shutdown 6
где
seconds
— желаемое число секунд +1;
Win
32
Shutdown
6 — 6 = 2 (
reboot
) + 4 (
force
). Никакого видимого сообщения о перезагрузке выведено не будет.
Полезные информационные сборки параметров.
wmic bios получить Заголовок, Производитель, SMBIOSBIOSVersion, Версия
wmic baseboard get Производитель, модель, продукт, серийный номер, версия
wmic cpu получить идентификатор устройства, ширину адреса, максимальную тактовую скорость, имя, производителя, идентификатор процессора
wmic logicaldisk, где тип_диска=3 получить имя, свободное пространство, имя системы, файловую систему, размер, серийный номер тома
= 1 NoRootDirectory На диске нет корневого каталога.
= 2 Съемный Диск представляет собой съемное запоминающее устройство, такое как дисковод для гибких дисков или USB-накопитель.
= 3 Фиксированный Диск представляет собой фиксированный диск.
= 4 Сеть Диск является сетевым диском.
= 5 CDRom Привод представляет собой оптическое дисковое устройство, такое как CD или DVD-ROM.
= 6 ОЗУ Привод представляет собой электронный диск.
З
адание приоритета процессору
wmic process where «name=’notepad.exe’» call setpriority 64
В
ыполнение команд через wmic
просто вставляем в командную строку
wmic process call create ‘cmd.exe /c ping 10.30.10.101’
П
рописываем DNS-суффиксы удаленно
wmic /node: /failfast:on nicconfig call SetDNSSuffixSearchOrder (ford-i.ru,tc-toyota.local,lexus.local)
nicconfig where index=8 call setdnsserversearchorder («10.30.5.2″,»10.30.5.3»)
,где index= указывает номер интерфейса в системе на котором у вас поднята сеть
К
оманды загружаемые при входе системы
wmic startup list full && system
wmic:root\cli>/output:c:\startup_full.html startup list full /format:htable
wmic:root\cli>/output:c:\startup_system.html startup list system /format:htable
Как узнать идентификатор безопасности (SID) пользователя в командной строке
Чтобы узнать SID текущего пользователя воспользуемся утилитой whoami, для этого откройте командную строку
и выполните следующую команду:

Также узнать SID текущего пользователя можно выполнив следующую команду:

Чтобы узнать все SID присутствующие в операционной системе, выполните команду:

Чтобы узнать SID определённого пользователя, выполните следующую команду:

Чтобы узнать имя пользователя учетной записи по SID (обратная процедура), выполните команду:

Как узнать идентификатор безопасности (SID) в редакторе реестра
Используя редактор реестра, также можно узнать идентификатор безопасности (SID), для этого откройте редактор реестра нажав сочетание клавиш 
+ R и в открывшемся окне Выполнить
введите regedit и нажмите клавишу Enter ↵
.

В открывшемся окне редактора реестра, скопируйте/вставьте или перейдите по следующему пути:
В разделе ProfileList
вы увидите всех пользователей и их идентификаторы SID.

Как узнать идентификатор безопасности (SID) пользователя в Windows PowerSell
Также узнать идентификатор безопасности можно используя консоль Windows PowerShell.
Чтобы узнать все идентификаторы безопасности (SID) в консоли Windows PowerShell
, выполните команду:

Чтобы узнать SID определённого пользователя, выполните следующую команду:

Также узнать SID определённого пользователя, можно выполнив команду:

Чтобы узнать имя пользователя учетной записи по SID (обратная процедура), выполните команду следующего вида:
Где вместо SID укажите нужный идентификатор безопасности.
В данном примере команда выглядит так:

Скрипт для поиска пользователей в группе Администраторы на серверах
Скрипт проходит по всем серверам из Active Directory
, смотрит состав локальной группы Администраторы
и сохраняет список в файл. Будет полезным для поддержания безопасности в среде с большим количеством серверов.



