Powershell for Windows

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
Получаем список пользователей локальной группы администраторов на всех компьютерах домена.

31.05.2010

Получение списка членов локальной группы.

Filed under: PowerShell — Метки: , , , , , , , , , , — Yamshikov Pavel @ 4:21 пп

В PowerShell функция выглядит вот так:

function Seach-LocalGroupMemberComputerNetwork(){
#Задаем параметры. Имя компьютера и Имя группы
param(
$Computer,
$GroupName

)
#Получаем список членов группы
([ADSI]"WinNT://$Computer/$GroupName").psbase.invoke("members") |
%  {$_.GetType().InvokeMember("Name", ‘GetProperty’, $null, $_, $null)}
}

Пример:
Seach-LocalGroupMemberComputerNetwork -Computer Mycomp -GroupName Пользователи
Получаем список пользователей локальной группы Пользователи на компьютере Mycomp.

06.05.2009

Поиск в локальной сети открытых ресурсов и экспорт в файл *.csv

Работа скрипта:

  1. Проверяем путь к папке и если нужно создаем.
  2. Создаем список компьютеров доменной сети
  3. Циклом перебираем список компьютеров доменной сети
  4. Проверяем  «жив» ли  компьютер
  5. Проверяем есть ли доступ к компьютеру
  6. Получаем список «шар» (без системных «шар»)
  7. Проверяем есть ли доступ к «шаре»
  8. Получаем данные о «шаре» (имя, путь, разрешения доступа)
  9. Экспорт данных в файл *.csv

Скрипт FindLanShares.ps1

$Data = get-date -uformat "%d.%m.%Y_%H.%M.%S"
$LogPath = "C:\Monitoring\LOG\$Data"
$AllComputerInfo = @();$AllNOPermissions = @();$AllServerRPCUnavailable = @();$AllNoAccess = @()

#region Check Path Export LOGS
If((Test-Path ($LogPath)) -eq $False)
{New-Item ($LogPath) -Type Directory}
#endregion Check Path Export LOGS

#region We Write The Received Results in Log.
$LogADComputerInfo = "$LogPath\Computer_Information.csv"
$LogNOPermissions = "$LogPath\NO_Permissions_Share.csv"
$LogRPCUnavailable = "$LogPath\Server_RPC_Unavailable.csv"
$LogNoAccess = "$LogPath\No_Access_Computer.csv"
#endregion We Write The Received Results in Log.

#region Function
function Ping ($Name){
$ping = new-object System.Net.NetworkInformation.Ping
if ($ping.send($Name).Status -eq "Success" ) { $True }
else { $False }
trap {Write-Verbose "Ошибка пинга"; $False; continue}
}
#endregion Function

#region Collection of the Information on the Computer

#region The List Active Directory Computers
$LC = Get-QADComputer -ErrorAction SilentlyContinue -SizeLimit 0 | Sort-object Name | foreach {$_.name -replace " *",""}
foreach ($strComputer in $LC){

#region Life check Computer
$Alive="";$Comp = "";$NoAccess = "";$ServerRPCUnavailable = "";$shares =""
$Alive = Ping $strComputer
if ($Alive -eq "True"){Write-Output "Scanning $strComputer"

#region Computer Information

#region Access check to the computer
Trap {"WMI Error Access check $strComputer"; Continue}
$Comp = Get-WmiObject -Class "Win32_computersystem" -ComputerName $strComputer -ErrorAction SilentlyContinue

if ($Comp -eq ""){"NoAccess $strComputer";$AllNoAccess += $NoAccess | % {$_ | select @{e={$strComputer};n='Computer'}}}
if ($Comp -eq $Null){"ServerRPCUnavailable $strComputer";$AllServerRPCUnavailable += $ServerRPCUnavailable | % {$_ | select @{e={$strComputer};n='Computer'}}}
if ($Comp.Caption.Length -gt 1) {

#region Share Information
Trap {"WMI Error Share Name $strComputer"; Continue}
$shares = Get-WmiObject Win32_Share -ComputerName $strComputer -filter 'type=0' -ErrorAction SilentlyContinue

foreach($share in $shares) {
$shareSec ="";$sd = "";$NOPermissions = @();$ShareInfo = @()

Trap {"WMI Error Share Security Setting $strComputer";Continue}
$shareSec = Get-WmiObject Win32_LogicalShareSecuritySetting -ComputerName $strComputer -filter "name='$($share.name)'" -ErrorAction SilentlyContinue

if ($shareSec) {$sd = $sharesec.GetSecurityDescriptor();$DACL = $SD.Descriptor

#region There are No Permissions
if ($DACL.DACL -eq $Null){
$NOPermissions += $DACL |% {
$_ | select @{e={$strComputer};n='Computer'},
@{e={$share.name};n='ShareName'},
@{e={$DACL.DACL};n='DACL'}
}
foreach($NOPermission in $NOPermissions){if ($NOPermission.DACL -eq $Null){$NOPermission.DACL = "NO Permissions"}}
$AllNOPermissions += $NOPermissions
}
#endregion There are No Permissions

$ShareInfo += $DACL.DACL |% {
$_ | select @{e={$comp.Name};n='Computer'},
@{e={$comp.UserName};n='Login'},
@{e={$share.name};n='ShareName'},
@{e={$share.Path};n='PathShare'},
AccessMask,
@{e={$_.trustee.Name};n='User'},
@{e={$_.trustee.Domain};n='Domain'},
@{e={$_.trustee.SIDString};n='SID'}
}
foreach($Info in $ShareInfo){
if ($Info.Login -eq $null){$Info.Login = "Emply"}
if ($Info.AccessMask -eq "1179817"){$Info.AccessMask = "ReadAndExecute"}
if ($Info.AccessMask -eq "1245631"){$Info.AccessMask = "Modify"}
if ($Info.AccessMask -eq "2032127"){$Info.AccessMask = "FullControl"}
if ($Info.User -eq $Null){$Info.User = "DEAD"}
if ($Info.Domain -eq $Null){$Info.Domain = "Emply"}
}
$AllComputerInfo += $ShareInfo
}
}
#endregion Share Information
}
#endregion Access check to the computer
#endregion Computer Information
}
#endregion Life check Computer
}
#endregion The List Active Directory Computers

#endregion  Collection of the Information on the Computer

#region Save to File
$AllComputerInfo | export-csv -Encoding OEM -Path $LogADComputerInfo -NoTypeInformation
$AllNOPermissions | export-csv -Encoding OEM -Path $LogNOPermissions -NoTypeInformation
$AllServerRPCUnavailable | export-csv -Encoding OEM -Path $LogRPCUnavailable -NoTypeInformation
$AllNoAccess | export-csv -Encoding OEM -Path $LogNoAccess -NoTypeInformation
#endregion Save to File

Скачать FindLanShares.ps1

Блог на WordPress.com.