Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/125: Рейтинг темы: голосов - 125, средняя оценка - 4.94
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
1

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

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

Здесь публикуются полезные с практической точки зрения сценарии 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 vs PowerShell ISE
Скажите, пожалуйста, чем PowerShell отличается от PowerShell ISE. Спасибо.

Powershell и AD
Доброго времени суток! Первый раз в жизни взялся за Powershell и столкнулся со...

Ftp powershell
Подскажите. Есть такой скрипт, работает с фтп нормально, файлы закидывает, но...

Курсы Powershell
Добрый день, просьба посоветовать, с чего начать изучение powershell, где...

Powershell Core
Что интересно, установка Powershell Core для MacOS заняла меньше минуты,...

25
Garry Galler
1436 / 1158 / 426
Регистрация: 28.10.2013
Сообщений: 2,937
26.10.2015, 17:15 2
Конвертация документа Word в любой поддерживаемый формат

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
#requires -version 2
function SaveWDocAs{
 
<#
.Synopsis
    Сохраняет документ Word в любой поддерживаемый формат.
    Требуется установленный Microsoft Office Word 2007 или более поздняя версия и .NET Framework не ниже 2.0.
 
.Parameter source
    Путь или список путей до файлов документа word.
    Параметр обязательный - указывается первым или по имени.
    Принимает список значений из конвейера, например, выдачу командлета dir.
 
.Parameter type
    Тип файла: txt\pdf\rtf и т.д.
    Файл с указанным расширением будет создан согласно пути в параметре output,
    либо в текущем рабочем каталоге. 
    Обязательный параметр - указывается только по имени, если путь передан по конвейеру,
    либо без имени в позиции 2, если первым указан путь. 
 
.Parameter format
    Формат выходного файла: указывается любой тип из перечисления WdSaveFormat.
    Можно указать числовой эквивалент вместо имени формата.
    Необязательный параметр. Указывается третьим или по имени. 
    Если отсутствует - скрипт пытается угадать тип на основе параметра type.
    Это работает для типов pdf\rtf\xml\xps\html.
 
.Parameter output
    Выходная папка, в которой будут созданы файлы. Можно указывать относительный путь.
    Без указания output файл с расширением type будет создан в текущем рабочем каталоге.
    В качестве имени нового файла используется имя исходного файла.
    Необязательный параметр. Указывается четвертым или по имени.
 
.Parameter stdout
    Включает или выключает вывод в консоль путей исходного и нового файла.
    По умолчанию параметр включен.
 
.Example
 
    SaveWDocAs "1.docx","2.docx" "txt" 2 ".\test" 
    SaveWDocAs "1.docx","2.docx" "txt" -format 2 -outpath ".\test" 
    SaveWDocAs -source 1.docx,2.docx "txt" -format 2 -outpath ".\test"
    "1.docx"|SaveWDocAs -type "pdf" -stdout:$false
    dir ".\test\*.docx"|SaveWDocAs -type "pdf"
    "1.docx"|SaveWDocAs -type "txt" -format 2 -outpath ".\test"
    "1.docx"|SaveWDocAs -type "pdf" -format wdFormatPDF -outpath ".\test"
    "1.docx"|SaveWDocAs -type "xml" -format wdFormatXML -outpath ".\test"
    "1.docx"|SaveWDocAs -type "html" -format wdFormatHTML -outpath ".\test"
   
.Notes 
    Author: Garry Galler
#>
 
[CmdletBinding()] 
Param (
[Parameter(Mandatory=$True,Position=1, ValueFromPipeline=$true)]
[string[]]$source,
[Parameter(Mandatory=$True,Position=2)][string]$type,
[Parameter(Position=3)][string]$format,
[Parameter(Position=4)][string]$outpath,
[switch]$stdout = $true
)  
   
   begin {
     
     Add-type -AssemblyName microsoft.office.interop.word 
     [type]$Wd = "Microsoft.Office.Interop.Word.WdSaveFormat"
     
     try {$oWord = new-object -ComObject Word.Application
         } catch {"Не удалось получить объект Word.Application";break}
     
     if ([string]::IsNullOrEmpty($format))  {$format = "wdFormat"+$type.ToUpper()}
     if ([string]::IsNullOrEmpty($outpath)) {$outpath = $pwd.path + '\'} 
     if (!(Test-Path $outpath))             {throw ("Путь $outpath не найден")}
     
     try{
       $res=$null
       if ([int32]::TryParse($format,[ref]$res)) {
            $saveFormat=$res}
        else {
            $saveFormat = [Enum]::Parse($Wd, $format);
        }
     } catch {"Не удалось получить формат $format для выходного файла";break}
     
   }
   
   process {
    
    foreach ($f in $source){ 
   
    if (!(Test-Path $f )) {"Файл $f не найден";continue}
   
    try{
        $file    = (resolve-path $f).Path
        $type    = $type.TrimStart(".")
        $name    = ($file  -split '\\')[-1]
        $name    = $name.Substring(0,$name.LastIndexOf("."))
        $pathnew = (resolve-path $outpath).Path + '\' + $name + "." + $type
 
    } catch {"Не удалось получить имя или путь для выходного файла";break}
    
    if ($stdout -eq $true) {$file + '=>' + $pathnew}
   
        $oWord.Visible = $false;
        $oDoc = $oWord.Documents.Open($file)
        $oDoc.SaveAs([ref]$pathnew,[ref]$saveFormat)
        $oDoc.Close()
     
       
     } #foreach 
   } #process 
      
   end { $oWord.Quit()}
 }
Список поддерживаемых форматов:
Кликните здесь для просмотра всего текста
Код
<#
wdFormatDocument - 0 - Формат Microsoft Office Word.
wdFormatDocument97 - 0 - Формат Microsoft Word 97 документа.
wdFormatTemplate - 1 - Формат шаблона Word.
wdFormatTemplate97 - 1 - Формат шаблона Word 97 .
wdFormatText - 2 - Microsoft Windows текстовый формат.
wdFormatTextLineBreaks - 3 - Windows текстовый формат с переводами строки.
wdFormatDOSText - 4 - Текстовый формат Microsoft DOS.
wdFormatDOSTextLineBreaks - 5 - Microsoft DOS текст с переводами строки.
wdFormatRTF - 6 - Текстовый формат RTF.
wdFormatEncodedText - 7 - Закодированный текстовый формат.
wdFormatUnicodeText - 7 - Текстовый формат Unicode.
wdFormatHTML - 8 - Стандартный формат HTML.
wdFormatWebArchive - 9 - формат веб-архива.
wdFormatFilteredHTML - 10 - формат Filtered HTML.
wdFormatXML - 11 - Расширяемый язык разметки XML.
wdFormatXMLDocument - 12 - Формат документа XML.
wdFormatXMLDocumentMacroEnabled - 13 - Формат документа XML с поддержкой макросов.
wdFormatXMLTemplate - 14 - формат шаблона XML.
wdFormatXMLTemplateMacroEnabled - 15 - формат шаблона XML с поддержкой макросов.
wdFormatDocumentDefault - 16 - Формат документа Word по умолчанию. Для Microsoft Office Word 2007, это формат DOCX.
wdFormatPDF - 17 - формат PDF.
wdFormatXPS - 18 - формат XPS.
#>
0
greg zakharov
27.10.2015, 13:06  [ТС]
  #3

Не по теме:

Garry Galler:

Код
PS E:\> man about_requires
РАЗДЕЛ
    about_Requires
...

ПОЛНОЕ ОПИСАНИЕ
    ...

    Инструкции #Requires можно использовать в любом скрипте. Их нельзя
    использовать в функциях, командлетах и оснастках.
+
Код
PS E:\> man about_Functions_Advanced_Parameters
...
    Атрибут проверки ValidateScript

        Атрибут ValidateScript задает скрипт, который используется
        для проверки аргумента параметра. Среда выполнения Windows
        PowerShell создает ошибку, если результатом выполнения
        скрипта является значение false или если скрипт создает
        исключение...

0
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
27.10.2015, 13:06  [ТС] 4
Get-HexDump.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
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
#requires -version 2
<#
  .SYNOPSIS
      Выводит в окно хоста хекс-дамп файла.
  .DESCRIPTION
      Функция представлена таким образом, чтобы получать лишь небольшие блоки
      данных в шестнадцатиричном представлении, поэтому лучше не пытаться ей
      передавать данные внушительных размеров.
  .PARAMETER FileName
      Имя передаваемого функции файла.
  .PARAMETER BytesToProcess
      Количество байт для обработки.
  .PARAMETER OffsetBytes
      Смещение (в байтах) от начала файла.
  .EXAMPLE
      PS E:\scripts> .\Get-HexDump.ps1 .\debug\app.exe -b 256
 
      Offset              00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  ASCII
      ------              -----------------------------------------------  -----
      00000000000000000:  4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00  MZ..........yy..
      00000000000000010:  b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  ?.......@.......
      00000000000000020:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      00000000000000030:  00 00 00 00 00 00 00 00 00 00 00 00 d8 00 00 00  ............O...
      00000000000000040:  0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68  ..?..?.I!?.LI!Th
      00000000000000050:  69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f  is.program.canno
      00000000000000060:  74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20  t.be.run.in.DOS.
      00000000000000070:  6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00  mode....$.......
      00000000000000080:  4b ac 1c d1 0f cd 72 82 0f cd 72 82 0f cd 72 82  Kв”ђ.N.Ir..Ir..Ir.
      00000000000000090:  cc c2 2f 82 0c cd 72 82 0f cd 73 82 5a cd 72 82  IA/..Ir..Is.ZIr.
      000000000000000A0:  28 0b 0f 82 1f cd 72 82 28 0b 1c 82 11 cd 72 82  (....Ir.(....Ir.
      000000000000000B0:  28 0b 1f 82 53 cd 72 82 28 0b 0a 82 0e cd 72 82  (...SIr.(....Ir.
      000000000000000C0:  52 69 63 68 0f cd 72 82 00 00 00 00 00 00 00 00  Rich.Ir.........
      000000000000000D0:  00 00 00 00 00 00 00 00 50 45 00 00 4c 01 03 00  ........PE..L...
      000000000000000E0:  c4 6d 2b 56 00 00 00 00 00 00 00 00 e0 00 03 01  Am+V........a...
      000000000000000F0:  0b 01 08 00 00 90 00 00 00 50 00 00 00 00 00 00  .........P......
  .EXAMPLE
      PS E:\scripts> .\Get-HexDump.ps1 .\debug\app.exe -b 120 -o 216
 
      Offset              00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  ASCII
      ------              -----------------------------------------------  -----
      000000000000000E0:  50 45 00 00 4c 01 03 00 c4 6d 2b 56 00 00 00 00  PE..L...Am+V....
      000000000000000F0:  00 00 00 00 e0 00 03 01 0b 01 08 00 00 90 00 00  ....a...........
      00000000000000100:  00 50 00 00 00 00 00 00 6c 17 00 00 00 10 00 00  .P......l.......
      00000000000000110:  00 a0 00 00 00 00 40 00 00 10 00 00 00 10 00 00  ......@.........
      00000000000000120:  04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00  ................
      00000000000000130:  00 f0 00 00 00 10 00 00 00 00 00 00 03 00 00 00  .?..............
      00000000000000140:  00 00 10 00 00 10 00 00 00 00 10 00 00 10 00 00  ................
      00000000000000150:  00 00 00 00 10 00 00 00                          ........
  .INPUTS
      System.String - FileName
      System.UInt16 - BytesToProcess
      System.UInt32 - OffsetBytes
  .OUTPUTS
      System.Array
  .LINK
      about_Modules
      Get-FormatData
      Update-FormatData
#>
param(
  [Parameter(Mandatory=$true, Position=0)]
  [ValidateScript({Test-Path $_})]
  [String]$FileName,
  
  [Parameter(Mandatory=$true, Position=1)]
  [Alias('b')]
  [ValidateScript({$_ -le [UInt16]::MaxValue})]
  [UInt16]$BytesToProcess,
  
  [Parameter(Position=2)]
  [Alias('o')]
  [UInt32]$OffsetBytes
)
 
begin {
$xml = @'
<?xml version="1.0" encoding="utf-8"?>
<Configuration>
   <ViewDefinitions>
      <View>
         <Name>Get-HexDump</Name>
         <ViewSelectedBy>
            <TypeName>HexDump</TypeName>
         </ViewSelectedBy>
         <TableControl>
            <AutoSize />
            <TableHeaders>
               <TableColumnHeader>
                  <Label>Offset</Label>
               </TableColumnHeader>
               <TableColumnHeader>
                  <Label>00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F</Label>
               </TableColumnHeader>
               <TableColumnHeader>
                  <Label>ASCII</Label>
               </TableColumnHeader>
            </TableHeaders>
            <TableRowEntries>
               <TableRowEntry>
                  <TableColumnItems>
                     <TableColumnItem>
                        <PropertyName>Address</PropertyName>
                     </TableColumnItem>
                     <TableColumnItem>
                        <PropertyName>HexDump</PropertyName>
                     </TableColumnItem>
                     <TableColumnItem>
                        <PropertyName>CharMap</PropertyName>
                     </TableColumnItem>
                  </TableColumnItems>
               </TableRowEntry>
            </TableRowEntries>
         </TableControl>
      </View>
   </ViewDefinitions>
</Configuration>
'@
 
  if ((Get-FormatData -TypeName HexDump) -eq $null) {
    Out-File ($$ = "$pwd\HexDump.ps1xml") -InputObject $xml -Encoding UTF8
    Update-FormatData -AppendPath $$
    Remove-Item $$ -Force
  }
  
  $FileName = Convert-Path $FileName
  
  function private:ConvertTo-Char([Byte]$byte) {
    if ([Char]::IsLetterOrDigit($byte) -or
        [Char]::IsPunctuation($byte) -or
        [Char]::IsSymbol($byte)) {
      [Char]$_
    }
    else { '.' }
  }
}
process {
  try {
    $fs = [IO.File]::OpenRead($FileName)
    # смещение не может быть больше размера файла
    if ($OffsetBytes -gt $fs.Length) {
      throw (New-Object IO.IOException("Out of file stream."))
    }
    else { [void]$fs.Seek($OffsetBytes, [IO.SeekOrigin]::Begin) }
    # читаем данные
    $buf = New-Object "Byte[]" $BytesToProcess
    [void]$fs.Read($buf, 0, $buf.Length)
    # табличное форматирование
    if (($BytesToProcess % 16) -eq 0) {
      [UInt32]$j = [Math]::Floor(($OffsetBytes / 16))
    }
    elseif (($fin = $BytesToProcess % 16) -gt 0) {
      [UInt32]$j = [Math]::Floor((($fin + $OffsetBytes) / 16))
    }
    # формируем табличные данные
    for ($i = 0; $i -lt $buf.Length; $i += 16) {
      $hex = $buf[$i..($i + 15)]
      $dmp = New-Object PSObject -Property @{
        Address = '{0:X16}0: ' -f $j
        HexDump = -join ($hex | % { $_.ToString('x2') + ' ' })
        CharMap = -join ($hex | % { ConvertTo-Char $_ })
      }
      $j++
      $dmp.PSObject.TypeNames.Insert(0, 'HexDump')
      $dmp
    }
  }
  catch { $_.Exception.Message }
  finally {
    if ($fs -ne $null) { $fs.Close() }
  }
}
end {}
0
Garry Galler
27.10.2015, 13:26
  #5

Не по теме:

greg zakharov,
#requires -version работает внутри функции, невзирая на справку. А про ValidateScript я в курсе (причем уже очень давно) - но использовать его или нет - личное дело каждого.

0
greg zakharov
27.10.2015, 13:34  [ТС]
  #6

Не по теме:

Garry Galler, дело не в том, что работает в функции, а дело в стандартизации и правилах раздела. Что до ValidateScript - упрощает в разы восприятие кода.

0
Garry Galler
27.10.2015, 14:03
  #7

Не по теме:

В моем случае ValidateScript можно применить только для параметра $path, однако когда я его применил, то скрипт почему-то не останавливался на неправильном параметре, а продолжал выполнение до следующей ошибки.
Так что - а нужно ли тогда?

0
Garry Galler
1436 / 1158 / 426
Регистрация: 28.10.2013
Сообщений: 2,937
28.10.2015, 23:40 8
Раскраска текста
Маленькая бесполезность, зато красивая
...Скорей набросок, показывающий идею, нежели что-то завершенное. Навеяло, так сказать...
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#requires -version 2
<#
.Synopsis
Раскраска каждого слова в тексте случайным цветом
.Notes 
    Author: Garry Galler
#>
 
param(
    [string]$textfile
  )
$c=0;cat $textfile|%{
    ($_ -split [char]32|%{
        write-host ($_+" ") -f ([ConsoleColor]$c++) -NoNewline;if ($c -gt 15){$c=0}});
            write-host "`r`n" -NoNewline}
Как это выглядит:
Полезные PowerShell скрипты
1
Garry Galler
29.10.2015, 11:03
  #9

Не по теме:

...строчку write-host "`r`n" -NoNewline можно было записать как write-host ""....

0
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
29.10.2015, 14:16  [ТС] 10
BatteryCharge.ps1
PowerShell
1
2
3
4
5
6
7
8
9
#requires -version 2
<#
  .SYNOPSIS
      Отображает заряд аккумулятора [ноу|нет]бука.
#>
Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.PowerStatus].GetConstructor(
  'NonPublic, Instance', $null, [Type[]]@(), $null
).Invoke($null)
0
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
30.10.2015, 16:20  [ТС] 11
Get-ExportFunction.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
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
function Get-ExportFunction {
  <#
    .SYNOPSIS
        Выводит список экспортируемых PE функций.
    .EXAMPLE
        PS C:\> Get-ExportFunction C:\WINDOWS\System32\ntdll.dll -Paging
    .LINK
        _https://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx_
    .NOTES
        PowerShell 2 и\или 4.
  #>
  param(
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
    [Alias('p')]
    [ValidateScript({Test-Path $_})]
    [String]$PathName,
    
    [Alias('pg')][Switch]$Paging
  )
  
  begin {
    if ([Array]($ta = [PSObject].Assembly.GetType(
      'System.Management.Automation.TypeAccelerators'
    ))::Get.Keys -notcontains 'marshal') {
      $ta::Add('marshal', [Runtime.InteropServices.Marshal])
    }
    
    function private:Find-ExportStruct($PathName) {
      <#
        .DESCRIPTION
            Функция, извлекающая структуру IMAGE_EXPORT_DIRECTORY без
            создания вспомогательной сборки в текущем домене приложений.
      #>
      try {
        $fs = [IO.File]::OpenRead($PathName)
        $br = New-Object IO.BinaryReader($fs)
        
        $e_magic = $br.ReadUInt16()
        $fs.Position = 0x3C
        $fs.Position = $br.ReadUInt16()
        $pe_sign = $br.ReadUInt32()
        
        if ($e_magic -ne 23117 -and $pe_sign -ne 17744) {
          throw "Unknown file format.`n"
        }
        
        # количество секций
        $fs.Position += 0x02
        $pe_sec = $br.ReadUInt16()
        # размер дополнительного (optional) заголовка
        $fs.Position += 0x0C
        $pe_ioh = $br.ReadUInt16()
        # x86 or x64
        $fs.Position += 0x02
        $buf = $fs.Position # начало вспомогательного заголовка
        switch ($br.ReadUInt16()) {
          0x10B {
            $fs.Position += 0x1A
            $img_base = $br.ReadUInt32()
          }
          0x20B {
            $fs.Position += 0x16
            $img_base = $br.ReadUInt64()
          }
          default { throw "Unknown machine type.`n" }
        }
        # проверяем, что директория экспорта существует
        $fs.Position = $buf + ($pe_ioh - 0x80)
        $rva_addr = $br.ReadUInt32()
        $rva_size = $br.ReadUInt32()
        
        if ($rva_addr -eq 0 -and $rva_size -eq 0) {
          throw "Does not contain exports.`n"
        }
        
        # IMAGE_EXPORT_DIRECTORY
        $fs.Position += 0x78
        0..($pe_sec - 1) | % {
          [void]$br.ReadUInt64()
          $vrt_size = $br.ReadUInt32() # VirtualSize
          $vrt_addr = $br.ReadUInt32() # VirtualAddress
          $fs.Position += 0x04
          $ptr_data = $br.ReadUInt32() # PointerToRawData
          
          if (($off = $rva_addr - $vrt_addr) -ge 0 -and $off -lt $vrt_size) {
            $ptr_strc = $ptr_data + $off
          }
          $fs.Position += 0x10
        }
        # read IMAGE_EXPORT_DIRECTORY
        $fs.Position = $ptr_strc
        New-Object PSObject -Property @{
            Characteristics    = $br.ReadUint32()
            TimeStampData      = $br.ReadUInt32()
            MajorVersion       = $br.ReadUInt16()
            MinorVersion       = $br.ReadUInt16()
            Name               = $br.ReadUInt32()
            Base               = $br.ReadUInt32()
            NumberOfFunctions  = $br.ReadUInt32()
            NumberOfNames      = $br.ReadUInt32()
            AddressOfFunctions = $br.ReadUInt32()
            AddressOfNames     = $br.ReadUInt32()
            AddressOfOrdinals  = $br.ReadUInt32()
        }
      }
      catch {
        $_.Exception
      }
      finally {
        if ($br -ne $null) { $br.Close() }
        if ($fs -ne $null) { $fs.Close() }
      }
    }
    
    $PathName = Convert-Path $PathName
    Add-Type -AssemblyName ($asm = "Microsoft.Build.Tasks$(if(
      $PSVersionTable.CLRversion.Major -eq 4
    ){'.v4.0'})")
  }
  process {
    if (($ied = Find-ExportStruct $PathName).Name -eq $null) {
      Write-Warning $ied.Message
      return
    }
    # необходимые функции
    ($type = ([AppDomain]::CurrentDomain.GetAssemblies() | ? {
      $_.ManifestModule.ScopeName.Equals("$asm.dll")
    }).GetType(
      "$($asm.Split('.')[0..2] -join '.').NativeMethods"
    )).GetMethods([Reflection.BindingFlags]40) |
    ? { $_.Name -cmatch '\A(Close|CreateFile|Image|Map|Unmap).*\Z' } |
    % { Set-Variable $_.Name $_}
    # необходимые поля
    $type.GetFields([Reflection.BindingFlags]40) |
    ? { $_.Name -cmatch 'READ' } |
    % { Set-Variable $_.Name $_.GetValue($null) }
    
    $buf = $(try {
      $itm_ptr = $CreateFile.Invoke($null, @(
          $PathName, $GENERIC_READ, [IO.FileShare]::Read, [IntPtr]::Zero,
          [IO.FileMode]::Open, [UInt32]0, [IntPtr]::Zero
      ))
      $img_ptr = $CreateFileMapping.Invoke($null, @(
          $itm_ptr, [IntPtr]::Zero, $PAGE_READONLY, [UInt32]0, [UInt32]0, $null
      ))
      $img_map = $MapViewOfFile.Invoke($null, @(
          $img_ptr, $FILE_MAP_READ, [Uint32]0, [UInt32]0, [IntPtr]::Zero
      ))
      $hdr_ptr = $ImageNtHeader.Invoke($null, @($img_map))
      $raw_ptr = $ImageRvaToVa.Invoke($null, @(
          $hdr_ptr, $img_map, $ied.AddressOfNames, [IntPtr]::Zero
      ))
      $exp_ptr = $ImageRvaToVa.Invoke($null, @(
          $hdr_ptr, $img_map, [UInt32][Marshal]::ReadInt32($raw_ptr), [IntPtr]::Zero
      ))
      0..($ied.NumberOfNames - 1) | % {
        $itm = [Marshal]::PtrToStringAnsi($exp_ptr)
        $exp_ptr = [IntPtr]($exp_ptr.ToInt64() + $itm.Length + 1)
        $itm
      }
    }
    catch { $_.Exception }
    finally {
      [void]$UnmapViewOfFile.Invoke($null, @($img_map))
      [void]$CloseHandle.Invoke($null, @($img_ptr))
      [void]$CloseHandle.Invoke($null, @($itm_ptr))
      [void]$ta::Remove('marshal')
    })
    
    switch ($Paging) {$true{$buf | more}$false{$buf}}
  }
  end {}
}
0
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
05.11.2015, 16:46  [ТС] 12
Get-VTReport.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
117
118
119
120
#requires -version 4
function Get-VTReport {
  <#
    .SYNOPSIS
        Проверяет файл, url, ip или домен по базам данных сервиса VirusTotal.
    .DESCRIPTION
        Проверка ведется относительно публичного ключа Sysinternals, в
        связи с чем каких-либо гарантий использования данной функции
        нет, - используйте ее на свой страх и риск.
    .EXAMPLE
        PS C:\> $res = Get-VTReport .\debug\app.exe
        PS C:\> $res.scans
        
        Bkav                 : @{detected=False; version=1.3.0.7383; result=; update=20151104}
        MicroWorld-eScan     : @{detected=False; version=12.0.250.0; result=; update=20151104}
        nProtect             : @{detected=False; version=2015-11-04.01; result=; update=20151104}
        CMC                  : @{detected=False; version=1.1.0.977; result=; update=20151102}
        CAT-QuickHeal        : @{detected=False; version=14.00; result=; update=20151103}
        ALYac                : @{detected=False; version=1.0.1.4; result=; update=20151104}
        Malwarebytes         : @{detected=False; version=2.1.1.1115; result=; update=20151104}
        ...
    .EXAMPLE
        PS C:\> $res = Get-VTReport -Url ya.ru
        PS C:\> -join ($res | select positives, total)
        @{positives=0; total=66}
        PS C:\>
    .EXAMPLE
        PS C:\> Get-VTReport -Hash e9eacbb7ab4b3f66019e0a2f13a1dba9
        ...
    .LINK
        _https://www.virustotal.com/ru/documentation/public-api/
  #>
  [CmdletBinding(DefaultParameterSetName='File')]
  param(
    [Parameter(ParameterSetName='File', Mandatory=$true, Position=0)]
    [Alias('f')]
    [ValidateScript({Test-Path $_})]
    [String]$FileName,
    
    [Parameter(ParameterSetName='Url', Mandatory=$true, Position=0)]
    [Alias('u')]
    [ValidateNotNullOrEmpty()]
    [String]$Url,
    
    [Parameter(ParameterSetName='IP', Mandatory=$true, Position=0)]
    [Alias('i')]
    [ValidateNotNullOrEmpty()]
    [String]$IP,
    
    [Parameter(ParameterSetName='Domain', Mandatory=$true, Position=0)]
    [Alias('d')]
    [ValidateNotNullOrEmpty()]
    [String]$Domain,
    
    [Parameter(ParameterSetName='Hash', Mandatory=$true, Position=0)]
    [Alias('h')]
    [ValidateNotNullOrEmpty()]
    [String]$Hash
  )
  
  begin {
    if (![Net.NetworkInformation.NetworkInterface]::GetIsNetworkAvailable()) {
      Write-Warning "network is lost."
      break
    }
    
    $par = @{
      Uri = 'https://live.sysinternals.com/sigcheck.exe'
      UseBasicParsing = $true
      UserAgent = 'Wget/1.16.3 (linux-gnu)'
    }
    
    if (!(Test-Path variable:vtkey)) {
      ([Regex]'[\x20-\x7E]{64,}').Matches(
        [Text.Encoding]::UTF7.GetString((wget @par).Content)
      ).ForEach({
        if ($_ -match '\A(\d|[a-z]){64}\Z') {
          Set-Variable vtkey $_.Value -Scope Global -Option ReadOnly
        }
      })
    }
    
    $par.Remove('UseBasicParsing')
    $par['Uri'] = 'https://www.virustotal.com/vtapi/v2/%s/report'
    $par['DisableKeepAlive'] = $true
    $par['Method'] = 'POST'
    $par['Body'] = @{apikey = $vtkey}
  }
  process {
    switch ($PSCmdlet.ParameterSetName) {
      'File'   {
        $par['Uri'] = $par['Uri'] -replace '%s', 'file'
        $par['Body'].resource = (Get-FileHash (Convert-Path $FileName)).Hash
      }
      'Url'    {
        $par['Uri'] = $par['Uri'] -replace '%s', 'url'
        $par['Body'].resource = $Url
      }
      'IP'     {
        $par['Method'] = 'GET'
        $par['Uri'] = $par['Uri'] -replace '%s', 'ip-address'
        $par['Body'].Remove('resource')
        $par['Body'].ip = $IP
      }
      'Domain' {
        $par['Method'] = 'GET'
        $par['Uri'] = $par['Uri'] -replace '%s', 'domain'
        $par['Body'].Remove('resource')
        $par['Body'].domain = $Domain
      }
      'Hash'   {
        $par['Uri'] = $par['Uri'] -replace '%s', 'file'
        $par['Body'].resource = $Hash
      }
    } #swicth
  }
  end {
    Invoke-RestMethod @par
  }
}
Проверка наличия прав администратора для текущего пользователя
PowerShell
1
2
3
4
5
6
7
8
#requires -version 2
@{
  ($$ = [Security.Principal.WindowsIdentity]::GetCurrent()).Name = (
    (New-Object Security.Principal.WindowsPrincipal($$)).IsInRole(
      [Security.Principal.WindowsBuiltInRole]::Administrator
    )
  )
}
2
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
16.11.2015, 16:03  [ТС] 13
Get-ComPath.ps1
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#requires -version 2
function Get-ComPath {
  <#
    .SYNOPSIS
        Определяет физическое местоположения COM-модуля.
    .EXAMPLE
        PS C:\> Get-ComPath Scripting.FileSystemObject
        C:\Windows\System32\scrrun.dll
  #>
  param(
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [String]$PathName
  )
  
  (Get-ItemProperty -ea 0 "HKLM:\SOFTWARE\Classes\CLSID\{$(
    [Type]::GetTypeFromProgID($PathName).GUID
  )}\InProcServer32").'(default)'
}
Список локальных профилей
PowerShell
1
2
3
4
5
#requires -version 2
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*' |
Sort-Object PSChildName | Select-Object @{N='Sid';E={$_.PSChildName}},@{
  N='User';E={Split-Path -Leaf $_.ProfileImagePath}
},@{N='Path';E={$_.ProfileImagePath}} | Format-Table -Auto
1
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
26.11.2015, 09:44  [ТС] 14
Convert-Sid2Name.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
#requires -version 2
function Convert-Sid2Name {
  <#
    .SYNOPSIS
        Конвертирует имя пользователя в SID и наоборот.
    .EXAMPLE
        PS C:\> Convert-Sid2Name 'NT AUTHORITY\LOCAL SERVICE'
        S-1-5-19
    .EXAMPLE
        PS C:\> Convert-Sid2Name s-1-5-18
        NT AUTHORITY\SYSTEM
  #>
  param(
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
    [ValidateNotNullOrEmpty()]
    [String]$SidOrName
  )
  
  begin {
    $nt, $si = "$($$ = 'Security.Principal.')$$NTAccount", "$($$)SecurityIdentifier"
  }
  process {
    $ErrorActionPreference = 0
    if (($$ = $(try {
      (New-Object $nt($SidOrName)).Translate([Type]$si)
    }
    catch { 
      (New-Object $si($SidOrName)).Translate([Type]$nt)
    }).Value) -ne $null) {$$}
    else {Write-Warning 'specified data is wrong.'}
  }
  end {}
}
0
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
02.12.2015, 14:56  [ТС] 15
Get-ZipContent.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
#requires -version 4
function Get-ZipContent {
  <#
    .SYNOPSIS
        Выводит содержимое ZIP архива в окно хоста.
    .DESCRIPTION
        Функция не использует COM Shell.Application.
    .EXAMPLE
        PS E:\downloads> Get-ZipContent SysinternalsSuite.zip | Format-Table -a
 
        Crc32      Attributes Modified            Method    Path                 Packed    Size
        -----      ---------- --------            ------    ----                 ------    ----
        0x0A1AC525          0 01.11.2006 14:06:36 {Deflate} AccessEnum.exe        48346  174968
        0x5A4797E5          0 12.07.2007 6:26:48  {Deflate} AdExplorer.chm        42823   50379
        0xAFDD017F          0 14.11.2012 11:22:40 {Deflate} ADExplorer.exe       203304  479832
        ...
  #>
  param(
    [Parameter(Mandatory=$true)]
    [ValidateScript({Test-Path $_})]
    [String]$PathName
  )
  
  begin {
    $PathName = Convert-Path $Pathname
    $Methods  = @{
      Store   = 0
      Deflate = 8
      BZIP2   = 12
      LZMA    = 14
    }
  }
  process {
    try {
      $fs = [IO.File]::OpenRead($PathName)
      $br = New-Object IO.BinaryReader($fs)
      # ищем начало структур central directory
      $fs.Position = $fs.Length - 22
      $fs.Position += 16
      $fs.Position = $br.ReadUInt32()
      # читаем структуры
      while ($true) {
        if ($br.ReadUInt32() -ne 33639248) {break}
        $fs.Position += 6 # игнорируем следующие три поля
        # метод сжатия и время модификации
        $a, $b, $c = $br.ReadUInt16(), $br.ReadUInt16(), $br.ReadUInt16()
        # crc32 и размеры файла
        $d, $e, $f = $br.ReadUInt32(), $br.ReadUInt32(), $br.ReadUInt32()
        $g = $br.ReadUInt16() # длина имени файла
        $h = $br.ReadUInt16() # длина дополнительного поля
        $i = $br.ReadUInt16() # длина комментария
        $fs.Position += 4     # пропускаем следующие два поля
        $j = $br.ReadUInt32() # атрибуты файла
        $fs.Position += 4     # пропускаем поле
        New-Object PSObject -Property @{
          Path = -join $br.ReadChars($g)
          Attributes = [IO.FileAttributes]$j
          Crc32 = "0x$($d.ToString('X8'))"
          Modified = New-Object DateTime(
            (($c -shr 9) + 1980), (($c -shr 5) -band 0xf), ($c -band 0x1f),
            ($b -shr 11), (($b -shr 5) -band 0x3f), (($b -band 0x1f) * 2)
          )
          Size = $f
          Packed = $e
          Method = $Methods.Keys.Where({$Methods.Item($_) -eq $a})
        }
        $fs.Position += $h + $i
      }
    }
    catch {
      $_.Exception.InnerException
    }
    finally {
      if ($br -ne $bull) {$br.Close()}
      if ($fs -ne $null) {$fs.Close()}
    }
  }
  end {}
}
0
greg zakharov
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
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
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
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
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
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
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
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
Покинул форум
1958 / 830 / 240
Регистрация: 07.05.2015
Сообщений: 1,666
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
01.01.2016, 21:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.01.2016, 21:21

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

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

Powershell и 'globbing'
Можно ли с помощью каких либо опций заставить powershell для Windows вести...


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

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

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