@Dewz

Как узнать пользователей, группы удаленного рабочего стола через powershell?

Добрый день! Возможно ли собрать статистику пользователей, групп кому разрешено подключение на ВМ через cmd или powershell?
Вручную на подключение к каждой уйдет много времени можно ли как-нибудь автоматизировать?
  • Вопрос задан
  • 893 просмотра
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
Я смотрю, вы не пошли по пути remote execution и вам хочется боли ? :)

Тогда вот, берегите глаза
$Computername = 'xxx'
Get-CimInstance Win32_Group -filter "LocalAccount='True' and SID='S-1-5-32-555'" -ComputerName $Computername |
Select-Object PSComputername,Name,@{Name="Members";Expression={
  (Get-CimAssociatedInstance -InputObject $_ -ResultClassName Win32_UserAccount).Name
}}

или в переводе на WMI
$Computername = 'xxx'
Get-WMIObject Win32_Group -filter "LocalAccount='True'and SID='S-1-5-32-555'" -ComputerName $Computername|
  Select-Object PSComputername,Name,@{Name="Members";Expression={
   $_.GetRelated("Win32_UserAccount").Name
}}


Здесь будут только пользователи. Для вложенных групп надо ещё подкрутить :)
Upd:
Ладно, не буду больше томить, нашёл альтернативный вариант
Во времена PSv2 ещё написал, когда не было встроенной

function Get-LocalGroupMember {
param(
	[Parameter(ValueFromPipeline=$false, Position=0)]
	[string[]]$GroupName = 'Administrators',
	[Parameter(ValueFromPipeline=$true)]
	[string[]]$ComputerName = '.'
)
PROCESS {
	foreach ($computer in $ComputerName) {
		foreach ($group in $GroupName) {
			$grp = [ADSI]"WinNT://$computer/$group,group"
			Write-Verbose ('Group: ' + $grp.Path) # test for existance
			$members = @($grp.psbase.Invoke("Members"))
			if ($members) {
				$members | Foreach-Object {
					$name = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)
					$class = $_.GetType().InvokeMember("Class", 'GetProperty', $null, $_, $null)
					$parent = $_.GetType().InvokeMember("Parent", 'GetProperty', $null, $_, $null) -replace 'WinNT://' -replace '.*/'
					'' | Select-Object @{n='Class';e={$class}},@{n='Domain';e={$parent}},@{n='Name';e={$name}}
				}
			}
		}
	}
}
}

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

Get-LocalGroupMember -ComputerName MySuperServer -GroupName 'Пользователи удаленного рабочего стола',  'Remote Desktop Users'
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SignFinder
@SignFinder
Wintel\Unix Engineer\DevOps
Да, возможно.
Через powershell логика такая. Получить список нужных машин (сборов по сети или вручную создав файл), зайти в цикле ForEach на каждую машину по enter-pssession или invoke-command и достать через Get-LocalGroupMember список членов нужной вам локальной группы, записать его в файл или переменную.
И это только один из вариантов - гораздо больше их есть в Интернет, если соблаговолите погуглить
Ответ написан
@NortheR73
системный инженер
Речь идет про локальные группы Administrators и Remote Desktop Users?
В остальном поддержу Alexey Dmitriev.
В общих чертах: формируем список компьютеров, далее в цикле ForEach выполняем вход на каждый ПК, дергаем Get-LocalGroup и/или Get-LocalGroupMember, пишем полученные данные в файл/на экран. Для этого требуется правильно настроенный Remote PowerShell - можно настроить через GPO

Если хочется совсем просто, то, например, как-то так:
$computers = Get-Content -Path C:\temp\os_version.csv
Get-WmiObject -ComputerName $computers -Class Win32_UserAccount -Filter "LocalAccount=True" | Select PSComputername, Name, Status, Disabled, AccountType, Lockout, PasswordRequired, PasswordChangeable | Out-GridView
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы