Форум программистов, компьютерный форум, киберфорум
Наши страницы

PowerShell

Войти
Регистрация
Восстановить пароль
 
 
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
#1

Полезные PowerShell скрипты - PowerShell

26.10.2015, 09:45. Просмотров 21349. Ответов 24
Метки нет (Все метки)

Здесь публикуются полезные с практической точки зрения сценарии PowerShell или те, что могут послужить отправной точкой для решения насущных задач. Также всяк сюда постящий должен соблюдать одно простое правило - предварять публикуемый сценарий инструкцией #requires -version N, где N - версия хоста, под который весь код писан (или оговаривать под какими версиями код работает), дабы не возникало путаницы и вопросов, дескать, почему не работает и прочее в этом духе; также, если в том возникает необходимость, желательно указывать версию CLR. Например:

UserAssist.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#requires -version 2
<#
   .SYNOPSIS
        Приводит значения ветки реестра
        HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\*\Count
        к удобочитаемому виду
#>
(gp HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\*\Count) | % {
  $rot13 = New-Object "Collections.Generic.Dictionary[Char, Char]"
  $table = {param([Int32[]]$arr, [Int32]$lim)
    $arr | % {
      $$ = if ($_ -le $lim) {$_ + 13} else {$_ - 13}
      $rot13.Add([Char]$_, [Char]$$)
    }
  }
  $table.Invoke(65..90, 77)
  $table.Invoke(97..122, 109)
  "Session Counter      LastLaunchTime Name`n$('-'*7) $('-'*7)      $('-'*14) $('-'*4)"
}{
  $_.PSObject.Properties | ? {$_.Name -notlike 'PS*'} | % {
    $name = -join ($_.Name.ToCharArray() | % {if($rot13.ContainsKey($_)){$rot13[$_]}else{$_}})
    if ($_.Value.Length -eq 16) {
      $time = [BitConverter]::ToInt64($_.Value[8..15], 0)
      '{0,7}{1,8}{2,20} {3}' -f [BitConverter]::ToUInt32($_.Value[0..3], 0), [BitConverter]::ToUInt32(
          $_.Value[4..7], 0
      ), $(if($time -ne 0){[DateTime]::FromFileTime($time)}else{''}), $name
    }
    else {
      '{0,7}{1,8}{2,20} {3}' -f [BitConverter]::ToUInt32($_.Value[4..7], 0), '', '', $name
    }
  }
}
Clock.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#requires -version 2
<#
   .SYNOPSIS
         Изменяет заголовок хоста PowerShell на часы.
#>
& {
  $rex = '(\d{2}\:){2}\d{2}'
  [void]([PowerShell]::Create()).AddScript({
    while ($true) {
      [Console]::Title = $host.UI.RawUI.WindowTitle -replace $rex, (date -f 'HH:mm:ss')
      Start-Sleep -Seconds 1
    }
  }).BeginInvoke()
}
line.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<#
   .SYNOPSIS
         Рисует разноцветные линии (с текстом и без) в хосте PowerShell.
         Есть один небольшой недостаток: не работает перекрытие рисуемой
         линией приглашения хоста.
   .NOTES
         PowerShell 2 и 4.
#>
$line = {
  param(
    [Int32]$x, [Int32]$y, [String]$msg = $null,
    [ConsoleColor]$fc = 'White', [ConsoleColor]$bc = 'Black'
  )
  
  $pos = ($raw = $host.UI.RawUI).WindowPosition
  $con = $raw.WindowSize
  
  $pos.X += $x
  $pos.Y += $y
  
  switch ([String]::IsNullOrEmpty($msg)) {
    $true  {$msg = "$([Char]32)" * $con.Width}
    $false {$msg += "$([Char]32)" * ($con.Width - $msg.Length)}
  }
  $row = $raw.NewBufferCellArray(@($msg), $fc, $bc)
  
  $raw.SetBufferContents($pos, $row)
}
[Enum]::GetValues([ConsoleColor]) | % {
  &$line 0 ($$ = [Int32]$_) "Строка $$" $_
}
Пример работы
Полезные PowerShell скрипты
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2015, 09:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Полезные PowerShell скрипты (PowerShell):

PowerShell vs PowerShell ISE - PowerShell
Скажите, пожалуйста, чем PowerShell отличается от PowerShell ISE. Спасибо.

PowerShell - PowerShell
PowerShell Windows PowerShell — это новая оболочка командной строки на основе задач и язык сценариев. Она специально разработана для...

Powershell и AD - PowerShell
Доброго времени суток! Первый раз в жизни взялся за Powershell и столкнулся со следующей задачей: 1. Спрашивает у администратора...

Изучение PowerShell - PowerShell
// Перенесено из темы: http://www.cyberforum.ru/cmd-bat/thread1453691.html чтобы разбираться в этом коде, что надо почитать? я так...

Не запускается PowerShell - PowerShell
Выдает ошибку при запуске: Windows PowerShell завершена из-за следующей ошибки: Инициализатор типа...

работа с PowerShell - PowerShell
Добрый вечер, уважаемые Форумчане. есть задача, нужно написать скрипт PowerShell который бы допустим создавал внутри себя объект...

24
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
04.12.2015, 12:40  [ТС] #16
Convert-Docx2Text.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#requires -version 2
function Convert-Docx2Text {
  <#
    .SYNOPSIS
        Конвертирует DOCX в TXT.
    .DESCRIPTION
        Эта демо-функция создает текстовый файл в той же папке,
        что и оригинальный документ, не используя при этом MS Office
        или какие-то сторонние инструменты.
    .EXAMPLE
        PS C:\Users\Admin\Documents> Convert-Docx2Text pecoff_v83.docx
  #>
  param(
    [Parameter(Mandatory=$true)]
    [ValidateScript({Test-Path $_})]
    [String]$FileName
  )
  
  begin {
    # MIME DOCX'а - application/x-zip-compressed
    $FindMimeFromData = {
      [OutputType([String])]
      param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [String]$FileName
      )
      
      Add-Type -AssemblyName ($$ = 'PresentationCore')
      try {
        $fs = [IO.File]::OpenRead($FileName)
        if (($len = $fs.Length) -gt 4096) { $len = 4096 }
        $buf = New-Object "Byte[]" $len
        [void]$fs.Read($buf, 0, $buf.Length)
        
        $gch = [Runtime.InteropServices.GCHandle]::Alloc($buf, 'Pinned')
        $ptr = $gch.AddrOfPinnedObject()
        
        if (([AppDomain]::CurrentDomain.GetAssemblies() | ? {
          $_.ManifestModule.ScopeName.Equals("$$.dll")
        }).GetType(
          'MS.Win32.Compile.UnsafeNativeMethods'
        ).GetMethod(
          'FindMimeFromData', [Reflection.BindingFlags]40
        ).Invoke($null, (
          $$ = [Object[]]($null, $FileName, $ptr, [Int32]$len, $null, 0, $mime, 0)
        )) -ne 0) {
          throw New-Object Exception('Could not get MIME type.')
        }
      }
      catch { $_.Exception }
      finally {
        if ($gch -ne $null) { $gch.Free() }
        if ($fs -ne $null) { $fs.Close() }
      }
      $$[6] # MIME
    }
    
    $FileName = Convert-Path $FileName
  }
  process {
    # проверяем файл по MIME и расширению...
    if (($ext = (Get-Item $FileName).Extension) -ne '.docx'-and
        $FindMimeFromData.Invoke($FileName) -ne 'application/x-zip-compressed'
    ) {
      Write-Warning 'unsupported file format.'
    }
    # ...а также наличию word/document.xml
    try {
      $fs = [IO.File]::OpenRead($FileName)
      $br = New-Object IO.BinaryReader($fs)
      
      while ($true) {
        if ($br.ReadUInt32() -ne 67324752) {break} # local header'ов больше не осталось
        $fs.Position += 14
        $csz = $br.ReadUInt32() # размер сжатых данных (можно в общем-то пропустить)
        $fs.Position += 4
        $fnl = $br.ReadUInt16() # длина имени файла
        $efl = $br.ReadUInt16() # длина дополнительного поля
        if ((-join $br.ReadChars($fnl)) -eq 'word/document.xml') {
          $fs.Position += $efl # пропускаем дополнительные данные
          try { # извлекаем сжатые данные (xml)
            $ds = New-Object IO.Compression.DeflateStream($fs, 'Decompress')
            $of = [IO.File]::Create(($$ = $FileName -replace $ext, '.txt'))
            
            while ($true) {
              $buf = New-Object "Byte[]" 100
              $get = $ds.Read($buf, 0, $buf.Length)
              $of.Write($buf, 0, $get)
              
              if ($get -ne $buf.Length) {break}
            }
          }
          catch { $_.Exception }
          finally {
            if ($of -ne $null) { $of.Close() }
            if ($ds -ne $null) { $ds.Close() }
          }
          break
        }
        $fs.Position += $efl + $csz
      }
    }
    catch { $_.Exception }
    finally {
      if ($br -ne $null) { $br.Close() }
      if ($fs -ne $null) { $fs.Close() }
    }
  }
  end {
    if (Test-Path $$) { # если все пучком, конвертируем xml в txt
      $xml = [xml](Get-Content $$)
      Out-File $$ -InputObject $xml.document.InnerText -Encoding Default
    }
  }
}
1
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
11.12.2015, 13:36  [ТС] #17
Определение архитектуры процессора
PowerShell
1
2
3
4
5
6
7
8
<#
  Версия PowerShell -eq [2|4]
#>
[PSObject].Assembly.GetType(
  'System.Management.Automation.PsUtils'
).GetMethod(
  'GetProcessorArchitecture', [Reflection.BindingFlags]40
).Invoke($null, @())
Uptime
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<#
  Версия PowerShell -eq [2|4]
#>
try {
  $ptr = [Runtime.InteropServices.Marshal]::AllocHGlobal(48)
  if ([Regex].Assembly.GetType(
    'Microsoft.Win32.NativeMethods'
  ).GetMethod(
    'NtQuerySystemInformation'
  ).Invoke($null, @(3, $ptr, 48, 0)) -eq 0) {
    '{0:D2}:{1:D2}:{2:D2} up {3} day{4}' -f ($$ = (Get-Date) - [DateTime]::FromFileTime(
      [Runtime.InteropServices.Marshal]::ReadInt64($ptr)
    )).Hours, $$.Minutes, $$.Seconds, $$.Days, $(if($$.Days -gt 1){'s'}else{''})
  }
}
catch { $_.Exception }
finally {
  if ($ptr -ne $null) {
    [Runtime.InteropServices.Marshal]::FreeHGlobal($ptr)
  }
}
Состояние памяти
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<#
  Версяи PowerShell -eq [2|4]
#>
$MEMORYSTATUSEX = ($a = [Object].Assembly).GetType(
  "$($$ = 'Microsoft.Win32.Win32Native')$$+MEMORYSTATUSEX"
).GetConstructor(
  [Reflection.BindingFlags]36, $null, [Type[]]@(), $null
).Invoke($null)
 
if ($a.GetType($$).GetMethod(
  'GlobalMemoryStatusEx', [Reflection.BindingFlags]40
).Invoke($null, @($MEMORYSTATUSEX))) {
  $MEMORYSTATUSEX.GetType().GetFields([Reflection.BindingFlags]36) | % {
    $mem = @{}
  }{
    if ($_.Name -match 'total|avail') {
      $mem[$_.Name] = '{0:f3} Gb' -f ($_.GetValue($MEMORYSTATUSEX) / 1Gb)
    }
    elseif ($_.Name -match 'load') {
      $mem[$_.Name] = '{0} %' -f $_.GetValue($MEMORYSTATUSEX)
    }
  }{ $mem | Format-Table -Auto }
}
1
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
26.12.2015, 16:01  [ТС] #18
Определение наличие прав администратора
PowerShell
1
2
3
4
5
6
#requires -version 5
[PSObject].Assembly.GetType(
   'System.Management.Automation.Utils'
).GetMethod(
   'IsAdministrator', [Reflection.BindingFlags]40
).Invoke($null, @())
Проверка является ли запущенный хост 64-битным
PowerShell
1
2
3
4
5
6
#requires -version 5
[PSObject].Assembly.GetType(
   'System.Management.Automation.Utils'
).GetMethod(
   'IsRunningFromSysWOW64', [Reflection.BindingFlags]40
).Invoke($null, @())
0
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
28.12.2015, 12:24  [ТС] #19
Get-Strings.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#requires -version 2
function Get-Strings {
  <#
    .SYNOPSIS
        Извлекает строки из файла.
    .DESCRIPTION
        Функция Get-Strings спроектирована по типу утилиты strings.exe из набора
        Sysinternals Suite; она возвращает Ascii и\или Unicode строки из бинарных
        файлов, а также сужает круг поиска за счет дополнительных параметров.
        Функция совместима с версиями PowerShell > 2.
    .PARAMETER Path
        Задает путь до файла.
    .PARAMETER BytesToProcess
        Задает количество байт для обработки.
    .PARAMETER BytesOffset
        Задает смещение, с которого нужно начинать поиск.
    .PARAMETER StringLength
        Задает минимальную длину строки (по умолчанию 3).
    .PARAMETER StringOffset
        Указывает стоит ли выводить адрес смещения совпадения.
    .PARAMETER Unicode
        Указывает вести поиск только Unicode строк.
    .EXAMPLE
        PS C:\> Get-Strings C:\Windows\System32\ntdll.dll
        
        Описание
        -----------
        Дамп Ascii и Unicode строк ntdll.dll.
    .EXAMPLE
        PS C:\> Get-ChildItem C:\proj -Filter *.exe | Get-Strings -Unicode
        
        Описание
        -----------
        Выводит Unicode строки каждого exe-файла, находящегося в папке C:\proj.
    .INPUTS
        Path           - String[]
        BytesToProcess - UInt32
        BytesOffset    - UInt32
        StringLength   - UInt16
        StringOffset   - Switch
        Unicode        - Switch
    .OUTPUTS
        String[]
    .LINK
        _https://technet.microsoft.com/en-us/sysinternals/strings
    .NOTES
        Author: greg zakharov
  #>
  [CmdletBinding(DefaultParameterSetName='Path')]
  param(
    [Parameter(Mandatory=$true, Position=0, ParameterSetName='Path', ValueFromPipelineByPropertyName=$true)]
    [ValidateScript({Test-Path $_ -PathType Leaf})]
    [Alias('PSPath')]
    [String[]]$Path,
    
    [Parameter()]
    [UInt32]$BytesToProcess = 0,
    
    [Parameter()]
    [UInt32]$BytesOffset = 0,
    
    [Parameter()]
    [UInt16]$StringLength = 3,
    
    [Parameter()]
    [Switch]$StringOffset,
    
    [Parameter()]
    [Switch]$Unicode
  )
  
  begin {
    $enc = [Text.Encoding]::$(if($Unicode){'Unicode'}else{'UTF7'})
    
    function private:Search-Strings([String]$File) {
      try {
        $fs = [IO.File]::OpenRead($File)
        
        if ($BytesToProcess -gt $fs.Length -or $BytesOffset -gt $fs.Length) {
          throw New-Object IO.IOException('Out of file stream.')
        }
        
        if ($BytesOffset -gt 0) { [void]$fs.Seek($BytesOffset, [IO.SeekOrigin]::Begin) }
        
        $buf = switch ($BytesToProcess -gt 0) {
          $true  { New-Object "Byte[]" ($fs.Length - ($fs.Length - $BytesToProcess)) }
          $false { New-Object "Byte[]" $fs.Length }
        }
        [void]$fs.Read($buf, 0, $buf.Length)
        
        ([Regex]"[\x20-\x7E]{$StringLength,}").Matches(
          $enc.GetString($buf)
        ) | ForEach-Object {
          if ($StringOffset) { '{0}:{1}' -f $_.Index, $_.Value } else { $_.Value }
        }
      }
      catch {
        Write-Verbose $_.Exception
      }
      finally {
        if ($fs) {
          $fs.Dispose()
          $fs.Close()
        }
      }
    }
  }
  process {
    $Path | ForEach-Object { Search-Strings (Resolve-Path $_) }
  }
}
Get-PipeList.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#requires -version 2
function Get-PipeList {
  <#
    .SYNOPSIS
        Выводит список именованных каналов.
    .DESCRIPTION
        По функциональности сценарий близок к pipelist.exe из набора
        Sysinternals Suite, однако имеет небольшие расхождения.
    .EXAMPLE
        PS C:\> Get-PipeList | Format-Table -Auto
  #>
  begin {
    # FinFirstFile, FindNextFile
    ($$ = [Object].Assembly.GetType(
      'Microsoft.Win32.Win32Native'
    )).GetMethods(
      [Reflection.BindingFlags]40
    ) | Where-Object {
      $_.Name -cmatch '\AFind(F|Ne).*\Z'
    } | ForEach-Object {
      Set-Variable $_.Name $_
    }
    # WIN32_FIND_DATA
    $WIN32_FIND_DATA = [Activator]::CreateInstance(
      $$.GetNestedType(
        'WIN32_FIND_DATA', [Reflection.BindingFlags]36
      )
    )
    # Read-FindData
    function private:Read-FindData {
      $field = {
        param([String]$FieldName)
        
        $WIN32_FIND_DATA.GetType().GetField(
          $FieldName, [Reflection.BindingFlags]36
        ).GetValue($WIN32_FIND_DATA)
      }
      
      New-Object PSObject -Property @{
        Name = &$field cFileName
        Instances = &$field nFileSizeLow
      }
    }
  }
  process {
    try {
      $fff = $FindFirstFile.Invoke($null, @('\\.\pipe\*', $WIN32_FIND_DATA))
      Read-FindData
      
      while ($FindNextFile.Invoke($null, @($fff, $WIN32_FIND_DATA))) {
        Read-FindData
      }
    }
    catch {
      Write-Verbose $_.Exception.Message
    }
    finally {
      if ($fff) {
        $fff.Dispose()
        $fff.Close()
      }
    }
  }
}
0
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
01.01.2016, 21:21  [ТС] #20
Get-Process - прокси-функция
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#requires -version 2.0
function Get-Process {
  <#
    .ForwardHelpTargetName Get-Process
    .ForwardHelpCategory Cmdlet
  #>
  [CmdletBinding(DefaultParameterSetName='Name')]
  param(
    [Parameter(ParameterSetName='Name', Position=0, ValueFromPipelineByPropertyName=$true)]
    [Alias('ProcessName')]
    [ValidateNotNullOrEmpty()]
    [String[]]
    ${Name},
    
    [Parameter(ParameterSetName='Id', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
    [Alias('PID')]
    [Int32[]]
    ${Id},
    
    [Parameter(ValueFromPipelineBypropertyName=$true)]
    [Alias('Cn')]
    [ValidateNotNullOrEmpty()]
    [String[]]
    ${ComputerName},
    
    [ValidateNotNull()]
    [Switch]
    ${Module},
    
    [Alias('FV', 'FVI')]
    [ValidateNotNull()]
    [Switch]
    ${FileVersion},
    
    [Parameter(ParameterSetName='InputObject', Mandatory=$true, ValueFromPipeline=$true)]
    [Diagnostics.Process[]]
    ${InputObject},
    
    [Parameter(ParameterSetName='ParentId')]
    [Alias('PPID')]
    [Switch]
    ${ParentId}
  )
  
  begin {
    try {
      $outBuffer = $null
      if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) {
        $PSBoundParameters['OutBuffer'] = 1
      }
      $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand(
        'Get-Process', [Management.Automation.CommandTypes]::Cmdlet
      )
      $null = $PSBoundParameters.Add('OutVariable', 'out')
      if ($PSBoundParameters['ParentId']) {
        $null = $PSBoundParameters.Remove('ParentId')
        $ParentId = $true
      }
      $scriptCmd = {& $wrappedCmd @PSBoundParameters | Out-Null}
      $steppablePipeline = $scriptCmd.GetSteppablePipeline($MyInvocation.CommandOrigin)
      $steppablePipeline.Begin($PSCmdlet)
    }
    catch {
      throw
    }
    
    $spc = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object {
      $_.ManifestModule.ScopeName.Equals('Microsoft.PowerShell.Commands.Management.dll')
    }).GetType('Microsoft.PowerShell.Commands.StopProcessCommand')
    $GetProcessOwnerId = $spc.GetMethod(
      'GetProcessOwnerId', [Reflection.BindingFlags]36
    )
    $spcType = New-Object $spc
    
    function Get-ParentId([String]$s) {
      (New-Object Diagnostics.PerformanceCounter('Process', 'Creating Process ID', $s)).RawValue
    }
    
    function Get-UserName([Diagnostics.Process]$p) {
      $GetProcessOwnerId.Invoke($spcType, $p)
    }
  }
  process {
    try {
      $steppablePipeline.Process($_)
    }
    catch {
      throw
    }
  }
  end {
    try {
      $steppablePipeline.End()
      $table = $out | ForEach-Object {
        New-Object PSObject -Property @{
          ProcessName = $_.ProcessName
          PID         = $_.Id
          Priority    = $_.BasePriority
          UserName    = $(try {Get-UserName $_} catch {})
          WS          = $_.WorkingSet64 / 1Kb
          PM          = $_.PrivateMemorySize64 / 1Kb
          VM          = [Math]::Round($_.VirtualMemorySize64 / 1Mb)
          Description = $_.Description
        } | Select-Object ProcessName, PID, Priority, UserName, WS, PM, VM, Description
      }
      
      if ($ParentId) {
        foreach ($t in $table) {
          $t | Add-Member PPID -MemberType ScriptProperty -Value {
            (New-Object Diagnostics.PerformanceCounter(
              'Process', 'Creating Process ID', $this.ProcessName
            )).RawValue
          }
        }
      }
            
      $table | Format-Table -AutoSize
    }
    catch {
      throw
    }
  }
}
0
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
19.01.2016, 14:18  [ТС] #21
Get-LoadedDrivers - список загруженных драйверов
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#requires -version 5
function Get-LoadedDrivers {
  <#
    .SYNOPSIS
        Выводит список загруженных драйверов.
    .NOTES
        Несмотря на указанную версию PS, сценарий при минимальных правках (а может даже
        и без оных) вполне работоспособен и на более ранних версиях.
        Author: greg zakharov
  #>
  begin {
    if (($$ = [PSObject].Assembly.GetType(
      'System.Management.Automation.TypeAccelerators'
    ))::Get.Keys -notcontains 'Marshal') {
      [void]$$::Add('Marshal', [Runtime.InteropServices.Marshal])
    }
    
    $NtQuerySystemInformation = [Regex].Assembly.GetType(
      'Microsoft.Win32.NativeMethods'
    ).GetMethod('NtQuerySystemInformation')
    $ret = 0
  }
  process {
    try {
      $ptr = [Marshal]::AllocHGlobal(1024)
      if ($NtQuerySystemInformation.Invoke($null, ($par = [Object[]]@(
          11, $ptr, 1024, $ret
      ))) -ne 0) {
        $ptr = [Marshal]::ReAllocHGlobal($ptr, [IntPtr]$par[3])
        if ($NtQuerySystemInformation.Invoke($null, @(11, $ptr, $par[3], 0)) -ne 0) {
          throw New-Object InvalidOperationException('Unable get correct buffer length.')
        }
      }
      
      0..([Marshal]::ReadInt32($ptr) - 1) | % {$i = 12}{
        New-Object PSObject -Property @{
          Address = '0x{0:x}' -f [Marshal]::ReadInt32($ptr, $i)
          Size    = [Marshal]::ReadInt32($ptr, $i + 4)
          Path    = ([Marshal]::PtrToStringAnsi([IntPtr](
              $ptr.ToInt64() + $i + 20), 256
          )).Split("`0")[0]
        }
        $i += 20 + 256 + 8
      } | Select-Object Address, Size, Path
    }
    catch {
      $_.Exception
    }
    finally {
      if ($ptr) {
        [Marshal]::FreeHGlobal($ptr)
      }
    }
  }
  end {
    [void]$$::Remove('Marshal')
  }
}
0
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
11.02.2016, 15:44  [ТС] #22
Get-ParentProcess.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#requires -version 2
function Get-ParentProcess {
  <#
    .SYNOPSIS
        Возвращет PID родителя указанного процесса.
    .EXAMPLE
        PS C:\> Get-ParentProcess 1620
 
        Name : explorer
        PID  : 1956
  #>
  param(
    [Parameter(Mandatory=$true, Position=0)]
    [Int32]$Id
  )
 
  [Regex].Assembly.GetType(
    'Microsoft.Win32.NativeMethods'
  ).GetMethods() | ? {
    $_.Name -match '\A(Nt|Open).*Process\Z'
  } | % { Set-Variable $_.Name $_ }
 
  $NtProcessBasicInfo = [Regex].Assembly.GetType(
    'Microsoft.Win32.NativeMethods+NtProcessBasicInfo'
  ).GetConstructor(
    'Public, Instance', $null, [Type[]]@(), $null
  ).Invoke($null)
 
  if (($sph = $OpenProcess.Invoke($null, @(0x400, $false, $Id))).IsInvalid) {
    return
  }
 
  [Int32[]]$ret = @()
  if ($NtQueryInformationProcess.Invoke($null, ($par = [Object[]]@(
    $sph, 0, $NtProcessBasicInfo,
    [Runtime.InteropServices.Marshal]::SizeOf($NtProcessBasicInfo), $ret
  ))) -eq 0) {
    New-Object PSObject -Property @{
      Name = (Get-Process -Id ($$ = $par[2].InheritedFromUniqueProcessId) -ea 0).Name
      PID  = $$
    } | Format-List
  }
 
  $sph.Close()
}
0
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
15.02.2016, 17:33  [ТС] #23
Expand-MsiPackage.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#requires -version 2
function Expand-MsiPackage {
  <#
    .SYNOPSIS
        Распаковывает MSI пакеты.
    .DESCRIPTION
        Для распаковки используется msiexec, что в свою
        очередь накладывает ограничения, определенные
        данной службой.
    .EXAMPLE
        PS E:\dist> Expand-MsiPackage python-3.4.4.msi E:\python
  #>
  param(
    [Parameter(Mandatory=$true, Position=0)]
    [ValidateScript({Test-Path $_})]
    [String]$MsiPackage,
 
    [Parameter(Mandatory=$true, Position=1)]
    [String]$Destination
  )
 
  $MsiPackage = Convert-Path $MsiPackage
 
  if (!(Test-Path $Destination)) {
    [void](ni $Destination -Type directory)
  }
  msiexec /a $MsiPackage /qb TARGETDIR=$Destination
}
0
greg zakharov
Покинул форум
1915 / 791 / 198
Регистрация: 07.05.2015
Сообщений: 1,585
Записей в блоге: 33
15.02.2017, 16:26  [ТС] #24
Чтение содержимого RAR-архива без сторонних утилит
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
function Get-RarContent {
  <#
    .SYNOPSIS
        Получает содержимое RAR-архива.
  #>
  param(
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [ValidateScript({Test-Path $_})]
    [String]$Path
  )
 
  begin {
    # сигнатура rar
    [Byte[]]$rar = 0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00
  }
  process {
    try {
      $fs = [IO.File]::OpenRead((Convert-Path $Path))
      $br = New-Object IO.BinaryReader($fs)
 
      if (($cmp = Compare-Object ($br.ReadBytes(7)) $rar -PassThru)) {
        throw New-Object IO.IOException(
          'Specified file is nat a RAR archive, try another.'
        )
      }
      # MAIN_HEAD
      if (($mhd = $br.ReadBytes(7))[2] -ne 0x73) {
        throw New-Object IO.IOException(
          'Структура MAIN_HEAD не была найдена.'
        )
      }
      # прыгаем на первый файл
      [void]$fs.Seek((
        [BitConverter]::ToUInt16($mhd[5..6], 0) - 7
      ), [IO.SeekOrigin]::Current)
      # прогуливаемся по всем доступным значениям
      $content = while ($true) {
        $seg = $br.ReadBytes(7) # начало блока
        if (($bsz = [BitConverter]::ToUInt16($seg[5..6], 0)) -le 7) {
          break # nothing to read
        }
 
        $seg += $br.ReadBytes($bsz - 7) # весь блок
        # проверяем что текущий объект является файлом\папкой
        if ($seg[2] -eq 0x74) {
          [void]$fs.Seek((
            $cmp = [BitConverter]::ToUInt32($seg[7..10], 0) # сжатие
          ), [IO.SeekOrigin]::Current)
 
          if ((
            $atr = [BitConverter]::ToUInt32($seg[28..31], 0)
          ) -band 0x10 -or $atr -band 0x4000) {
            continue # а нафига нам пути папок?!
          }
 
          New-Object PSObject -Property @{
            Name = -join [Char[]]$seg[32..(
              32 + [BitConverter]::ToUInt16($seg[26..27], 0
            ) - 1)]
            Cmpd = $cmp
            Size = [BitConverter]::ToUInt32($seg[11..14], 0)
            Attr = -join (([IO.FileAttributes]$atr).ToString().Split(
              ', ', [StringSplitOptions]::RemoveEmptyEntries
            ) | ForEach-Object { $_[0] })
            #Crc32 = '0x{0:X}' -f ([BitConverter]::ToUInt32($seg[16..19], 0))
          }
        }
        else {
          if ([BitConverter]::ToUInt16($seg[3..4], 0) -band 0x8000) {
            [void]$fs.Seek([BitConverter]::ToUInt32(
              $seg[7..10], 0), [IO.SeekOrigin]::Current
            )
          }
        }
      } # while
    }
    catch { Write-Warning $_ }
    finally {
      if ($br) { $br.Close() }
      if ($fs) { $fs.Dispose() }
    }
  }
  end {
    if ($content) {
      $content | Select-Object Attr, Size, Cmpd, Name |
      Format-Table -AutoSize
    }
  }
}
0
Garry Galler
1187 / 930 / 275
Регистрация: 28.10.2013
Сообщений: 2,304
26.09.2017, 18:42 #25
watchdog.ps1
Набор функций-командлетов для наблюдения за изменениями файлов\директорий на основе класса FileSystemWatcher.
Для удобства использования можно поместить их в файл powershell профиля - тогда они будут доступны наравне с прочими командами сразу из консоли,
либо поместить файл модуля watchdog.ps1 в папку powershell модулей
.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# required -version 3.0
set-alias swatch Set-Watch 
function Set-Watch() {
<#
    .SYNOPSIS
        Запускает фоновый процесс отслеживания изменений файловой системы на основе класса FileSystemWatcher
    .DESCRIPTION
        Существующие фильтры отслеживаемых изменений:
        NotifyFilters.CreationTime
        NotifyFilters.LastAccess
        NotifyFilters.LastWrite
        NotifyFilters.FileName
        NotifyFilters.DirectoryName
        NotifyFilters.Security
        NotifyFilters.Size
        NotifyFilters.Attributes
    .EXAMPLE
        PS C:\> . .\watchdog.ps1           
        PS C:\> swatch -path "d:\test" -filter "*.txt"  -event Created,Deleted 
    .EXAMPLE    
        PS C:\> swatch -path "d:\test" -filter "*.txt"  -event Created,Deleted  -command "start-process notepad.exe" -test
    .LINK 
        [url]https://msdn.microsoft.com/ru-ru/library/system.io.filesystemwatcher(v=vs.110).aspx[/url]
    .LINK
        Remove-Watch
    .LINK
        Disable-Watch
    .LINK 
        Enable-Watch
    .LINK
        Get-Watch
#>
 
[CmdletBinding()] 
param(
    # путь до отслеживаемой директории
    [parameter(Mandatory=$true,Position=1)]
    [alias("p")][string]$path,                           
    [parameter(Mandatory=$true,Position=2)]
    # фильтр типов отслеживаемых файлов
    [alias("f")][string]$filter="*.*",                   
    # задает тип отслеживаемых изменений
    [alias("n")][string]$notify='FileName, LastWrite',   
    # нужно ли рекурсивно отслеживать субдиректории 
    [alias("r")][switch]$recurse,                        
     # событи(e|я) на котор(ое|ые) нужно реагировать
    [parameter(Mandatory=$true,Position=3)]
    [ValidateSet("Created","Deleted","Renamed","Changed")]
    [alias("e")][string[]]$events,                      
    [parameter(Mandatory=$false)]
    # строковые идентифкаторы событий
    [alias("name")][string[]]$id=@(),
    # действие которое нужно выполнить - передается одной строкой вместе с аругментами
    [string]$command,                                    
    # вывод переданных аргументов
    [switch]$test
    )
 
  
    $fsw = New-Object IO.FileSystemWatcher -Property @{
        Path = $path
        Filter = $filter
        IncludeSubdirectories = $recurse
        NotifyFilter = [IO.NotifyFilters]$notify
    }
    Set-Variable __watcher -Value $fsw -Scope Script
 
    Set-Variable command -Value $command -Scope Script
    
    $action = {
        #$command  = Get-Variable command -valueOnly -Scope Global
        $fullPath   = $event.SourceEventArgs.FullPath
        $fileName   = $event.SourceEventArgs.Name
        $changeType = $event.SourceEventArgs.ChangeType
        $timeStamp  = $event.TimeGenerated
        Write-Host "The file '$fileName' was $changeType at $timeStamp"
        
 
        if (![String]::IsNullOrEmpty($command)) {
            Invoke-Expression $command 
        }
 
    }
    
    $calls = [Collections.ArrayList]::new()
    
    for ($i=0; $i -lt $events.length; $i++) {
        
        if ($id.Length -eq $events.Length){
            $jobname = $id[$i]   
        } else {
            $jobname = $events[$i]
        }
        
        $params = @{SourceIdentifier = $jobname; Action = $action}
        if ((get-job).Name -ccontains $jobname) {
            Write-Host "Задание $jobname уже существует" -f Red
            
        } else {
            $regEvent = Register-ObjectEvent $fsw $events[$i] @params
            $calls.Add($regEvent)|Out-Null 
        }
        
    }
 
    # выводим аргументы функции
    if ($test) {
        $MyInvocation.BoundParameters.GetEnumerator() | Foreach { 
            echo "-$($_.Key): $($_.Value)"
        }
        $MyInvocation.UnboundArguments
        '----------------------------'
    }
 
    return $calls
}
 
set-alias unwatch Disable-Watch
function Disable-Watch() {
<#
    .SYNOPSIS
        Временно отключает обработку событий
    .LINK 
        Enable-Watch
    .LINK
        Remove-Watch
    .LINK
        Get-Watch
    .LINK
        Set-Watch
#>
    if ($__watcher) {
        $__watcher.EnableRaisingEvents = $false
        Write-Host "Отслеживание событий отключено" -f Yellow -b DarkGray
    }
}
 
set-alias watch Enable-Watch    
function Enable-Watch() {
<#
    .SYNOPSIS
        Включает обработку событий
    .LINK
        Disable-Watch
    .LINK
        Remove-Watch
    .LINK
        Get-Watch
    .LINK
        Set-Watch
#>    
    if ($__watcher) {
        $__watcher.EnableRaisingEvents = $true
        Write-Host "Отслеживание событий включено" -f Green -b DarkGray
    }
}
 
set-alias gwatch Get-Watch    
function Get-Watch() {
<#
    .SYNOPSIS
        Получает сторожевой объект для установки новых свойств (если указаны)
        и возвращает его 
    .EXAMPLE    
        PS C:\> (gwatch).filter = "*.*"     # установить новый файловый фильтр
        PS C:\> gwatch -Filter *.*
    .EXAMPLE    
        PS C:\> (gwatch).path= "c:\windows" # установить новую директорию для отслеживания
        PS C:\> gwatch -Path "c:\windows" 
    .EXAMPLE
        PS C:\> gwatch -NotifyFilter "Filename,LastWrite,LastAccess" -Filter "*.*"
    .EXAMPLE
        PS C:\> gwatch -IncludeSubdirectories
        PS C:\> gwatch -IncludeSubdirectories:$false
    .OUTPUTS
       FileSystemWatcher 
    .LINK
        Set-Watch
    .LINK
        Disable-Watch
    .LINK
        Remove-Watch
    .LINK
        Get-Watch 
#>    
param(
    [string]$Path,
    [string]$Filter,
    [switch][Boolean]$IncludeSubdirectories,
    [string]$NotifyFilter
 
)    
    if ($__watcher -eq $null) {
        Write-Host "Объект FileSystemWatcher не определен" -f Red
    } else { 
        
        $type_watcher = $__watcher.gettype()
        $MyInvocation.BoundParameters.GetEnumerator() | %{ 
           $key = $_.Key
           $value = $_.Value
           if ($key -eq "NotifyFilter") {
                $value = [IO.NotifyFilters]$value
           }
           if ($key -eq "IncludeSubdirectories") {
                [Boolean]$value = $value
           }
           $prop = $type_watcher.GetProperty($key)
           $prop.SetValue($__watcher, $value)
        }
        
        return $__watcher
    }
} 
 
 
set-alias rwatch Remove-Watch 
function Remove-Watch() {
<#
    .SYNOPSIS
        Удаляет задание по списку имен, либо все
    .EXAMPLE    
        PS C:\> rwatch Created,Deleted    # удалить задания по именам 
    .EXAMPLE    
        PS C:\> rwatch                    # удалить все задания
    .LINK 
        Set-Watch
#>     
    
    [CmdletBinding()]  
    param(
    [string[]]$names
    )
    if ($names.Length -eq 0) { 
        $names = (get-job).Name
    }
 
    
    
    foreach ($jobname in $names) {
        if ((get-job).Name -ccontains $jobname) {
            Unregister-Event $jobname -Force
            Remove-Job -Name $jobname -Force
            Write-Host "Задание $jobname удалено" -f Green -b DarkGray
        } else {
           Write-Host "Задание $jobname не найдено" -f Yellow -b DarkMagenta
        }
    }
    Set-Variable __watcher -Value $null -Scope Script
}
2
26.09.2017, 18:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2017, 18:42
Привет! Вот еще темы с ответами:

Кратко о PowerShell. - PowerShell
PowerShell задумывался как замена старому и глючному WSH. Во время своего появления в 2006г - это была отдельная прога, требующая...

DHCP vs. PowerShell 2.0 - PowerShell
есть Windows Server 2008 r2 x64. есть не совсем маленькая сетка, где надо резервировать порядка 60 адресов в DHCP. понятное дело, что при...

Мьютекс в PowerShell - PowerShell
Возник такой вопрос допустим отработало условие if(func1) и код запустился в отдельном потоке, обозначим его условно THREAD1. Затем в цикле...

Powershell Where-Object - PowerShell
Добрый день, коллеги. Никак не могу найти вкурить как грамотно использовать where-object: Вывод всех событий за последние пол часа из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru