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

PowerShell

Войти
Регистрация
Восстановить пароль
 
 
greg zakharov
1434 / 697 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 39
#1

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

26.10.2015, 09:45. Просмотров 16796. Ответов 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
Garry Galler
917 / 690 / 198
Регистрация: 28.10.2013
Сообщений: 1,728
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
1434 / 697 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 39
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
917 / 690 / 198
Регистрация: 28.10.2013
Сообщений: 1,728
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
1434 / 697 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 39
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
1434 / 697 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 39
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
1434 / 697 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 39
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
1434 / 697 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 39
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
1434 / 697 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 39
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
1434 / 697 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 39
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
02.12.2015, 14:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2015, 14:56
Привет! Вот еще темы с ответами:

Кратко о 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: Вывод всех событий за последние пол часа из...


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

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

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