Feeds:
Записи
Комментарии

Archive for Сентябрь 2016

В проекте PSCX есть замечательная функция Show-Tree , которая послужит  основой в решении задачи.

function Show-ADTreeOU            
{            
    [CmdletBinding()]            
    param(            
        [Parameter(Position=0,             
                   ValueFromPipeline=$true,             
                   ValueFromPipelineByPropertyName=$true)]            
        [ValidateNotNullOrEmpty()]            
        [alias("DistinguishedName")]            
        [string]            
        $Path = (Get-ADDomain).DistinguishedName,            
                                
        [ValidateRange(0, 256)]            
        [int]            
        $Depth = [int]::MaxValue,             
                    
        [Parameter()]            
        [ValidateRange(1, 100)]            
        [int]            
        $IndentSize = 3,             
                    
        [Parameter()]            
        [ValidateRange(0, 2147483647)]            
        [int]            
        $Width,            
                    
        [Parameter()]            
        [switch]            
        $ShowLeafObject,            
            
                    
        [Parameter()]            
        [switch]            
        $UseAsciiLineArt            
    )            
            
    Begin            
    {            
        Set-StrictMode -Version Latest            
                    
                    
        if ($Width -eq 0)            
        {            
            $Width = $host.UI.RawUI.BufferSize.Width            
        }            
                    
        $asciiChars = @{            
            EndCap        = '\'            
            Junction      = '|'            
            HorizontalBar = '-'            
            VerticalBar   = '|'            
        }            
                    
        $cp437Chars = @{            
            EndCap        = '└'            
            Junction      = '├'            
            HorizontalBar = '─'            
            VerticalBar   = '│'            
        }            
                    
        if (($Host.CurrentCulture.TextInfo.OEMCodePage -eq 437) -and !$UseAsciiLineArt)            
        {            
            $lineChars = $cp437Chars            
        }            
        else            
        {            
            $lineChars = $asciiChars            
        }            
                           
        function GetIndentString([bool[]]$IsLast)            
        {            
            $str = ''            
            for ($i=0; $i -lt $IsLast.Count - 1; $i++)            
            {            
                $str += if ($IsLast[$i]) {' '} else {$lineChars.VerticalBar}            
                $str += " " * ($IndentSize - 1)            
            }            
            $str += if ($IsLast[-1]) {$lineChars.EndCap} else {$lineChars.Junction}            
            $str += $lineChars.HorizontalBar * ($IndentSize - 1)            
            $str            
        }            
                    
        function CompactString([string]$String, [int]$MaxWidth = $Width)            
        {            
            $updatedString = $String            
            if ($String.Length -ge $MaxWidth)            
            {            
                $ellipsis = '...'            
                $updatedString = $String.Substring(0, $MaxWidth - $ellipsis.Length - 1) + $ellipsis            
            }            
            $updatedString                
        }            
            
        function ShowItemText([string]$ItemPath, [string]$ItemName, [bool[]]$IsLast)            
        {            
            if ($IsLast.Count -eq 0)             
            {            
                $String = CompactString $ItemPath             
            }            
            else            
            {                     
                $String = CompactString "$(GetIndentString $IsLast)$ItemName "            
            }            
                        
            if($ShowLeafObject)             
            {            
                if($ItemPath)             
                {            
                    $Users = $Script:ADO[$ItemPath].Where({$_.ObjectClass -eq "user"}).Count            
     $Computers = $Script:ADO[$ItemPath].Where({$_.ObjectClass -eq "computer"}).Count            
                    $GR = $Script:ADO[$ItemPath].Where({$_.ObjectClass -eq "group"})            
                    $DL_GR_SEC = $GR.Where({$_.GroupScope -eq "DomainLocal" -and $_.GroupCategory -eq "Security"}).Count            
                    $GL_GR_SEC = $GR.Where({$_.GroupScope -eq "Global" -and $_.GroupCategory -eq "Security"}).Count            
                    $UN_GR_SEC = $GR.Where({$_.GroupScope -eq "Universal" -and $_.GroupCategory -eq "Security"}).Count            
                    $DL_GR_DIS = $GR.Where({$_.GroupScope -eq "DomainLocal" -and $_.GroupCategory -eq "Distribution"}).Count            
                    $GL_GR_DIS = $GR.Where({$_.GroupScope -eq "Global" -and $_.GroupCategory -eq "Distribution"}).Count            
                    $UN_GR_DIS = $GR.Where({$_.GroupScope -eq "Universal" -and $_.GroupCategory -eq "Distribution"}).Count            
            
                    [PSCustomObject]@{            
                        Name      = $String              
                        Users     = $Users            
      Computers = $Computers            
                        DL_GR_SEC = $DL_GR_SEC            
                        GL_GR_SEC = $GL_GR_SEC            
                        UN_GR_SEC = $UN_GR_SEC            
                        DL_GR_DIS = $DL_GR_DIS            
                        GL_GR_DIS = $GL_GR_DIS            
                        UN_GR_DIS = $UN_GR_DIS            
                    }            
                }            
            }             
            else             
            {            
               $String              
            }             
        }            
                    
                    
        function ShowItem([string]$ItemPath, [string]$ItemName='', [bool[]]$IsLast=@())            
        {                    
            # Show current item            
            ShowItemText $ItemPath $ItemName $IsLast            
                        
            # grab its children.  This let's us know if there            
            $childItems = @()            
            if ($IsLast.Count -lt $Depth)            
            {            
                $childItems = @(Get-ADOrganizationalUnit -Filter * -SearchBase $ItemPath -SearchScope OneLevel | Select DistinguishedName, Name)                   
            }            
            
            # Track parent's "last item" status to determine which level gets a vertical bar            
            $IsLast += @($false)            
                                    
            # Recurse through child items            
            for ($i=0; $i -lt $childItems.Count; $i++)            
            {            
                $childItemPath = $childItems[$i].DistinguishedName            
                $childItemName = $childItems[$i].Name            
                $IsLast[-1] = ($i -eq $childItems.Count - 1)            
                ShowItem $childItemPath $childItemName $IsLast            
            }            
        }            
    }            
            
    Process            
    {               
  if($ShowLeafObject)            
  {            
   $ADObjects = @()            
   $ADObjects += Get-ADObject -Filter "ObjectClass -eq 'user' -or ObjectClass -eq 'computers'" -SearchBase $Path            
   $ADObjects += Get-ADGroup -Filter * -SearchBase $Path            
               
   if($ADObjects)            
   {            
    $Script:ADO  = @{}            
    $ADO[$Path] = $ADObjects            
    $ADObjects | Group-Object {$_.DistinguishedName.Split(",",2)[1]} | Foreach-Object {            
     if($_.Name.StartsWith("OU="))            
     {            
      $ADO[$_.Name] = $_.Group            
     }                 
    }            
   }            
  }            
                    
  if($Path)             
  {                  
            ShowItem $Path             
        }             
    }                    
}

shtree

 

Файл: show-adtreeou-ps1.doc

Реклама

Read Full Post »

Рассмотрим отправку Post запроса, на примере сайта http://pr.nca.by/. Для этого можно воспользоваться двумя командлетами Invoke-WebRequest/Invoke-RestMethod, оба которые поддерживают параметр –Method.

Форма запроса на сайте выглядит:

form

 

Для получение параметров, которые требуется передать в теле post запроса , существует большое количество различных инструментов:

1. Встроенные средства браузеров, на примере IE/Google Chrome

Для запуска  Developer Tools в IE нажмите F12 или перейдите в меню

Tools –> F12 Developer Tools

IE_DV12

Переходим в раздел Network – нажимаем F5 и выполняем запрос:

IE_NET

 

Выбираем запрос и смотрим результаты:

IE_HR

IE_BODY

 

В Google Chrome для запуска инструментов разработчика нажмите F12 или перейдите в меню:

CH_DV12

CH_REQ

 

В Google Chrome удобно сделано копирование и можно сразу получить результат для утилиты curl.

CH_SV


curl "http://pr.nca.by/edc63526a304744e5976afdac72281a6.a_request.show_prices_count_test.xml" -H "Origin: http://pr.nca.by" -H "Accept-Encoding: gzip, deflate" -H "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4" -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" -H "Content-type: application/x-www-form-urlencoded" -H "Accept: */*" -H "Referer: http://pr.nca.by/" -H "Cookie: atereq=edc63526a304744e5976afdac72281a6; __utmt=1; __utma=97320926.45800996.1472894768.1472894768.1472916142.2; __utmb=97320926.1.10.1472916142; __utmc=97320926; __utmz=97320926.1472894768.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)" -H "Connection: keep-alive" --data "v_param=3&v_objnum=17030&v_date_begin=1.7.2016&v_date_end=3.9.2016&v_sq_begin=20&v_sq_end=200&v_purpose=40101&v_soato=5000000000&v_typ=3&v_name=&v_pr_b=25000&v_pr_e=250000&v_cur=4&v_url=http//pr.nca.by/&v_room=&v_floor_beg=&v_floor_end=&v_floor_number_beg=&v_floor_number_end=&v_input_date_beg=&v_input_date_end=&v_purpose_KSforIP=-1&v_wallmat=" --compressed

 

2. Программа-анализатор трафика WireShark

Фильтр: http && ip.dst_host == 93.125.111.85 (по HTTP и IP адресу назначения)

http && http.host contains «nca.by» (по HTTP и содержанию в хосте шаблона)

wr

 

3. Прокси программа для работы с веб – Fiddler

f1

 

Тело запроса:

f2

Ответ, как в текстовой форме, так и в XML:

f3

 

Теперь когда у нас есть все данные, мы можем сформировать Post запрос в PowerShell.

Чтобы отправить запрос на сайт, нам надо получить url-адрес, для этого мы должны перейти на сайт http://pr.nca.by/ , сохранить сессию в переменную. В cookies мы получаем значение atereq, которое участвует в формировании запроса.  И url запроса, должен иметь вид:

http://pr.nca.by/{atereq}.a_request.show_prices_count_test.xml

 

f4

 

$url = "http://pr.nca.by/"
$ct  = "application/x-www-form-urlencoded"
$s = Invoke-WebRequest $url -SessionVariable sb
$val = $sb.Cookies.GetCookies($url).Value
$purl = "${url}$val.a_request.show_prices_count_test.xml"
$r = Invoke-WebRequest $purl -ContentType $ct -WebSession $sb -Method Post -Body @{
	"v_param"="3"
	"v_objnum"="17030"
	"v_date_begin"="1.7.2016"
	"v_date_end"="31.7.2016"
	"v_sq_begin"="20"
	"v_sq_end"="200"
	"v_purpose"="40101"
	"v_soato"="5000000000"
	"v_typ"="3"
	"v_name"=""
	"v_pr_b"="25000"
	"v_pr_e"="2500000"
	"v_cur"="4"
	"v_url"="http//pr.nca.by/"
	"v_room"=""
	"v_floor_beg"=""
	"v_floor_end"=""
	"v_floor_number_beg"=""
	"v_floor_number_end"=""
	"v_input_date_beg"=""
	"v_input_date_end"=""
	"v_purpose_KSforIP"="-1"
	"v_wallmat"=""
}
([xml]$r.Content).response.rowcount_all

Примерный вывод:
PS > $r.Content
375

PS > ([xml]$r.Content).response.rowcount_all
375

При использовании командлета Invoke-RestMethod мы получим готовый ответ  в xml:

$r = Invoke-RestMethod $purl -ContentType $ct -WebSession $sb -Method Post .....

PS > $r
xml                            response
---                            --------
version="1.0" encoding="utf-8" response


PS > $r.response
type            rowcount_all
----            ------------
show_info_count 375


PS > $r.response.rowcount_all
375

Read Full Post »