<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Vadims Podans's blog - PowerShell</title>
    <link>http://www.sysadmins.lv/</link>
    <description>PowerShell powered</description>
    <image>
      <url>http://www.sysadmins.lv/images/imgusr/bilde.jpg</url>
      <title>Vadims Podans's blog - PowerShell</title>
      <link>http://www.sysadmins.lv/</link>
    </image>
    <language>en-us</language>
    <copyright>Vadims Podāns</copyright>
    <lastBuildDate>Sat, 03 Jul 2010 19:48:17 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>vpodans@sysadmins.lv</managingEditor>
    <webMaster>vpodans@sysadmins.lv</webMaster>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=2c2eef6f-34ae-42cb-8ded-318e96f63f8c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,2c2eef6f-34ae-42cb-8ded-318e96f63f8c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,2c2eef6f-34ae-42cb-8ded-318e96f63f8c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=2c2eef6f-34ae-42cb-8ded-318e96f63f8c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Программная обработка запросов сертификатов в папке Pending Requests</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,2c2eef6f-34ae-42cb-8ded-318e96f63f8c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,2c2eef6f-34ae-42cb-8ded-318e96f63f8c.aspx</link>
      <pubDate>Sat, 03 Jul 2010 19:48:17 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Как известно, когда запрос попадает в папку Pending Requests, администратор CA должен что-то с ним явно сделать — или одобрить или отклонить. Это можно сделать при помощи оснастки CetSrv.msc или при помощи PowerShell. Ещё можно через certutil, но речь сегодня не о нём. Если вспомнить предыдущие посты посвящённые &lt;a href="http://www.sysadmins.lv/CategoryView,category,PowerShellCryptoAPI.aspx"&gt;CryptoAPI и PowerShell&lt;/a&gt;, можно вспомнить какие-то основные принципы. Как обычно, мы будем использовать интерфейс &lt;a href="http://msdn.microsoft.com/en-us/library/aa383234(VS.85).aspx" target="_blank"&gt;ICertAdmin2&lt;/a&gt;. Для аппрува соответствующих запросов необходимо воспользоваться методом &lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa383250(VS.85).aspx" target="_blank"&gt;ResubmitRequest()&lt;/a&gt;. Как вы видите, метод принимает 2 аргумента:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code&gt;HRESULT ResubmitRequest(        &lt;br /&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/code&gt;&lt;code&gt;&lt;strong&gt;[in] const BSTR strConfig,          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/code&gt;&lt;code&gt;&lt;strong&gt;[in] LONG RequestId,          &lt;br /&gt;&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160; [out, retval] LONG *pDisposition         &lt;br /&gt;);&lt;/code&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;это конфигурационная строка CA вида: CAComputerName\CAName и номер запроса. И в ответ метод возвращает результат выполнения операции. Вот как это можно аккуратно сделать в PowerShell:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Issue-PendingRequest&lt;/span&gt;&lt;span style="color: #000000"&gt; {
[CmdletBinding()]
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt;(
        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;, ValueFomPipeline &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;)]
        [&lt;font color="#008080"&gt;string&lt;/font&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$CAConfig&lt;/span&gt;&lt;span style="color: #000000"&gt;,
        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;)]
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$RequestID&lt;/span&gt;&lt;span style="color: #000000"&gt;
    )
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$CertAdmin&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;CertificateAuthority.Admin&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Unable to instantiate ICertAdmin2 object!&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$status&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$CertAdmin&lt;/span&gt;&lt;span style="color: #000000"&gt;.ResubmitRequest(&lt;/span&gt;&lt;span style="color: #800080"&gt;$CAConfig&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$RequestID&lt;/span&gt;&lt;span style="color: #000000"&gt;)) {
            &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The request was not completed.&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The request failed.&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The request was denied&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #000000"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The certificate was issued.&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #000000"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The certificate was issued separately.&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #000000"&gt;5&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The request was taken under submission.&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #000000"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The certificate is revoked.&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
        }
    }
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Operation status for the request '$RequestID': $ststus&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Для отклонения запроса, следует воспользоваться методом &lt;a href="http://msdn.microsoft.com/en-us/library/aa383236(VS.85).aspx" target="_blank"&gt;DenyRequest()&lt;/a&gt;. Как и метод ResubmitRequest тоже принимает всего 2 аргумента, но кроме ошибок ничего не возвращает:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;code&gt;HRESULT DenyRequest( 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [in] const BSTR strConfig, 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [in] Long RequestId 

      &lt;br /&gt;);&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;И код будет очень похож на предыдущий:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Deny-PendingRequest&lt;/span&gt;&lt;span style="color: #000000"&gt; {
[CmdletBinding()]
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt;(
        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;, ValueFomPipeline &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;)]
        [&lt;font color="#008080"&gt;string&lt;/font&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$CAConfig&lt;/span&gt;&lt;span style="color: #000000"&gt;,
        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;)]
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$RequestID&lt;/span&gt;&lt;span style="color: #000000"&gt;
    )
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$CertAdmin&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;CertificateAuthority.Admin&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Unable to instantiate ICertAdmin2 object!&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$CertAdmin&lt;/span&gt;&lt;span style="color: #000000"&gt;.DenyRequest(&lt;/span&gt;&lt;span style="color: #800080"&gt;$CAConfig&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$RequestID&lt;/span&gt;&lt;span style="color: #000000"&gt;)}
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Successfully denied request '$RequestID'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;вот так легко можно программным способом управлять реквестами из папки Pending Requests без графических оснасток или certutil. Что касается certutil, я не уверен, что он сможет заапрувить или отклонить реквест на удалённом CA. У него есть параметр –config, но я не уверен, что он работает в данном случае. Плюс, когда я выложу в общий доступ свой PS модуль для PKI, эта операция будет ещё проще. Вам не придётся вручную набивать конфигурационную строку, а просто воспользоваться командой Get-CertificationAuthority.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=2c2eef6f-34ae-42cb-8ded-318e96f63f8c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,2c2eef6f-34ae-42cb-8ded-318e96f63f8c.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
      <category>PowerShell / CryptoAPI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=0a49a18f-289c-49e5-b7ff-c991a7e3139a</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,0a49a18f-289c-49e5-b7ff-c991a7e3139a.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,0a49a18f-289c-49e5-b7ff-c991a7e3139a.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=0a49a18f-289c-49e5-b7ff-c991a7e3139a</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Преобразование десятичного числа в IP адрес</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,0a49a18f-289c-49e5-b7ff-c991a7e3139a.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,0a49a18f-289c-49e5-b7ff-c991a7e3139a.aspx</link>
      <pubDate>Sun, 30 May 2010 10:52:39 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Недавно в мессенджер упал интересный вопрос:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#804000"&gt;в Active Directory у пользователя есть атрибут msRADIUSFramedIPAddress в котором храниться статический IP адрес, который назначается на вкладке Dual In в свойствах пользователя. Если смотреть через LDAP то значение мало похоже на введённый IP адрес. Хотелось бы на выходе получить работающий скрипт пишущий в файл соответсвие пользователь - IP адрес. Как я понял проблему, идёт двойная конвертация.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Действительно, если смотреть на это свойство через провайдер ADSI (не путать с adsiedit.msc), мы увидим число мало похожее на IP адрес. Например, 168846386. Для приведения данного числа в формат IP адреса нужно преобразовать его в двоичный формат, а после — разбить на октеты по 8 бит и каждый октет преобразовать обратно в десятичную форму. В .NET есть целый класс конверторов &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert(VS.90).aspx" target="_blank"&gt;System.Convert&lt;/a&gt;, который позволяет конвертировать между собой множество форматов. Мы воспользуемся вот таким методом: &lt;a href="http://msdn.microsoft.com/en-us/library/14kwkz77(VS.90).aspx" target="_blank"&gt;Convert::ToString Method (Int32, Int32)&lt;/a&gt;, в котором первый аргумент отвечает за исходное число, а второй — выходной формат. Поскольку нам нужно получить двоичное представение, указываем формат 2:&lt;/p&gt;  &lt;div style="width: 935px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [convert]::ToString(168846386,2)
1010000100000110010000110010&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Строка содержит неполные 32 бита. Чтобы их дополнить мы должны добавить слева недостающие нули:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $bin = [convert]::ToString(168846386,2)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $bin
1010000100000110010000110010
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $bin.length
28
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $fullBin = &amp;quot;0&amp;quot; * (32 - $bin.length) + $bin
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $fullbin
00001010000100000110010000110010&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Мы знаем, что 4 октета это 32 бита, следовательно вычитаем из 32 длину актуальной строки и получаем количество добавочных нулей. И эти нули добавляем в начало строки. Теперь эту строку надо разбить на 4 октета по 8 бит или по 1 байту:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] 0,8,16,24 | %{$fullbin.substring($_,8)}
00001010
00010000
01100100
00110010&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Я воспользовался методом &lt;a href="http://msdn.microsoft.com/en-us/library/aka44szs.aspx" target="_blank"&gt;String::Substring Method (Int32, Int32)&lt;/a&gt;. Первый аргумент указывает стартовый символ, откуда начинать вырезать, а второй аргумент указывает количество символов, которые нужно вырезать. Вот и получили 4 байта. Преобразовать обратно в десятичный формат их так же просто, но с использованием &lt;a href="http://msdn.microsoft.com/en-us/library/1k20k614(VS.90).aspx" target="_blank"&gt;Convert::ToInt32 Method (String, Int32)&lt;/a&gt;:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] 0,8,16,24 | %{[convert]::ToInt32($fullbin.Substring($_,8),2)}
10
16
100
50&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Теперь это осталось собрать в строку и расставить точки между октетами. Для этого мы вопспользуемся статическим методом &lt;a href="http://msdn.microsoft.com/en-us/library/57a79xd0.aspx" target="_blank"&gt;Join()&lt;/a&gt; класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.string.aspx" target="_blank"&gt;System.String&lt;/a&gt;:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;[↓] [vPodans] [string]::Join(&amp;quot;.&amp;quot;,$(0,8,16,24 | %{[convert]::ToInt32($fullbin.substring($_,8),2)}))
10.16.100.50&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;вот мы и получили наш заветный IP-адрес. И вот весь код:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$bin&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;Convert&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ToString&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;168846386&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$fullBin&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;0&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000000"&gt;32&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$bin&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Length&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$bin&lt;/span&gt;&lt;span style="color: #000000"&gt;
[&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Join&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;.&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, $(&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;24&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;Convert&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ToInt32&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$fullBin&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Substring&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;),&lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;)}))&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Надеюсь, поможет ещё кому-нибудь &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=0a49a18f-289c-49e5-b7ff-c991a7e3139a"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,0a49a18f-289c-49e5-b7ff-c991a7e3139a.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=5967dedb-b4c9-404e-8794-07160cabec9e</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,5967dedb-b4c9-404e-8794-07160cabec9e.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,5967dedb-b4c9-404e-8794-07160cabec9e.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=5967dedb-b4c9-404e-8794-07160cabec9e</wfw:commentRss>
      <title>Best Practices Analyzer (BPA) и PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,5967dedb-b4c9-404e-8794-07160cabec9e.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,5967dedb-b4c9-404e-8794-07160cabec9e.aspx</link>
      <pubDate>Mon, 03 May 2010 14:48:04 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Что делать, что делать, одна продажная роботиха за 300 долларов или 300 продажных роботих по доллару?&lt;/p&gt;  &lt;p&gt;Да, вот такой непростой выбор. А точнее чему отдать преимущество: этому BPA или PowerShell'у? Как известно, Best Practices Analyzer (BPA) в Windows Server 2008 R2 основан на скриптах PowerShell. Я не знаю, как оно там внутри происходит, но есть мнение, что как-то оно происходит. С этой проблемой сталкиваются все те, кто управляет политикой исполнения (ExecutionPolicy) через групповые политики. И вот как это выглядит, если в групповой политике задано значение AllSigned или RemoteSigned и вы пытаетесь просканировать какую-то роль:&lt;/p&gt; &lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://www.sysadmins.lv/content/binary/windowslivewriter/SM/smerror.jpg" /&gt;   &lt;p&gt;Т.е. как я понимаю, этот BPA тянет скрипты с серверов Microsoft'а, либо одно из двух. При этом, он запускает консоль с изменением текущей политики исполнения. Однако тут есть одна хитрость. Если вы не управляете политикой исполнения скриптов из политик, а вручную набираете команду:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Set-ExecutionPolicy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;RemoteSigned&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;то BPA ВНЕЗАПНО начинает работать. Т.е. по сути всё равно RemoteSigned будь то вручную, будь то через политику, будут иметь одинаковый эффект. Но в первом случае BPA работает, во втором — нет. Единственная разница здесь в том, что если политика исполнения скриптов задана командлетом Set-ExecutionPolicy (не через групповые политики) её можно спокойно переопределить для конкретного сеанса. Вот как это делается (только PowerShell V2):&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; Get-ExecutionPolicy
AllSigned
PS C:\&amp;gt; powershell -executionpolicy remotesigned
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\&amp;gt; Get-ExecutionPolicy
RemoteSigned
PS C:\&amp;gt;
PS C:\&amp;gt; Exit
PS C:\&amp;gt; Get-ExecutionPolicy
AllSigned&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Запустили пошик с нужным ключиком и для текущей сессии получили нужную политику исполнения. Вышли из сессии и снова вернулись в AllSigned. Если же политика исполнения управляется через групповые политики, то такой финт ушами уже не пройдёт:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; Get-ExecutionPolicy
AllSigned
PS C:\&amp;gt; powershell -executionpolicy remotesigned
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\&amp;gt; Get-ExecutionPolicy
AllSigned
PS C:\&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Как AllSigned был, так и остался.&lt;/p&gt;

&lt;p&gt;Собственно и вопрос: как сделать так, чтобы работал BPA и политика исполнения скриптов назначалась через групповые политики?&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=5967dedb-b4c9-404e-8794-07160cabec9e"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,5967dedb-b4c9-404e-8794-07160cabec9e.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=e4b733ed-3f9f-46a4-8698-819263b36f65</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,e4b733ed-3f9f-46a4-8698-819263b36f65.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,e4b733ed-3f9f-46a4-8698-819263b36f65.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=e4b733ed-3f9f-46a4-8698-819263b36f65</wfw:commentRss>
      <title>Осторожно, баг!</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,e4b733ed-3f9f-46a4-8698-819263b36f65.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,e4b733ed-3f9f-46a4-8698-819263b36f65.aspx</link>
      <pubDate>Sat, 01 May 2010 22:46:05 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;MSDN и Microsoft меня однажды доканает и я уйду проповедовать &lt;strike&gt;православный&lt;/strike&gt;богомерзкий линукс.&lt;/p&gt;  &lt;p&gt;А дело в том, что одна моя задумка с треском проваливалась из-за непонятного и тупого бага в интерфейсе &lt;a href="http://msdn.microsoft.com/en-us/library/aa383295(VS.85).aspx" target="_blank"&gt;ICertEncodeAltName&lt;/a&gt;. Это CryptoAPI интерфейс, который позволяет кодировать строковые значения для расширения Subject Alternative Name в ASN.1 DER encoded строку. На возню с ним я потратил почти неделю (чуть меньше, наверное) и только сегодня я смог найти все ответы. Хотя я это должен был сделать много раньше, но дико тупил на ровном месте. Итак, давайте посмотрим, что из себя представляет этот баг.&lt;/p&gt;  &lt;p&gt;Для начала я покажу как собирается этот интерфейс:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #800080"&gt;$san&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;CertificateAuthority.EncodeAltName&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Далее, его надо инициализировать методом &lt;a href="http://msdn.microsoft.com/en-us/library/aa383627(VS.85).aspx" target="_blank"&gt;Reset()&lt;/a&gt; и в качестве аргумента метода указать размер объекта. Т.е. количество элементов, которые должны содержаться в расширении Subject Alternative Name. Если только один элемент, то и указываете число 1:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$san&lt;/span&gt;&lt;span style="color: #000000"&gt;.Reset(&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и теперь можно в него заряжать данные методом &lt;a href="http://msdn.microsoft.com/en-us/library/aa383657(VS.85).aspx" target="_blank"&gt;SetNameEntry()&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$san&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetNameEntry(&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0x3&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Custom-Name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Где 0 — индекс массива, в который надо записать строку, 0x3 — тип строки. В данном случае это DNS и последний аргумент указывает само значение строки. Полный список типов можно получить вот здесь: &lt;a title="http://msdn.microsoft.com/en-us/library/aa374981(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa374981(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa374981(VS.85).aspx&lt;/a&gt;. Только учтите, что реально типы начинаются не с нуля (как по ссылке), а с единицы. т.е. 0x3 в нашем случае это DNS (2+1).&lt;/p&gt;

&lt;p&gt;После того как мы загнали туда данные, их можно кодировать:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$san&lt;/span&gt;&lt;span style="color: #000000"&gt;.Encode()&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И давайте посмотрим, что у нас получилось:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $san = New-Object -ComObject CertificateAuthority.EncodeAltName
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $san.Reset(1)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $san.SetNameEntry(0,0x3,&amp;quot;Custom-Name&amp;quot;)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $str = $san.Encode()
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $str
???????&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;выглядит прикольно. Но на самом деле это строка из символов, которые описаны не одним, а двумя байтами:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $str.ToCharArray() | %{[int][char]$_}
3376
2946
30019
29811
28015
20013
28001&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Чтобы убедиться, что в каждом символе по 2 байта, мы преобразуем эти числа в их шестнадцатиричное (hex) представление:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $str.ToCharArray() | %{&amp;quot;{0:X4}&amp;quot; -f [int][char]$_}
0D30
0B82
7543
7473
6D6F
4E2D
6D61&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;видите, в каждом символе по 2 байта и все они записаны в little-endian последовательности. Т.е. первый байт находится справа, а не слева, как обычно. Давайте соберём эти байты в последовательную строку, переставив байты местами в каждой строке:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;30 0D 82 0B 43 75 73 74 6F 6D 2D 4E 61 6D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;И что же означают эти циферки-букавки? А означают они следующее:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;30 (48) — тип кодировки. 30 или 48 (в десятичном представлении) означает Constructed encoding. &lt;/li&gt;

  &lt;li&gt;0D (13) — длину строки начиная со следующего байта. Остаточная длина должна быть 13 байт. Но моя математика говорит, что дальше не 13, а только 12 байт. &lt;/li&gt;

  &lt;li&gt;82 (130) — тип закодированной строки. 130 означает DNS. 80 (128) — OtherName, 81 (129) — RFC822Name и т.д. &lt;/li&gt;

  &lt;li&gt;0B (11) — размер строки начиная со следующего байта. Остаточная длина должна быть 11 байт. Но моя математика говорит, что их там не 11, а только 10 байт. &lt;/li&gt;

  &lt;li&gt;Остальные байты — сама строка, только в hex'е. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Куда-то пропал один очень важный байт, из-за чего сервер CA начинал доставлять шлакоблоки при виде такой строки. В принципе, мы можем посмотреть, что у нас потерялось по дороге:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $str1 = &amp;quot;43 75 73 74 6F 6D 2D 4E 61 6D&amp;quot;.split(&amp;quot; &amp;quot;)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $str1 | %{$a += invoke-expression [char]0x$_}
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $a
Custom-Nam&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Последний символ куда-то провалился. Нет его больше. Т.е. размер вычислен правильно, просто не хватает одного байта. Причём, если попробовать что-то другое, попроще, интерфейс возвращает правильный размер и все байты. Я не знаю точно, в каких условиях этот баг проявляется, но уже очевидно, что если в строке присутствует дефис, уже начинается бяка.&lt;/p&gt;

&lt;p&gt;Что можно сделать? Вариантов куча. Как вы видите ASN.1 DER кодировка достаточно простая, её можно сделать самому. Либо использовать православные интерфейсы CertEnroll — &lt;a href="http://msdn.microsoft.com/en-us/library/aa378081(VS.85).aspx" target="_blank"&gt;IX509ExtensionAlternativeNames&lt;/a&gt;. На первый взгляд там багов не обнаружено &lt;img alt=":)" src="/smilies/happy.gif"&gt;. Примеры использования данных интерфейсов можно посмотреть (а заодно и почитать) в моём буржуйском бложике: &lt;a title="How to add FQDN to HP iLO request" href="http://en-us.sysadmins.lv/Lists/Posts/Post.aspx?ID=11"&gt;How to add FQDN to HP iLO request&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;На сегодня всё. Спокночи.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=e4b733ed-3f9f-46a4-8698-819263b36f65"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,e4b733ed-3f9f-46a4-8698-819263b36f65.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / CryptoAPI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=5da8eabd-6b36-407d-889f-966ed3c1450c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,5da8eabd-6b36-407d-889f-966ed3c1450c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,5da8eabd-6b36-407d-889f-966ed3c1450c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=5da8eabd-6b36-407d-889f-966ed3c1450c</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>Делаем скриншоты средствами PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,5da8eabd-6b36-407d-889f-966ed3c1450c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,5da8eabd-6b36-407d-889f-966ed3c1450c.aspx</link>
      <pubDate>Thu, 22 Apr 2010 20:43:41 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Сегодня пришло письмо, где человек спрашивал о том, можно ли сделать скриншот средствами PowerShell. Я вообще не очень понял зачем это, но это уже не моё дело. Если я пишу этот пост, значит можно &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/P&gt;
&lt;P&gt;Для этого существует класс &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" target=_blank&gt;Drawing.Graphics&lt;/A&gt; у которого есть замечательный метод &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.copyfromscreen.aspx" target=_blank&gt;CopyFromScreen()&lt;/A&gt;. Данный метод принимает в качестве аргументов различные параметры, которые определяют координаты области, которую нужно сфоткать. В принципе можно забивать фиксированные значения (см. конструкторы с Int, как этот — &lt;A href="http://msdn.microsoft.com/en-us/library/fw1kt6f9.aspx" target=_blank&gt;CopyFromScreen(Int32, Int32, Int32, Int32, Size)&lt;/A&gt;), а можно эти размеры выставлять динамически, в зависимости от размеров экрана. Для этого лучше воспользоваться самым первым методом: &lt;A href="http://msdn.microsoft.com/en-us/library/6yfzc507.aspx" target=_blank&gt;CopyFromScreen(Point, Point, Size)&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Как получить размеры экрана? Очень просто, достаточно воспользоваться статическим&amp;nbsp;свойством &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.forms.systeminformation.virtualscreen.aspx" target=_blank&gt;VirtualScreen&lt;/A&gt; класса &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.forms.systeminformation.aspx" target=_blank&gt;Windows.Forms.SystemInformation&lt;/A&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Windows.Forms.SystemInformation&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;VirtualScreen&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] [Windows.Forms.SystemInformation]::VirtualScreen


Location : {X=0,Y=0}
Size     : {Width=1280, Height=800}
X        : 0
Y        : 0
Width    : 1280
Height   : 800
Left     : 0
Top      : 0
Right    : 1280
Bottom   : 800
IsEmpty  : False



&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Вот размеры экрана на моём нотебуке. Готично. Теперь нужно создать объект &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" target=_blank&gt;Drawing.Graphics&lt;/A&gt;. Однако, этот объект нельзя создать через New-Object, поскольку для этого нет ни одного конструктора. Следовательно объект нужно создавать используя статические методы. Статические методы можно посмотреть на странице &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics_members.aspx" target=_blank&gt;Drawing.Graphics Members&lt;/A&gt;. И там мы можем найти красивый метод — &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.fromimage.aspx" target=_blank&gt;FromImage&lt;/A&gt;. В качестве аргумента этого метода нужно указать картинку — &lt;A title=http://msdn.microsoft.com/en-us/library/system.drawing.image.aspx href="http://msdn.microsoft.com/en-us/library/system.drawing.image.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.drawing.image.aspx&lt;/A&gt;. Это может быть файл или объект класса &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" target=_blank&gt;Drawing.Bitmap&lt;/A&gt;. Давайте создадим объект класса &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" target=_blank&gt;Drawing.Bitmap&lt;/A&gt; с использованием следующего конструктора — &lt;A href="http://msdn.microsoft.com/en-us/library/7we6s1x3.aspx" target=_blank&gt;Bitmap Constructor (Int32, Int32)&lt;/A&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $size = [Windows.Forms.SystemInformation]::VirtualScreen
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $bitmap = new-object Drawing.Bitmap $size.width, $size.height
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $bitmap


Tag                  :
PhysicalDimension    : {Width=1280, Height=800}
Size                 : {Width=1280, Height=800}
Width                : 1280
Height               : 800
HorizontalResolution : 96
VerticalResolution   : 96
Flags                : 2
RawFormat            : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e]
PixelFormat          : Format32bppArgb
Palette              : System.Drawing.Imaging.ColorPalette
FrameDimensionsList  : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
PropertyIdList       : {}
PropertyItems        : {}



&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Примечание: WinForms по умолчанию не загружаются вместе с PowerShell, поэтому мы их подгружаем в консоль в ходе работы. Мы создали Bitmap и теперь его можем использовать для создания объекта &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" target=_blank&gt;Drawing.Graphics&lt;/A&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #800080"&gt;$graphics&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Drawing.Graphics&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;FromImage&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bitmap&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;А дальше уже вызывать метод &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.graphics.copyfromscreen.aspx" target=_blank&gt;CopyFromScreen()&lt;/A&gt;. При этом указываем первым аргументом начало координат (верхний левый угол или 0,0) и в аргумент правый нижний угол. Т.е. максимум точек по ширине и высоте. Их мы можем получить из свойств Width и Height класса &lt;A href="http://msdn.microsoft.com/en-us/library/system.windows.forms.systeminformation.aspx" target=_blank&gt;Windows.Forms.SystemInformation&lt;/A&gt;. Средний аргумент опускаем и делаем его пустым:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $graphics = [Drawing.Graphics]::FromImage($bitmap)
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $graphics.CopyFromScreen($size.Location,[Drawing.Point]::Empty, $size.size)&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Всё, мы сфоткали наш экран и загнали картинку обратно в Bitmap. Теперь нужно выгрузить картинку куда-то в файл. Для этого у Bitmap есть метод &lt;A href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.save.aspx" target=_blank&gt;Save()&lt;/A&gt;, в котором достаточно указать путь к файлу:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $bitmap.save(".\screenshot.jpg")
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] gi .\screenshot.jpg


    Directory: C:\Users\vPodans


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        22.04.2010     22:37     286319 screenshot.jpg


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Всё &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; после сохранения картинка остаётся в памяти, поэтому после работы следует освобождать оперативную память от ненужных пруфпиков используя метод Dispose() без аргументов.&lt;/P&gt;
&lt;P&gt;И код:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;void&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;][&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Reflection.Assembly&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;LoadWithPartialName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;System.Windows.Forms&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$size&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Windows.Forms.SystemInformation&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;VirtualScreen&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bitmap&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;new-object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Drawing.Bitmap&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$size&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.width, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$size&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.height
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$graphics&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Drawing.Graphics&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;FromImage&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bitmap&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$graphics&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.CopyFromScreen(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$size&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.location,[&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Drawing.Point&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Empty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$size&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.size)
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$graphics&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Dispose()
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bitmap&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Save(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;.\screenshot.jpg&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bitmap&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Dispose()&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=5da8eabd-6b36-407d-889f-966ed3c1450c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,5da8eabd-6b36-407d-889f-966ed3c1450c.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b255fe99-c7f7-496c-977a-272b95494fb4</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b255fe99-c7f7-496c-977a-272b95494fb4.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b255fe99-c7f7-496c-977a-272b95494fb4.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b255fe99-c7f7-496c-977a-272b95494fb4</wfw:commentRss>
      <title>Создание самоподписанного сертификата средствами PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b255fe99-c7f7-496c-977a-272b95494fb4.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b255fe99-c7f7-496c-977a-272b95494fb4.aspx</link>
      <pubDate>Sun, 18 Apr 2010 09:46:11 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Самоподписанные сертификаты — это зло, за исключением сертификатов корневых CA. Я об этом говорил, говорю и буду говорить. Но в данном случае мы не преследуем цель создания самоподписанного сертификата. Нас по сути будет интересовать немного другое — рассмотрение принципа, который заложен во многих популярных тулзах как MakeCert или OpenSSL. Лично я не фанат ни первого, ни второго по своим сугубо личным причинам. Но, кроме этих двоих есть ещё утилита CertReq.exe, которая достаточно православная и вряд ли ей грозит вымирание (а жаль). Вобщем, сегодня предлагаю ещё раз поковырять CryptoAPI.&lt;/p&gt;  &lt;p&gt;Как мы уже знаем, &lt;a href="http://www.sysadmins.lv/CategoryView,category,PowerShellCryptoAPI.aspx"&gt;CryptoAPI&lt;/a&gt; обладает большим количеством всяческих COM интерфейсов, при помощи которых мы можем работать практически с любыми аспектами цифровых сертификатов. Некоторые из них бажные, а некоторые — не очень &lt;img alt=":)" src="/smilies/happy.gif"&gt;, но функционал у них впечатляющий. В настоящее время существует 2 основных набора API, которые реализуют клиентскую часть энроллмента — &lt;a href="http://msdn.microsoft.com/en-us/library/aa382482(VS.85).aspx" target="_blank"&gt;XEnroll&lt;/a&gt; и &lt;a href="http://msdn.microsoft.com/en-us/library/aa374850(VS.85).aspx" target="_blank"&gt;CertEnroll&lt;/a&gt;. Первый доступен только в системах начиная с Windows 2000 и до Windows Server 2003 включительно. В более новых версиях XEnroll был вырезан вместе с CAPICOM'ом полностью (куски CAPICOM'а ещё можно найти в висте) за ненадобностью. Семейство интерфейсов CertEnroll было значительно переработано и расширено, что делает его крайне гибким. Я не буду рассказывать про XEnroll, потому что это неинтересно и трупов пинать нехорошо.&lt;/p&gt;  &lt;p&gt;Многие считают, что CryptoAPI — это очень сложно. Я могу возразить им. Я не программист совсем, но могу достаточно свободно их использовать. Нашей отправной точкой будет MSDN по адресу: &lt;a href="http://msdn.microsoft.com/en-us/library/aa374874(VS.85).aspx"&gt;Certificate Enrollment API Reference&lt;/a&gt;. Эта секция содержит всё самое необходимое — описание интерфейсов и перечисления. И самый первый интерфейс, который мы видим — &lt;a href="http://msdn.microsoft.com/en-us/library/aa377809(VS.85).aspx" target="_blank"&gt;IX509Enrollment&lt;/a&gt;. Этот интерфейс реализует нечто промежуточное между клиентом и сервером. Мы можем по описанию найти то, что нам нужно, а именно первую секцию — Out-of-band-enrollment. И мы видим, что для него надо сначала вызвать метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa377869(VS.85).aspx" target="_blank"&gt;CreateRequest()&lt;/a&gt;. Но прежде чем вызывать метод, нам надо создать форму сертификата, на основе которой будет создан запрос. Как я уже упоминал, мы будем делать самоподписанный сертификат, поэтому следующий интерфейс подойдёт нам как нельзя кстати — &lt;a href="http://msdn.microsoft.com/en-us/library/ee351612(VS.85).aspx" target="_blank"&gt;IX509CertificateRequestCertificate2&lt;/a&gt;. Вот давайте с него и начнём.&lt;/p&gt;  &lt;p&gt;Все указанные здесь и далее интерфейсы являются COM интерфейсами семейства X509Enrollment и эти объекты создаются следующим образом:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX509CertificateRequestCertificate.1&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; как строятся такие команды? Поскольку это COM интерфейс, первую букву I в названии интерфейса меняем на букву C. Далее, если мы видим цифру 2 в конце названия интерфейса, в команде мы ставим точку и пишем число на единцу меньшее. Вот такие нехитрые правила.&lt;/p&gt;

&lt;p&gt;Прежде чем его начать использовать, нам надо инициализировать его. К сожалению документация на MSDN далеко не полная, поэтому будем искать нужные методы через PowerShell и командлет Get-Member:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cert | gm -MemberType methods


   TypeName: System.__ComObject#{728ab35a-217d-11da-b2a4-000e7bbb2b09}

Name                             MemberType Definition
----                             ---------- ----------
CheckPublicKeySignature          Method     void CheckPublicKeySignature (IX509PublicKey)
CheckSignature                   Method     void CheckSignature (Pkcs10AllowedSignatureTypes)
Encode                           Method     void Encode ()
GetCspStatuses                   Method     ICspStatuses GetCspStatuses (X509KeySpec)
GetInnerRequest                  Method     IX509CertificateRequest GetInnerRequest (InnerRequestLevel)
Initialize                       Method     void Initialize (X509CertificateEnrollmentContext)
InitializeDecode                 Method     void InitializeDecode (string, EncodingType)
InitializeFromCertificate        Method     void InitializeFromCertificate (X509CertificateEnrollmentContext, string...
InitializeFromPrivateKey         Method     void InitializeFromPrivateKey (X509CertificateEnrollmentContext, IX509Pr...
InitializeFromPrivateKeyTemplate Method     void InitializeFromPrivateKeyTemplate (X509CertificateEnrollmentContext,...
InitializeFromPublicKey          Method     void InitializeFromPublicKey (X509CertificateEnrollmentContext, IX509Pub...
InitializeFromTemplate           Method     void InitializeFromTemplate (X509CertificateEnrollmentContext, IX509Enro...
InitializeFromTemplateName       Method     void InitializeFromTemplateName (X509CertificateEnrollmentContext, string)
IsSmartCard                      Method     bool IsSmartCard ()
ResetForEncode                   Method     void ResetForEncode ()


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Из всех методов нам по сути доступен только &lt;strong&gt;InitializeFromPrivateKey()&lt;/strong&gt;, поскольку остальные методы инициализации требуют наличие доступа к Certification Authority. Посмотрим что требуется для этого метода:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cert | gm -MemberType methods | ?{$_.name -eq &amp;quot;InitializeFromPrivateKey&amp;quot;} | select definition

Definition
----------
void InitializeFromPrivateKey (X509CertificateEnrollmentContext, IX509PrivateKey, string)


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;В качестве аргументов метода нам надо указать контекст энроллмента и объект закрытого ключа. Значения контекста находятся здесь: &lt;a href="http://msdn.microsoft.com/en-us/library/aa379399(VS.85).aspx"&gt;X509CertificateEnrollmentContext&lt;/a&gt; (просто включаете поиск на MSDN по названию перечисления). В качестве контекста мы можем выбрать контекст текущего пользователя или компьютера (остальное нас сейчас не волнует совсем). Контекст пользователя имеет значение 0x1. Так и запишем. Но этого мало. Надо ещё создать &lt;a href="http://msdn.microsoft.com/en-us/library/aa378921(VS.85).aspx" target="_blank"&gt;объект закрытого ключа&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX509PrivateKey&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Этот интерфейс позволяет задавать различные параметры закрытого ключа, но мы обойдёмся лишь самым необходимым:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; во-первых надо указать CSP. Выберем самый простой криптопровайдер&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.ProviderName &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Microsoft Base Cryptographic Provider v1.0&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; закрытый ключ будет использоваться для подписи (Digital Signature)&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://msdn.microsoft.com/en-us/library/aa379409(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.KeySpec &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0x2&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; длина вполне стандартная&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.Length &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1024&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; ключ будем хранить в пользовательском хранилище&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.MachineContext &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0x0&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и генерируем ключ&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.Create()&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ура! Мы сгенерировали ключ. Теперь вернёмся к предыдущему интерфейсу и инициализируем его из закрытого ключа:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.InitializeFromPrivateKey(&lt;/span&gt;&lt;span style="color: #000000"&gt;0x1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Мы указываем контекст текущего пользователя и объект закрытого ключа. Там есть ещё один аргумент, который называется String. Я не знаю, что они этим хотели сказать, поэтому оставляем пустую строку. А теперь вернёмся к интерфейсу &lt;a href="http://msdn.microsoft.com/en-us/library/ee351612(VS.85).aspx" target="_blank"&gt;IX509CertificateRequestCertificate2&lt;/a&gt; и посмотрим, что мы можем сделать сейчас. Например, используя свойства NotBefore и NotAfter мы зададим срок действия сертификата. Например, 1 год с сегодняшнего дня:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.NotBefore &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;datetime&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Now&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.NotAfter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.NotBefore.AddDays(&lt;/span&gt;&lt;span style="color: #000000"&gt;365&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Теперь нам надо добавить следующие свойства: EncancedKeyUsage (т.е. для каких целей вообще будет использоваться сертификат), Subject (на кого будет выписан сертификат) и Issuer (кто выдал этот сертификат). Поскольку у нас самоподписанный сертификат, поле Subject и Issuer будут одинаковые. На MSDN'е не хватает документации по свойствам Issuer и Subject, но у нас есть поиск, который нас приведёт сюда: &lt;a href="http://msdn.microsoft.com/en-us/library/aa377051(VS.85).aspx" target="_blank"&gt;IX500DistinguishedName&lt;/a&gt;. Поля Subject и Issuer должны заполняться в формате Distinguished Name и доступные префиксы для DN достаточно понятно расписаны в таблице. Нам нужно как-то активировать этот объект. Методов для инициализации здесь нет, поэтому будем использовать метод Encode().&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Лирическое отступление:&lt;/font&gt;&lt;/strong&gt; в подавляющем большинстве случаев вы не можете присваивать значения свойствам объектов после создания самих объектов. Предварительно их надо «активировать» одним из двух способов. Если у объекта есть метод Initialize или производное от него, необходимо сначала воспользоваться одним из доступных методов инициализации. Если объект не содержит явных методов инициализации, нужно воспользоваться методом Encode, который кодирует объект или строку в ASN.1 DER строку и инициализирует объект. Единственным исключением из этого правила являются коллекции объектов. Они как правило используют метод &lt;strong&gt;Add()&lt;/strong&gt; для добавления уже инициализированных объектов.&lt;/p&gt;

&lt;p&gt;Уже с главной страницы &lt;a href="http://msdn.microsoft.com/en-us/library/aa377051(VS.85).aspx" target="_blank"&gt;IX500DistinguishedName&lt;/a&gt; видно, что &lt;a href="http://msdn.microsoft.com/en-us/library/aa377054(VS.85).aspx" target="_blank"&gt;Encode&lt;/a&gt; кодирует строку, которая записана в DN формате. Поэтому вызываем этот метод:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$SubjectDN&lt;/span&gt;&lt;span style="color: #000000"&gt;.Encode(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=Some Subject,DC=lucernepublishing,DC=COM&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;0x0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;После строки нужно ещё указать флаг, в котором указана строка DN. Ставим дефолтный флаг. Теперь у нас готово поле Subject и Issuer (как мы договаривались, они будут одинаковые). Давайте их прицепим к нашему шаблону сертификата:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Subject &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$SubjectDN&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Issuer &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Subject&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Что нам осталось сделать? Нам надо создать расширение Enchanced Key Usage. Для этого нам надо использовать следующий интерфейс: &lt;a href="http://msdn.microsoft.com/en-us/library/aa378132(VS.85).aspx" target="_blank"&gt;IX509ExtensionEnhancedKeyUsage&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$EKU&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX509ExtensionEnhancedKeyUsage&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Данный объект инициализируется из коллекции объектов &lt;a href="http://msdn.microsoft.com/en-us/library/aa376785(VS.85).aspx" target="_blank"&gt;IObjectIds&lt;/a&gt;. Давайте создадим эту коллекцию:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$OIDs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CObjectIDs&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;В эту коллекцию с использованием метода Add() надо добавить один или несколько объектов &lt;a href="http://msdn.microsoft.com/en-us/library/aa376784(VS.85).aspx" target="_blank"&gt;IObjectId&lt;/a&gt;, каждый из которых представляет конкретное предназначение сертификата. Например, Server Authentication, Client Authentication, Smart Card Logon, Secure e-mail и т.д. Но мы сделаем сертификат для Code Signing. OID этого EKU = 1.3.6.1.5.5.7.3.3. Вот и сделаем его:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём объект IObjectID&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$OID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CObjectID&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; инициализируем его с использованием Code Signing&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$OID&lt;/span&gt;&lt;span style="color: #000000"&gt;.InitializeFromValue(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;1.3.6.1.5.5.7.3.3&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; добавляем наш OID в коллекцию OID'ов&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$OIDs&lt;/span&gt;&lt;span style="color: #000000"&gt;.Add(&lt;/span&gt;&lt;span style="color: #800080"&gt;$OID&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; добавляем коллекцию в объект IX509ExtensionEnhancedKeyUsage&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$EKU&lt;/span&gt;&lt;span style="color: #000000"&gt;.InitializeEncode(&lt;/span&gt;&lt;span style="color: #800080"&gt;$OIDs&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;объект EKU у нас готов, теперь его надо добавить в наш шаблон сертификата. Поскольку это не стандартное поле сертификата, а расширение, добавляем этот объект в свойство X509Extensions, которое является аналогом интерфейса IX509Extensions и, который в свою очередь, является коллекцией расширений. Поэтому добавляем наше расширение методом &lt;a href="http://msdn.microsoft.com/en-us/library/aa378242(VS.85).aspx" target="_blank"&gt;Add()&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.X509Extensions.Add(&lt;/span&gt;&lt;span style="color: #800080"&gt;$EKU&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Всё, мы собрали все минимально необходимые поля и расширения:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cert


Type                        : 4
EnrollmentContext           : 1
Silent                      : False
ParentWindow                :
UIContextMessage            :
SuppressDefaults            : False
ClientId                    :
CspInformations             : System.__ComObject
HashAlgorithm               : System.__ComObject
AlternateSignatureAlgorithm : False
TemplateObjectId            :
PublicKey                   : System.__ComObject
PrivateKey                  : System.__ComObject
NullSigned                  : False
ReuseKey                    : False
Subject                     : System.__ComObject
CspStatuses                 : System.__ComObject
SmimeCapabilities           : False
SignatureInformation        : System.__ComObject
KeyContainerNamePrefix      : lp
CryptAttributes             :
X509Extensions              : System.__ComObject
CriticalExtensions          : System.__ComObject
SuppressOids                : System.__ComObject
Issuer                      : System.__ComObject
NotBefore                   : 16.04.2010 18:25:22
NotAfter                    : 16.04.2011 18:25:22
SignerCertificate           :
PolicyServer                :
Template                    :



&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Теперь мы можем превращать наш шаблон сертификата в настоящй сертификат.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Лирическое отступление:&lt;/font&gt;&lt;/strong&gt; а что такое запрос в техническом смысле? На самом деле запрос ничем не отличается от сертификата. Когда вы запрашиваете сертификат у CA, клиент использует эти же интерфейсы для генерации запроса. При этом получается самый настоящий самоподписанный сертификат, где Subject и Issuer одинаковые и равны имени текущего пользователя или компьютера, а так же содержит все необходимые расширения. Сам запрос подписывается закрытым ключом, который мы сгенерировали. По большому счёту, его уже можно использовать как настоящий самоподписанный сертификат. Если его отправить на сервер CA, то последний просто подменяет значения необходимых полей (как Issuer, в котором он ставит себя) и расширений, удаляет старую подпись и подписывает сертификат новой подписью. Вы можете убедиться в этом очень просто. Сгенерируйте запрос для сертификата, откройте оснастку Certificates и разверните секцию &lt;strong&gt;Certificate Enrollment Requests&lt;/strong&gt;. Там будет этот самый запрос в виде уже готового сертификата. Просто там он ждёт, пока какой-нибудь CA не подпишет его.&lt;/p&gt;

&lt;p&gt;Давайте вернёмся в самое начало текущего поста и вспомним про «исходный предмет» — &lt;a href="http://msdn.microsoft.com/en-us/library/aa377809(VS.85).aspx" target="_blank"&gt;IX509Enrollment&lt;/a&gt;. Вот этот интерфейс нам сконвертирует шаблон сертификата в настоящий сертификат с использованием метода &lt;a href="http://msdn.microsoft.com/en-us/library/aa377869(VS.85).aspx" target="_blank"&gt;CreateRequest()&lt;/a&gt;. Но прежде чем использовать метод, нам надо инициализировать объект:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$Request&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX509enrollment&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Request&lt;/span&gt;&lt;span style="color: #000000"&gt;.InitializeFromRequest(&lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И генерируем файл запроса, который ничем не отличается от самоподписанного сертификата:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$endCert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Request&lt;/span&gt;&lt;span style="color: #000000"&gt;.CreateRequest(&lt;/span&gt;&lt;span style="color: #000000"&gt;0x0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;В аргументах метода указываем кодировку согласно этой страничке: &lt;a href="http://msdn.microsoft.com/en-us/library/aa374936(VS.85).aspx" target="_blank"&gt;EncodingType Enumeration&lt;/a&gt;. Мы выбираем Base64 с заголовками. $endCert будет содержать сам сертификат (открытую его часть). Фактически запрос хранится в контейнере &lt;strong&gt;Certificate Enrollment Requests&lt;/strong&gt;. Поскольку этот интерфейс не был задуман специально для самоподписанных сертификатов мы проходим стандартную процедуру установки сертификата. Мы просто берём открытую часть нашего же сертификата и устанавливаем её. Вот, кстати, как он выглядит:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $endcert
-----BEGIN CERTIFICATE-----
MIICaTCCAdKgAwIBAgIQEzCS/mFIxLBAiGjz7+n0dDANBgkqhkiG9w0BAQUFADBP
MRMwEQYKCZImiZPyLGQBGRYDQ09NMSEwHwYKCZImiZPyLGQBGRYRbHVjZXJuZXB1
Ymxpc2hpbmcxFTATBgNVBAMMDFNvbWUgU3ViamVjdDAeFw0xMDA0MTgxMTI5MDla
Fw0xMTA0MTgxMTI5MDlaME8xEzARBgoJkiaJk/IsZAEZFgNDT00xITAfBgoJkiaJ
k/IsZAEZFhFsdWNlcm5lcHVibGlzaGluZzEVMBMGA1UEAwwMU29tZSBTdWJqZWN0
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBGa+PnrhnOFO5+76c5zX5/+xh
Kb2hUYl/pRuIKzYcqrmkvqjpPK/McusibT1h70emUkED0TSZsAlSivdIFK6WSxn6
HsTCaGIHhyOSKAvzQkBsZ74BPEydGT5LiX0+MOTyxwFAHhb+bqfbkdkXqUSkJAHK
Z6p+fgX8uaJkKjL/kwIDAQABo0YwRDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNV
HQ4EFgQUzIFwoRTY6KjUiqmjWjSjlkxbNncwDgYDVR0PAQH/BAQDAgeAMA0GCSqG
SIb3DQEBBQUAA4GBACizodCpl/cF3OGLUx8HVag0yhr1e1P8+CLPc31FmCPAY1CO
T0yxyJPoafkbXKRjclevNJdvxE3ys9fyYigFUhgswh3oWmjanDaatPKa0kE4147k
SQHvN8JP20KeDDCJBk/FbS3xCn3jTix90ddzTa1uFoqBbBNbKOaDHIrqypTY
-----END CERTIFICATE-----

&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Система приклеит этот сертификат к шаблону сертификата и переложит его уже в контейнер Personal:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$Request&lt;/span&gt;&lt;span style="color: #000000"&gt;.InstallResponse(&lt;/span&gt;&lt;span style="color: #000000"&gt;0x2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$endCert&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0x0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Всё, теперь мы увидим этот сертификат в нашем хранилище и который готов к использованию. Я немного переработал код и обернул его в красивую функцию, которая будет делать следующее:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Генерировать тестовый самоподписанный сертификат для подписи скриптов PowerShell &lt;/li&gt;

  &lt;li&gt;Устанавливать сертификат с закрытым ключом в контейнер Personal &lt;/li&gt;

  &lt;li&gt;Устанавливать открытую часть сертификата в Trusted Root CAs для обеспечения доверия этому сертификату &lt;/li&gt;

  &lt;li&gt;Устанавливать открытую часть сертификата в Trusted Publishers для задания явного доверия цифровым подписям, сделанные этим сертификатом. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;####################################################################&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Create PowerShell cert.ps1&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Version 1.0&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Creates self-signed signing certificate and install it to certificate store&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Note: Requires at least Windows Vista. Windows XP/Windows Server 2003&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; are not supported.&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Vadims Podans (c) 2010&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://www.sysadmins.lv/&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;####################################################################&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;requires -Version 2.0&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;New-SigningCert&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;lt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;
.Synopsis
    Creates self-signed signing certificate and install it to certificate store
.Description
    This function generates self-signed certificate with some pre-defined and
    user-definable settings. User may elect to perform complete certificate
    installation, by installing generated certificate to Trusted Root Certification
    Authorities and Trusted Publishers containers in *current user* store.
    
.Parameter Subject
    Specifies subject for certificate. This parameter must be entered in X500
    Distinguished Name format. Default is: CN=PowerShell User, OU=Test Signing Cert.

.Parameter KeyLength
    Specifies private key length. Due of performance and security reasons, only
    1024 and 2048 bit are supported. by default 1024 bit key length is used.

.Parameter NotBefore
    Sets the date in local time on which a certificate becomes valid. By default
    current date and time is used.

.Parameter NotAfter
    Sets the date in local time after which a certificate is no longer valid. By
    default certificate is valid for 365 days.

.Parameter Force
    If Force switch is asserted, script will prepare certificate for use by adding
    it to Trusted Root Certification Authorities and Trusted Publishers containers
    in current user certificate store. During certificate installation you will be
    prompted to confirm if you want to add self-signed certificate to Trusted Root
    Certification Authorities container.
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;
[CmdletBinding()]
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt; (
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Subject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=PowerShell User, OU=Test Signing Cert&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;][ValidateSet(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;1024&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;2048&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)]&lt;/span&gt;&lt;span style="color: #800080"&gt;$KeyLength&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1024&lt;/span&gt;&lt;span style="color: #000000"&gt;,
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;datetime&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$NotBefore&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;DateTime&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Now&lt;/span&gt;&lt;span style="color: #000000"&gt;,
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;datetime&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$NotAfter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$NotBefore&lt;/span&gt;&lt;span style="color: #000000"&gt;.AddDays(&lt;/span&gt;&lt;span style="color: #000000"&gt;365&lt;/span&gt;&lt;span style="color: #000000"&gt;),
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
    )
    
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$OS&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-WmiObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_OperatingSystem&lt;/span&gt;&lt;span style="color: #000000"&gt;).Version
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$OS&lt;/span&gt;&lt;span style="color: #000000"&gt;[0] &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;6&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Windows XP, Windows Server 2003 and Windows Server 2003 R2 are not supported!&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; while all certificate fields MUST be encoded in ASN.1 DER format&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; we will use CryptoAPI COM interfaces to generate and encode all necessary&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; extensions.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; create Subject field in X.500 format using the following interface:&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://msdn.microsoft.com/en-us/library/aa377051(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$SubjectDN&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX500DistinguishedName&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$SubjectDN&lt;/span&gt;&lt;span style="color: #000000"&gt;.Encode(&lt;/span&gt;&lt;span style="color: #800080"&gt;$Subject&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;0x0&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; define CodeSigning enhanced key usage (actual OID = 1.3.6.1.5.5.7.3.3) from OID&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://msdn.microsoft.com/en-us/library/aa376784(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$OID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CObjectID&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$OID&lt;/span&gt;&lt;span style="color: #000000"&gt;.InitializeFromValue(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;1.3.6.1.5.5.7.3.3&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; while IX509ExtensionEnhancedKeyUsage accept only IObjectID collection&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; (to support multiple EKUs) we need to create IObjectIDs object and add our&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; IObjectID object to the collection:&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://msdn.microsoft.com/en-us/library/aa376785(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$OIDs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CObjectIDs&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$OIDs&lt;/span&gt;&lt;span style="color: #000000"&gt;.Add(&lt;/span&gt;&lt;span style="color: #800080"&gt;$OID&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; now we create Enhanced Key Usage extension, add our OID and encode extension value&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://msdn.microsoft.com/en-us/library/aa378132(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$EKU&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX509ExtensionEnhancedKeyUsage&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$EKU&lt;/span&gt;&lt;span style="color: #000000"&gt;.InitializeEncode(&lt;/span&gt;&lt;span style="color: #800080"&gt;$OIDs&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; generate Private key as follows:&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://msdn.microsoft.com/en-us/library/aa378921(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX509PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.ProviderName &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Microsoft Base Cryptographic Provider v1.0&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; private key is supposed for signature: http://msdn.microsoft.com/en-us/library/aa379409(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.KeySpec &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0x2&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.Length &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$KeyLength&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; key will be stored in current user certificate store&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.MachineContext &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0x0&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;.Create()
    
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; now we need to create certificate request template using the following interface:&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://msdn.microsoft.com/en-us/library/aa377124(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX509CertificateRequestCertificate&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.InitializeFromPrivateKey(&lt;/span&gt;&lt;span style="color: #000000"&gt;0x1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$PrivateKey&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Subject &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$SubjectDN&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Issuer &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Subject
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.NotBefore &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$NotBefore&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.NotAfter &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$NotAfter&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.X509Extensions.Add(&lt;/span&gt;&lt;span style="color: #800080"&gt;$EKU&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; completing certificate request template building&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Encode()
    
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; now we need to process request and build end certificate using the following&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; interface: http://msdn.microsoft.com/en-us/library/aa377809(VS.85).aspx&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Request&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;X509Enrollment.CX509enrollment&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; process request&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Request&lt;/span&gt;&lt;span style="color: #000000"&gt;.InitializeFromRequest(&lt;/span&gt;&lt;span style="color: #800080"&gt;$Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; retrievecertificate encoded in Base64.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$endCert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Request&lt;/span&gt;&lt;span style="color: #000000"&gt;.CreateRequest(&lt;/span&gt;&lt;span style="color: #000000"&gt;0x1&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; install certificate to user store&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Request&lt;/span&gt;&lt;span style="color: #000000"&gt;.InstallResponse(&lt;/span&gt;&lt;span style="color: #000000"&gt;0x2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$endCert&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0x1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; convert Bas64 string to a byte array&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;         [&lt;/span&gt;&lt;span style="color: #008080"&gt;Byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Convert&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;FromBase64String&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$endCert&lt;/span&gt;&lt;span style="color: #000000"&gt;)
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Root&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;TrustedPublisher&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; open Trusted Root CAs and TrustedPublishers containers and add&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; certificate&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$x509store&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Security.Cryptography.X509Certificates.X509Store&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CurrentUser&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$x509store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Open([&lt;/span&gt;&lt;span style="color: #008080"&gt;Security.Cryptography.X509Certificates.OpenFlags&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ReadWrite&lt;/span&gt;&lt;span style="color: #000000"&gt;)
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$x509store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Add([&lt;/span&gt;&lt;span style="color: #008080"&gt;Security.Cryptography.X509Certificates.X509Certificate2&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt;)
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; close store when operation is completed&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$x509store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Close()
        }
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;С виду кажется сложно, но на самом деле тут ничего сложного нет совсем. Просто представьте себе сертификат как большую матрёшку, в которую вы вкладываете другие маленькие матрёшки, которые представляют собой поля и расширения сертификатов. Начинаете собирать самые маленькие матрёшки, вкладываете в более большие и в конечном итоге собираете настоящий сертификат. Хоть документация на MSDN не очень полная, используя командлет &lt;strong&gt;Get-Member&lt;/strong&gt; вы можете восполнить этот пробел.&lt;/p&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/new-signingcert.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/new-signingcert.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/new-signingcert.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;13,1 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/new-signingcert.ps1" target="_self" alt="Download File"&gt;New-SigningCert.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b255fe99-c7f7-496c-977a-272b95494fb4"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b255fe99-c7f7-496c-977a-272b95494fb4.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
      <category>PowerShell / CryptoAPI</category>
      <category>PowerShell / Digital Signatures</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=2dc109a8-2a1a-4091-9a0d-eb28f4c87159</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,2dc109a8-2a1a-4091-9a0d-eb28f4c87159.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,2dc109a8-2a1a-4091-9a0d-eb28f4c87159.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=2dc109a8-2a1a-4091-9a0d-eb28f4c87159</wfw:commentRss>
      <title>Active Directory PKI object management с помощью PowerShell (часть 3)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,2dc109a8-2a1a-4091-9a0d-eb28f4c87159.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,2dc109a8-2a1a-4091-9a0d-eb28f4c87159.aspx</link>
      <pubDate>Mon, 14 Dec 2009 18:47:12 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Продолжаем серию постов, которые посвящены базовому управлению объектами PKI в Active Directory. На данный момент мы рассмотрели сценарии публикации и просмотра сертификатов в Active Directory:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,dd03c789-780d-4b39-9b7b-310905ecde32.aspx"&gt;Active Directory PKI object management с помощью PowerShell&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,55c5304e-baef-4af6-bc0f-e09c214fb630.aspx"&gt;Active Directory PKI object management с помощью PowerShell (часть 2)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;На данном этапе нам осталось последнее — удаление сертификатов из AD. Логика здесь очень простая: командой &lt;strong&gt;Get-ADPKIObject&lt;/strong&gt; мы получаем коллекцию объектов, которые представляют собой сертификаты и через конвейер командой &lt;strong&gt;Remove-ADPKIObject&lt;/strong&gt; указываем &lt;strong&gt;ID&lt;/strong&gt; объектов, которые необходимо удалить. Если кто-то уже разбирал код предыдущих скриптов, то ему будет совсем нетрудно понять логику скрипта удаления объектов. Вот он, вместе с комментариями:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Remove-ADPKIObject&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;lt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;
.Synopsis
    Deletes certificates from Active Directory containers
.Description
    Deletes certificates from Active Directory containers by specifying particular ID or IDs
.Parameter ID
    Specifies certificate ID to delete that was set in Get-ADPKIObject command.
.EXAMPLE
    Get-ADPKIObject RootCA | Remove-ADPKIObject 2
    
    deletes certificate with ID = 2 in certificate viewer
.Outputs
    This command provide a resultant of operation.
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt;([&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$ID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; $(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;you must specify number of the object to delete&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;))
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; объявляем массив для хранения сертификатов из контейнера NTAuthCertificates&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;begin&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @()}
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;process&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем тип контейнера входящего объекта&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.Container &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-ne&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAuthCertificates&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если это не NTAuthCertificates, то проверяем, что ID текущего объекта&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; совпадает с ID, который нужно удалить&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (@(&lt;/span&gt;&lt;span style="color: #800080"&gt;$ID&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-contains&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.Id) {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если совпал, то собираем LDAP-запрос&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;ADSI&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;LDAP://CN=$($_.Container),$script:ConfigContext&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и удаляем текущий объект из AD&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$retn&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.Delete(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;certificationAuthority&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=$($_.Subject)&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$?&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
                    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;`'$($_.Subject)`' certificate was sucessfully deleted from `'$($_.Container)`' container&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;span style="color: #000000"&gt;
                    &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Green&lt;/span&gt;&lt;span style="color: #000000"&gt;
                }
            }
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если контейнер текущего объекта является NTAuthCertificates, то собираем их все в массив&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    }
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что массив непустой (т.е. надо что-то удалять из NTAuthCertificates)&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если массив непустой, то выбираем те элементы, которые нужно сохранить&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; т.е. ID которых не содержится в аргументах скрипта&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @(&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; |?{&lt;/span&gt;&lt;span style="color: #800080"&gt;$ID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-notcontains&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.Id})
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; делаем LDAP-запрос к этому контейнеру&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;ADSI&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;LDAP://CN=$($_.Container),$script:ConfigContext&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что после фильтрации, хотя бы один сертификат нужно оставить&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;.count &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-ge&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записываем первый сертификат. Это необходимо потому что ADSI не поддерживает запись&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; массива сертификатов в свойство cACertificate, а только один сертификат в виде byte[]&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.put(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;cACertificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;[0].RawCertificate)
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; а вот простое добавление он поддерживает. Тогда ADSI сам пересоберёт объекты&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в свойстве в нужный формат данных. На данном этапе я применил маленькую хитрость:&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; как видно, я первый сертификат записываю дважды - предыдущей строкой и в первой итерации&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; текущей строки. Но это не проблема, поскольку метод SetInfo() записывает только уникальные&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; объекты, а дублирующиеся просто отбросит.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.cACertificate &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; ,[&lt;/span&gt;&lt;span style="color: #008080"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]$(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.RawCertificate)}
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetInfo()
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$?&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
                    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;`'$($_.Subject)`' certificate was sucessfully deleted from `'$($_.Container)`' container&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;span style="color: #000000"&gt;
                    &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Green&lt;/span&gt;&lt;span style="color: #000000"&gt;
                }
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; а вот если после фильтрации объектов, у нас ничего не остаётся на запись, то это означает, что все&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сертификаты из этого контейнера удаляются. Поэтому мы просто удаляем запись NTAuthCertificates.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
                ([&lt;/span&gt;&lt;span style="color: #008080"&gt;ADSI&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;LDAP://$script:ConfigContext&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;).Delete(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;certificationAuthority&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=NTAuthCertificates&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$?&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;All certificates was sucessfully deleted from NTAuthCertificates entry .&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Green&lt;/span&gt;&lt;span style="color: #000000"&gt;
                    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;This was last certificate in contaner. NTAuthCertificates entry is removed from Active Directory&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                }
            }
        }
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И теперь можно подвести краткие итоги. Мы смогли реализовать функционал certutil и других графических утилит (консоли MMC) в PowerShell значительно улучшив читабельность выходных объектов, адаптировали под работу из консоли (синтаксис стал значимо короче и более юзерфрендли) и шаг за шагом делаем из PowerShell единое консольное средство управления различными аспектами PKI.&lt;/p&gt;

&lt;p&gt;Можно задать вопрос: а кто целевая аудитория всего этого? Целевая аудитория есть — администраторы PKI. Просто у вас не всегда будет возможность использовать графические консоли для решения этих задач (потому что их функционал далёк от идеального). Можно использовать certutil, который умеет много чего, но тоже имеет свои недостатки. Это и ужасный синтаксис, и вырвиглазный неуправляемый вывод результатов. Вобщем я надеюсь, что рано или поздно PowerShell сможет по-настоящему заменить certutil (который вообще-то ни в чём не виноват) и стать единой консолью всех Windows-администраторов. Вот не знаю на сколько это хорошо или плохо, потому что Microsoft всех насильно переводит на PowerShell (это очень показательно продемонстрировано в MS Exchange, где у вас по сути есть только PowerShell и всё). Обычно, насильно переводят на другой инструмент когда он является УГ и очень тяжело на него перевести людей посредством обычной рекламы. Но является ли PowerShell таким УГ? Я пока не готов ответить на этот вопрос. Моё мнение — PowerShell пока что особой революцией не стал. Даже не смотря на тонны рекламы, пеара и прочего, где восхваляют PowerShell, закидывают ногами CMD/WSH. Это обусловлено тем фактом, что не всегда PowerShell бывает удобней CMD/WSH, особенно в тривиальных задачах. Говорить, что синтаксис стал более простым и компактным тоже нельзя, потому что реально функционала из коробки хватает для решения процентов 10 задач. Всё остальное нужно скриптовать и программировать (да-да!) самому. Благо средств для этого в PowerShell хватает. Во что это обычно выливается? А в то, что в большинстве случаев результирующий объём кода будет не сильно меньше, чем в связке WSH + CMD. В любом случае преимущества PowerShell перед остальными очевидны, но они далеко не определяющие, ведь люди раньше решали свои задачи на WSH/CMD, пирожки продавались, бизнес шёл. С одной стороны Microsoft дал людям простор для творчества, т.е. делать в PowerShell всякие потрясающие штуки и всё такое. Но это не совсем то, что нужно было администраторам. Им нужна одна кнопка на весь экран с надписью «Сделать всё п**дато!». Пока что PowerShell и близко не готов стать такой кнопкой, а является «удочкой». Т.е. удочка у вас уже есть, а что касается конечной рыбы (результата), то дело осталось за малым — написать мега-скрипт. Мне вот интересно, что думают администраторы Exchange (поскольку пока что только они получили полноценную поддержку для своего продукта в PowerShell) — стало ли им жить легче с PowerShell или нет? Если да, то это может быть хорошим знаком, что однажды PowerShell станет такой кнопкой. И не будет более в системе certutil и всеми задачами будет рулить PowerShell (пока что это наиболее логичный сценарий развития событий). А вот если их жизнь не стала легче, то обещанной революции (которая по словам Microsoft уже наступила, как и вендекапец у луноходов) не будет, а будет просто какое-то логическое продолжение предыдущих инструментов для сценариев.&lt;/p&gt;

&lt;p&gt;К чему я написал столько букв? К тому, что я ежедневно задаю себе один и тот же вопрос: а зачем я всё это делаю? А ответ найти очень непросто, потому что отмазы вида «проще, удобней, красивее» не годятся для серьёзного аргумента. На самом деле я не ищу ответ на него, а просто говорю себе «так надо» и делаю. Поэтому не надо меня использовать как пример «правильного пользователя PowerShell» и пытаться повторить что-то подобное астрономических масштабов на овер9000 строк — поверьте, оно не стоит того. Используйте его по мере сил. Если чего-то будет не хватать и его решение потребует значительных усилий — посмотрите на готовые утилиты, они наверняка будут уметь то, что вам надо.&lt;/p&gt;

&lt;p&gt;Удачи!© One&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=2dc109a8-2a1a-4091-9a0d-eb28f4c87159"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,2dc109a8-2a1a-4091-9a0d-eb28f4c87159.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
      <category>PowerShell / Certificates</category>
      <category>PowerShell / Certificates / Active Directory</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=55c5304e-baef-4af6-bc0f-e09c214fb630</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,55c5304e-baef-4af6-bc0f-e09c214fb630.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,55c5304e-baef-4af6-bc0f-e09c214fb630.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=55c5304e-baef-4af6-bc0f-e09c214fb630</wfw:commentRss>
      <title>Active Directory PKI object management с помощью PowerShell (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,55c5304e-baef-4af6-bc0f-e09c214fb630.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,55c5304e-baef-4af6-bc0f-e09c214fb630.aspx</link>
      <pubDate>Fri, 11 Dec 2009 21:09:45 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В &lt;a href="http://www.sysadmins.lv/PermaLink,guid,dd03c789-780d-4b39-9b7b-310905ecde32.aspx"&gt;&lt;strong&gt;предыдущем посте&lt;/strong&gt;&lt;/a&gt; мы ознакомились с основными контейнерами с объектами PKI в Active Directory и смогли изучить функциональный аналог ключа dspublish в утилите certutil. Если публикация сертификатов в AD задача простая даже для Certutil, то просмотр содержимого может быть весьма нетривиальным. Например, если вы хотите посмотреть содержимое записи NTAuthCertificates, то придётся выполнить вот такую команду:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;certutil –viewstore &amp;quot;CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration, ForestRootDomainDN&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;такие вещи совершенно неприспособлены к командной строке, поскольку надо набирать много текста и ошибиться весьма просто. Одно хорошо, команда выводит графическое окошко, где мы можем посмотреть содержимое. Но тут есть несколько неудобных моментов: мы не можем посмотреть несколько контейнеров сразу, для каждого контейнера надо выполнять отдельную команду. В этом окошке мы можем только посмотреть на содержимое контейнера и всё. Ни добавить, ни удалить сертификат мы не можем. Для добавления сертификатов мы можем воспользоваться тем же certutil или моим скриптом, который был опубликован в предыдущем посте. Графика — хорошо и замечательно, но мы можем хотеть автоматизировать какие-то задачи или просто посмотреть информацию в консоли. Вы можете подумать, что это не нужно, но преимущество между консольным выводом и графическим диалоговым окном очевидное: из первого можно копировать информацию в буфер обмена. Есть ещё вариант — для просмотра и удаления сертификатов из AD, пользоваться консолью pkiview.msc. Но мы сразу же теряем главную нить — единое средство управления. Т.е. даже похожие операции мы должны выполнять в разных инструментах! Но с появлением PowerShell мы получили единый (хоть и консольный) инструмент, которым можно автоматизировать абсолютно всё! Даже сам PowerShell &lt;img alt=":)" src="/smilies/happy.gif"&gt; Вот, собственно код, который в разы упрощает процесс просмотра содержимого контейнеров:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Get-ADPKIObject&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;lt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;
.Synopsis
    Displays certificates info from Active Directory containers
.Description
    Displays info about certificates that are stored in AD PKI-related containers.
.Parameter Container
    Optional parameter. Specifies particular container to view. May contain one or
    more value from following possible values:
    
    RootCA - retrieves certificates from Certification Authorities container
    SubCA - retrieves certificates from AIA container
    NTAuthCA - retrieves certificates from NTAuthCertificate directory entry.
    
    if no parameter is set, command will return all certificates from all applicable
    containers.
.EXAMPLE
    Get-ADPKIObject RootCA
    
    Retrieves certificates from Certification Authorities container
.EXAMPLE
    Get-ADPKIObject RootCA, AIA
    
    Retrieves certificates from Certification Authorities and AIA containers
.Outputs
    Output AD PKI object collection
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;
[CmdletBinding()]
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt;([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]][ValidateSet(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;RootCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;SubCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAuthCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; объявляем массив, который будет хранить выходные объекты&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @()
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; это весьма крутая штука будет. Каждый объект будет содержать свойство Id или просто&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; порядковый номер объекта. При дальнейших операциях с этими объектами вам достаточно&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; будет указать его Id вместо длинных и неудобных LDAP/Thumpbrint значений, как это делается&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в certutil и подобных ему утилитах. Нумерацию начнём с единицы&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; итоговая функция, которая будет разбирать бинарные массивы и готовить выходные объекты&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_formatter_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; поскольку у нас все объекты в AD находятся в бинарном формате, мы импортируем каждый из них&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в X509Certificate2 объект.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Import(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;)
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; здесь мы создаём образец выходного объекта и обвязываем этот объект необходимыми свойстами и данными&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Id&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:n&lt;/span&gt;&lt;span style="color: #000000"&gt;}}, Subject, @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Type&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;}}, @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Container&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt;}},
                @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Thumbprint&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Thumbprint}}, @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;SerialNumber&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.SerialNumber}}, 
                @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;ValidFrom&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.NotBefore}}, @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;ValidTo&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.NotAfter}}, 
                @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;RawCertificate&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.RawData}}
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; чтобы не писать полный DN поля Subject, мы будем показывать только первую его часть&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; (которая отображается в самом сертификате)&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            [&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Subject &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=([^,]+)&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;)
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;span style="color: #000000"&gt;.Subject &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;[1]
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; добавляем объект в массив выходных объектов&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; очищаем X509Certificate2&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Reset()
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; увеличиваем счётчик и обрабатываем следующий элемент&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
    }
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; ещё одна суб-функция, которая выдёргивает сертификаты из AD в бинарном виде и отправляет&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; их в _formatter_, который уже сформирует итоговые объекты.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_switcher_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; подключаемся к нужному контейнеру&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;ADSI&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;LDAP://CN=$name,$script:ConfigContext&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; как мы знаем, NTAuthCertificates не является контейнером, поэтому для него код будет немного&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; отличаться. А отличие будет состоять в том, что мы не будем залезать в контейнер, а сразу читать&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; свойства объекта NTAuthCA&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAuthCertificates&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; убеждаемся, что длина первого элемента свойства cACertificate больше единицы, т.е. содержит ненулевое&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; значение. Так же проверяем свойство crossCertificatePair, которое содержит Cross-certificates&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и если оно не нулевое, то отправляем и его на формирование вывода&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.cACertificate[0].count &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-gt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @(&lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.cACertificate)
                &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_formatter_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CA Certificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt;
            }
            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.crossCertificatePair[0].count &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-gt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @(&lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.cACertificate)
                &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_formatter_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Cross CA Certificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt;
            }
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и переходим к следующему контейнеру&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если контейнер указан как Certification Authority и/или AIA, то заглядываем&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; внутрь контейнера&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.psbase.children | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и заглядываем в каждую запись на исследование свойств cACetificate и crossCertificatePair&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.cACertificate)
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$ccerts&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.crossCertificatePair)
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что свойство имеет ненулевое значение. Если так, то отправляем&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; содержимое этих свойств на формирование вывода&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt;[0].count &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-gt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_formatter_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CA Certificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$ccerts&lt;/span&gt;&lt;span style="color: #000000"&gt;[0].count &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-gt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_formatter_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$ccerts&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Cross CA Certificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt;}
        }
    }
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; конструкцией switch проверяем содержимое аргумента функции, чтобы определить какие именно&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; контейнеры надо обследовать.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;RootCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_switcher_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Certification Authorities&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;SubCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_switcher_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;AIA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAuthCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_switcher_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAuthCertificates&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если контейнер в аргументе не указан, то проверяем все контейнеры и записи&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {
            &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_switcher_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Certification Authorities&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_switcher_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;AIA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_switcher_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAUthCertificates&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
    }
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда вывод будет полностью сформирован, выбрасываем все объекты в консоль&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:sum&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; данная функция является частью файла &lt;strong&gt;dspublish.ps1&lt;/strong&gt;, т.к. использует глобально объявленные переменные.&lt;/p&gt;

&lt;p&gt;и вывод у него вот такой красивый: 
  &lt;br /&gt;&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;Id             : 3
Subject        : Contoso CA
Type           : CA Certificate
Container      : AIA
Thumbprint     : BA8FECE99165E68CE27C9F0AF5F0664FDA39F7A2
SerialNumber   : 5DD87E4CFFE3B3BC43F608EB57C767F7
ValidFrom      : 2009.02.15. 16:31:15
ValidTo        : 2014.02.15. 16:40:11
RawCertificate : {48, 130, 4, 98...}

Id             : 4
Subject        : sysadmins-LV-CA
Type           : Cross CA Certificate
Container      : AIA
Thumbprint     : 1A28B582E21803D2BFE0DAEEF4593DE372C8EC3C
SerialNumber   : 170AD11B0000000000A7
ValidFrom      : 2009.11.24. 19:43:10
ValidTo        : 2011.03.30. 17:06:53
RawCertificate : {48, 130, 7, 94...}&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;я считаю его достаточно информативным. Но если хотите посмотреть любой сертификат из этого списка, то можно и сделать просмотр. К сожалению я в программировании не шарю и как работать напрямую с библиотекой просмотрщика сертификатов, поэтому я реализовал просмотр обходным путём:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;View-ADPKIObject&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;lt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;
.Synopsis
    Displays certificates in certificate viewer
.Description
    Displays certificates in certificate viewer by selecting necessary certificates ID.
    Must be placed after Get-ADPKIObject command only.
.Parameter ID
    Specifies certificate ID that was set in Get-ADPKIObject command.
.EXAMPLE
    Get-ADPKIObject RootCA | ViewADPKIObject 1, 3
    
    displays certificate with ID = 2 in certificate viewer
.Outputs
    Script doesn't generate any output except errors
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; судя по конструкции int[] мы можем указать несколько чисел, тогда все выбранные&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сертификаты будут отображены. Номер указывать обязательно.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt;([&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$ID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; $(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;you must specify number of the object to display&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;))
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и проверяем входные объекты с конвейера на предмет их ID. Если ID совпадает с&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; одним из ID в аргументах, обрабатываем его. Если ID не совпадает, ничего не делаем.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (@(&lt;/span&gt;&lt;span style="color: #800080"&gt;$ID&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-contains&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.Id) {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; генерируем в пользовательской папке Temp временный файл с рандомным расширением&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$TempFile&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.IO.Path&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetTempFileName&lt;/span&gt;&lt;span style="color: #000000"&gt;() &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;.cer&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записываем бинарный массив сертификата в файл в виде DER кодировки&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.IO.File&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;WriteAllBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$TempFile&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.RawCertificate)
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; запускаем файл (просмоторщик сертификатов)&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &amp;amp; &lt;/span&gt;&lt;span style="color: #800080"&gt;$TempFile&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в санитарных целях ждём пол секунды&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Start-Sleep&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и удаляем этот файл, чтобы не копился мусор&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;del&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$TempFile&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Как вы видите, ничего сверх-космического или магического в этом коде нет, самое трудное здесь — придумать логику работы. А остальное — накидать несколько строк кода и у нас PowerShell в лёгкую может соперничать с certutil за право называться единой утилитой управления PKI &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;

&lt;p&gt;Чтобы подкрутить рейтинг PowerShell в этой конкуренции, в следующий раз я покажу как мы можем легко и просто удалять сертификаты из контейнеров AD с использованием PowerShell &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=55c5304e-baef-4af6-bc0f-e09c214fb630"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,55c5304e-baef-4af6-bc0f-e09c214fb630.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
      <category>PowerShell / Certificates</category>
      <category>PowerShell / Certificates / Active Directory</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=dd03c789-780d-4b39-9b7b-310905ecde32</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,dd03c789-780d-4b39-9b7b-310905ecde32.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,dd03c789-780d-4b39-9b7b-310905ecde32.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=dd03c789-780d-4b39-9b7b-310905ecde32</wfw:commentRss>
      <title>Active Directory PKI object management с помощью PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,dd03c789-780d-4b39-9b7b-310905ecde32.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,dd03c789-780d-4b39-9b7b-310905ecde32.aspx</link>
      <pubDate>Wed, 09 Dec 2009 19:35:17 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Подоспела ещё одна задачка для PowerShell'а — управление объектами PKI в Active Directory. Active Directory содержит целый раздел посвящённый PKI и вот из чего он состоит:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color="#0000ff"&gt;CN=NTAuthCertificates, CN=Public Key Services, CN=Services, CN=Configuration, &lt;em&gt;ForestRootDomain&lt;/em&gt;&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;CN={CA name},CN=AIA, CN=Public Key Services, CN=Services, CN=Configuration, &lt;em&gt;ForestRootDomain&lt;/em&gt;&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;CN={CA name},CN=CDP, CN=Public Key Services, CN=Services, CN=Configuration, &lt;em&gt;ForestRootDomain&lt;/em&gt;&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;CN={CA name},CN=Certification Authority, CN=Public Key Services, CN=Services, CN=Configuration, &lt;em&gt;ForestRootDomain&lt;/em&gt;&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Вот о них мы сегодня и поговорим. В AD есть ещё несколько контейнеров, которые связаны с PKI, но они сегодня интереса представлять не будут. Как мы уже знаем, в:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;NTAuthCertificates&lt;/strong&gt; публикуются все сертификаты CA, которые выдают сертификаты для аутентификации пользователей в домене. В том числе для логона смарт-картой, аутентификации в IIS или для аутентификации EAP-TLS в VPN. Все сертификаты в этой записи хранятся в виде массива; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;AIA&lt;/strong&gt; публикуются сертификаты промежуточных (Intermediate) CA, за счёт чего можно значительно сократить время построения цепочек сертификатов. При этом не обязательно должен содержать сертификаты CA, которые зарегистрированы в текущем лесу. Это могут быть сертификаты промежуточных CA сторонних компаний, сертификаты которых вы используете. По большому счёту сюда должны публиковаться все сертификаты; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;CDP&lt;/strong&gt; публикуются CRL списки CA для ускорения проверки сертификатов в цепочке. Так же, как и в случае с AIA не обязательно может содержать CRL'ы CA только текущего леса. Сюда могут публиковаться и CRL сторонних CA, сертификаты которых вы используете; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Certification Authority&lt;/strong&gt; публикуются сертификаты корневых CA, которым должен доверять весь лес. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Вы спросите, а зачем это всё, если то же самое можно сделать через групповые политики? Ответ тут достаточно очевиден. Дело в том, что PKI не видит границ доменов и эти сертификаты распространяются по всему лесу вместе с репликацией. Поэтому для добавления нового доверенного корневого CA вам придётся создавать одинаковую политику в каждом домене леса. И вы некоторые объекты (например CRL) не можете распространять через GPO.&lt;/p&gt;  &lt;p&gt;Какие у нас есть инструменты для управления данными контейнерами? Их у нас несколько:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;ADSIEdit.msc&lt;/strong&gt; — обеспечивает только просмотр содержимого контейнеров в AD (но сами записи там нечитабельны); &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;PKIView.msc&lt;/strong&gt; — позволяет просматривать содержимое каждого контейнера и удалять оттуда сертификаты. C использованием данной консоли мы можем добавлять сертификаты только в NTAuthCertificates. Остальные — только чтение и удаление; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;certutil&lt;/strong&gt; — интерфейс командной строки, который позволяет добавлять, просматривать контейнеры и удалять сертифакты из них. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Кажется, что certutil'а хватит всем. Но у него есть одна большая проблема — ужасный синтаксис. Напрмер, если вы хотите посмотреть CRL'ы в AD, то придётся делать что типа такого:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="left"&gt;&lt;font color="#0000ff"&gt;certutil –viewstore ldap:///CN=MyCA,CN=CRL,CN=CDP,CN=Public%20Key%        &lt;br /&gt;20Services,CN=Services,CN=Configuration,DC=contoso,DC=com?certificateRevocationList?base?objectClass=cRLDistributionPoint&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;этот синтаксис возможно чем-то универсален, но cовершенно неудобный для использования в командной строке, поэтому я поставил задачу решить этот вопрос с помощью PowerShell. И вот как я его решил:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; к сожалению я не в состоянии объяснять все особенности работы ADSI и PowerShell, поэтому для понимания работы скрипта нужно иметь представление и некоторый опыт скриптования с использованием ADSI и PowerShell.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;####################################################################&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; dspublish.ps1&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Version 0.7&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Adds certificates in Active Directory containers&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Vadims Podans (c) 2009&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://www.sysadmins.lv/&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;####################################################################&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;requires -Version 2.0&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; любая ошибка будет фатальной, поэтому при её возникновении останавливаем работу&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; скрипта, чтобы предотвратить фатальные изменения в Active Directory&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;trap&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #0000ff"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;}
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; объявляем глобальные переменные, которые будут использоваться всеми функциями скрипта&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:ConfigContext&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.DirectoryServices.ActiveDirectory.Domain&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetCurrentDomain&lt;/span&gt;&lt;span style="color: #000000"&gt;().&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetDirectoryEntry&lt;/span&gt;&lt;span style="color: #000000"&gt;().distinguishedName
&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:ConfigContext&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=Public Key Services,CN=Services,CN=Configuration,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:ConfigContext&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Publish-ADPKIObject&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;lt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;
.Synopsis
    Publishes certificates to Active Directory containers
.Description
    Publishes certificates to Public Key Services containers in Active Directory.
.Parameter File
    Specifies the path to certificate file or X509Certificate2 object.
    Certificates may be passed through pipeline.
.Parameter Container
    Specifies the AD PKI container to publish file. For certificates only
    following containers MUST be used:
    
    RootCA - indicates that certificate will be published to Certification Authorities container
    SubCA - indicates that certificate will be published to AIA container
    NTAuthCA - indicates that certificate will be added to NTAuthCertificate directory
    entry. If not exist, entry will be created.
    
    you MAY specify several containers at once. Certificate will be added to all
    specified containers. Entry names are based on certificate subject.
    
.Parameter Force
    forces object rewrite if object already exist in Active Directory
.EXAMPLE
    dir *.cer | Publish-ADPKIObject RootCA, SubCA
    
    will publish all .CER certificates to Certification Authorities and AIA containers
.EXAMPLE
    Publish-ADPKIObject certificate.cer RootCA -Force
    
    will publish 'Certificte.cer' certificate to Certification Authorities container. If
    object already exist, it will rewrited
.Outputs
    This command provide a resultant of operation.
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;
[CmdletBinding()]
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt;(
        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;, ValueFromPipeline &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;, Position &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)]
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;,
        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;, Position &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)]
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt;,
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
    )
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;begin&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; функция, которая будет осуществлять запись сертификатов в AD&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_ldaproutine_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$CN&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;ADSI&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;LDAP://$ldap&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; убеждаемся, что такой же объект не существует в AD&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; ($(&lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;.psbase.children | ?{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.cn &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$CN&lt;/span&gt;&lt;span style="color: #000000"&gt;})) {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если существует, проверяем ключ Force, который позволяет перезаписывать&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; объекты&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$force&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;ADSI&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;LDAP://CN=$CN,$ldap&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если ключ Force указан, то мы просто перезаписываем свойство&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; cACertificate новым сертификатом&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.put(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;cACertificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.RawData)
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; предыдущей строкой мы просто перезаписали объект, который теперь&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; надо записать в AD методом SetInfo()&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$retn&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetInfo()
                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$?&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;`'$CN`' certificate is sucessfully rewrited to `'$name`' container&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Green&lt;/span&gt;&lt;span style="color: #000000"&gt;}
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если объект уже существует и ключ Force не указан, то просто выводим сообщение, что такой объект уже существует&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Object already exist in `'$name`' container. Use -Force switch to rewrite&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если объект ещё не существует в указанном контейнере, то создаём в нём новый объект&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; с типом certificationAuthority&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;.Create(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;certificationAuthority&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=$CN&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записываем сертификат в свойство cACertificate в бинарном виде из объекта X509Certificate2&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt;.Put(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;cACertificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.RawData)
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записываем нулями обязательные поля, которые требуются для создания объекта. Использовать как есть.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt;.Put(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;authorityRevocationList&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt;.Put(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;certificateRevocationList&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда объект сформирован, записываем его в AD&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$retn&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetInfo()
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$?&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;`'$CN`' certificate is sucessfully added to `'$name`' container&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Green&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            }
        }
    }
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; рабочая секция, которая будет разбирать входные сертификаты и подготавливать необходимые данные&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; которые необходимы для записи &lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;process&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выбираем текущий объект сертификата&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ErrorAction&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Stop&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что объект не является готовым объектом X509Certificate2&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-isnot&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/span&gt;&lt;span style="color: #000000"&gt;]) {
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если не является, то это будет файл. Проверяем расширение файла.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; допускаются только расширения CER и CRT&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;.cer&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;.crt&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-contains&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt;.Extension) {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если это CER или CRT файл, то конвертируем его в объект X509Certificate2&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Import(&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName)
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в переменную $CN записываем первую часть поля Subject сертификата&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                [&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Subject &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=([^,]+)&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$CN&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;[1]
            }
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если у нас на конвейер или через аргументы поступил готовый X509Certificate2, то только выбираем&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; поле Subject в отдельную переменную.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt;
            [&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Subject &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=([^,]+)&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;)
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$CN&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;[1]
        }
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем аргументы, которые указывают на контейнеры, куда надо записывать наши сертификаты.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; я не делал проверку этих контейнеров в секции param() через использование ValidateSet&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; поскольку данная функция в будущем будет использоваться и для публикации CRL. А для&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; них нужно вручную прописывать имя записи в контейнере CDP и оно может быть произвольным.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; отфильтровываем все неправильные контейнеры, которые были заданы при вызове функции&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt; | ?{&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;RootCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;SubCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAuthCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-contains&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;}
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если после фильтрации ни одного валидного контейнера не осталось, то очень сильно ругаемся.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;For certificate containers only following values are applicable: RootCA, SubCA, NTAuthCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что входной сертификат содержит свойство CertificateAuthority равным True.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; это свойство соответствует расширению Basic Constraints в сертификате, которое может иметь&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; значения: Subject Type=CA - это сертификат CA и Subject Type=End entity, если это конечный&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сертификат. А в X509Certificate2 конечный сертификат будет иметь значение False в свойстве&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; CertificateAuthority. Но работу скрипта не прерываем, а просто пропускаем текущий сертификат.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Extensions | ?{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.CertificateAuthority &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;}) {
            &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Input certificate `'$CN`' is not recognized as CA certificate. Skipping&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; а теперь подготавливаем необходимые данные для записи в зависимости от названия контейнера&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Container&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;RootCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; указываем название данного контейнера в AD&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Certification Authorities&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; получаем LDAP объект этого контейнера&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=$name,$script:ConfigContext&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и отправляем всё это в функцию записи&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_ldaproutine_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$CN&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Reset()
            }
            &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;SubCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; здесь то же самое, что и для RootCA&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;AIA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=$name,$script:ConfigContext&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_ldaproutine_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$CN&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Reset()
            }
            &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAuthCA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;NTAuthCertificates&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;ADSI&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;LDAP://CN=$name,$script:ConfigContext&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; поскольку NTAuthCertificates не является контейнером, а отдельной&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записью, которая содержит массив сертификатов, то правила записи&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; здесь немного иные. Сначала проверяем, что эта запись уже существует в AD.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.cn) {
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если нет, то создаём её&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;ADSI&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;LDAP://$script:ConfigContext&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;).Create(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;certificationAuthority&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CN=$name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; заполняем обязательные свойства объекта и первый сертификат.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt;.Put(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;authorityRevocationList&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt;.Put(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;certificateRevocationList&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)
                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt;.put(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;cACertificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.RawData)
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда объект уже готов, то просто записываем его в AD&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$retn&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$CA&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetInfo()
                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$?&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;`'$CN`' certificate is sucessfully added to `'$name`' container&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Green&lt;/span&gt;&lt;span style="color: #000000"&gt;}
                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;
                }
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; а вот если эта запись уже есть, то ничего создавать не надо, а просто добавляем&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; новый сертификат вдобавок к существующим. При этом обратите внимание, что объект добавляется&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; как массив (используется запятуя сразу за оператором). Это связано с особенностью работы PowerShell с&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; массивами. Поскольку бинарный сертификат сам по себе является массивом, то при простом добавлении&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; к существующему бинарному массиву, просто сделает ресайз текущего массива. Чтобы новый массив&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записать как отдельный элемент нового массива - надо при помощи запятой явно это указать&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.cACertificate &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; ,&lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.RawData
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и записываем объект обратно в AD.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$retn&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$ldap&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetInfo()
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$?&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;`'$CN`' certificate is sucessfully added to `'$name`' container&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Green&lt;/span&gt;&lt;span style="color: #000000"&gt;}
                &lt;/span&gt;&lt;span style="color: #800080"&gt;$script:Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Reset()
            }
        }
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;А примеры использования этого скрипта приведены во встроенном хелпе и сводятся к одной из схем:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;Publish-ADPKIObject &amp;lt;certificate&amp;gt; &amp;lt;container&amp;gt; –Force
      &lt;br /&gt;&amp;lt;certificate&amp;gt; | Publish-ADPKIObject –Force&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Причём вы можете указывать несколько контейнеров сразу, например: &lt;font color="#0000ff"&gt;Publish-ADPKIObject file.cer NTAuthCA, RootCA, SubCA&lt;/font&gt;. Я думаю, что этот скрипт получился не такой уж и сложный и его разобрать с помощью моих комментариев не так и сложно. Его можно спокойно расширить под другие контейнеры, например, CDP или KRA. Единственное, что здесь пока не реализовано — санитизация имён объектов. На сколько я знаю, certutil этого тоже не поддерживает. Но сделать её надо. Правда, я пока не нашёл ни одного стандартного механизма, который бы санитизировал имена &lt;img alt=":'(" src="/smilies/unhappy.gif"&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=dd03c789-780d-4b39-9b7b-310905ecde32"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,dd03c789-780d-4b39-9b7b-310905ecde32.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
      <category>PowerShell / Certificates</category>
      <category>PowerShell / Certificates / Active Directory</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=eabb97f4-c14f-41ef-bc4c-c3df83ecd98f</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,eabb97f4-c14f-41ef-bc4c-c3df83ecd98f.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,eabb97f4-c14f-41ef-bc4c-c3df83ecd98f.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=eabb97f4-c14f-41ef-bc4c-c3df83ecd98f</wfw:commentRss>
      <title>CryptoAPI и управление Certification Authority с помощью PowerShell (часть 4)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,eabb97f4-c14f-41ef-bc4c-c3df83ecd98f.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,eabb97f4-c14f-41ef-bc4c-c3df83ecd98f.aspx</link>
      <pubDate>Fri, 20 Nov 2009 16:40:36 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В продолжении темы исследования COM интерфейсов CryptoAPI для управления службами Certificate Services предлагаю теперь разобрать вопросы KRA — Key Recovery Agents. Сначала напомню уже изученные темы по CryptoAPI:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,1cec0947-9113-4de2-bf48-809a09849f4c.aspx"&gt;&lt;strong&gt;CryptoAPI и управление Certification Authority с помощью PowerShell&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,ca3a2177-92b3-46af-bc7b-0497cdbce74e.aspx"&gt;&lt;strong&gt;CryptoAPI и управление Certification Authority с помощью PowerShell (часть 2)&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,26d5addd-f057-4e3f-8a71-a4ed0f01a836.aspx"&gt;&lt;strong&gt;CryptoAPI и управление Certification Authority с помощью PowerShell (часть 3)&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;И на сегодня наш план выглядит достаточно интересно:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Получение списка доступных KRA в лесу и просмотр их сертификатов &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Получение списка KRA назначенных на сервере CA; &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Назначение новых KRA для CA.&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h1 align="center"&gt;Получение списка доступных KRA в лесу&lt;/h1&gt;  &lt;p&gt;KRA используется для архивирования закрытых ключей сертификатов в БД CA. В случае если пользователь уничтожил свой закрытый ключ он может его восстановить. Для этого нужно обратиться к администратору CA для извлечения &lt;strong&gt;BLOB&lt;/strong&gt; (&lt;em&gt;Binary Large OBject&lt;/em&gt;) в файл. После чего агент восстановления (&lt;strong&gt;KRA&lt;/strong&gt;) использует свой закрытый ключ для расшифровки закрытого ключа из BLOB'а. Учитывая, что я и не только уже рассматривали этот вопрос, я не буду пересказывать принцип работы Key Archival:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,a13d0c06-3608-42d9-b11e-0aef08354dd8.aspx"&gt;&lt;strong&gt;EFS и смарт-карты в Windows Server 2008 (часть 2)&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,8b5e58cc-9017-4575-9c9c-17dd81c25866.aspx"&gt;&lt;strong&gt;EFS и смарт-карты в Windows Server 2008 (часть 3)&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.technet.com/pki/archive/2009/08/07/understanding-key-archival.aspx"&gt;&lt;strong&gt;Understanding Key Archival&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Все сертификаты KRA публикуются в forest naming configuration context партиции AD и реплицируется между всеми контроллерами в лесу. Публикация просисходит в точке:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;CN=KRA, CN=Public Key Services, CN=Services, CN=Configuration, DC=ForestRootDomain&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;div style="width: 935px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $ldap = [ADSI]&amp;quot;LDAP://CN=KRA, CN=Public Key Services, CN=Services, CN=Configuration, DC=contoso,dc=com&amp;quot;
PS C:\&amp;gt; $ldap

distinguishedName
-----------------
{CN=KRA,CN=Public Key Services,CN=Services,CN=Configuration,DC=contoso,DC=com}


PS C:\&amp;gt; $kra = $ldap.psbase.children | %{$_}
PS C:\&amp;gt; $kra

distinguishedName
-----------------
{CN=contoso-DC2-CA,CN=KRA,CN=Public Key Services,CN=Services,CN=Configuration,DC=contoso,DC=com}
{CN=Contoso CA,CN=KRA,CN=Public Key Services,CN=Services,CN=Configuration,DC=contoso,DC=com}&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Мы получили список CA в лесу и посмотрев каждый из них можем посмотреть сколько KRA сертификатов выпустил каждый CA:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $kra[1] | fl *


objectClass            : {top, msPKI-PrivateKeyRecoveryAgent}
cn                     : {Contoso CA}
userCertificate        : {48 130 6 104 48 130 5 80 160 3 2 1 2 2 10 21 29 22 96 0 0 0 0 0 4 48 13 6 9 42 134 72 134 247
                          13 1 1 5 5 0 48 67 49 19 48 17 6 10 9 146 38 137 147 242 44 100 1 25 22 3 99 111 109 49 23 48
                          21 6 10 9 146 38 137 147 242 44 100 1 25 22 7 99 111 110 116 111 115 111 49 19 48 17 6 3 85 4
                          3 19 10 67 111 110 116 111 115 111 32 67 65 48 30 23 13 48 57 48 50 49 53 49 53 48 53 50 53 9
                         0 23 13 49 49 48 50 49 53 49 53 48 53 50 53 90 48 86 49 19 48 17 6 10 9 146 38 137 147 242 44
                         100 1 25 22 3 99 111 109 49 23 48 21 6 10 9 146 38 137 147 242 44 100 1 25 22 7 99 111 110 116
&amp;lt;...&amp;gt;
&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Свойство &lt;strong&gt;UserCertificate&lt;/strong&gt; в виде массива может содержать сертификаты KRA в виде байтового массива. Например, указанный CA выпустил 2 сертификата KRA:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $kra[1].usercertificate.count
2&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;И обратившись к индексам этого свойства можно получить конкретные сертификаты: $kra[1].usercertificate[0]. Если CA не выпускал сертификаты для KRA, то свойство UserCertificate будет содержать число ноль:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $kra[0] | fl *


objectClass            : {top, msPKI-PrivateKeyRecoveryAgent}
cn                     : {contoso-DC2-CA}
userCertificate        : {0}
&amp;lt;...&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Поэтому для получения всех сертификатов KRA нужно пройтись по всем членам CN=KRA и выбрать из них ненулевые значения свойства UserCertificate. Если сертификатов больше, чем 1, то они будут храниться в этом свойстве в виде массива. Чтобы посмотреть сам сертификат, вы можете просто сохранить этот массив байтов в файл:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; [System.IO.File]::WriteAllBytes(&amp;quot;C:\kra.cer&amp;quot;,$kra[1].usercertificate[1])
PS C:\&amp;gt; &amp;amp; .\kra.cer&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;h1 align="center"&gt;Получение списка KRA назначенных на сервере CA&lt;/h1&gt;

&lt;p&gt;А теперь вернёмся к интерфейсу ICertAdmin2. С его помощью мы можем посмотреть количество агентов восстановления, которые назначены на CA и посмотреть их сертификаты. Однако, этот интерфейс имеет какой-то баг с PropID, которые связаны с KRA, о которых я писал в &lt;a href="http://www.sysadmins.lv/PermaLink,guid,26d5addd-f057-4e3f-8a71-a4ed0f01a836.aspx"&gt;&lt;strong&gt;предыдущей статье&lt;/strong&gt;&lt;/a&gt;, поэтому для получения этих данных мы будем использовать интерфейс &lt;a href="http://msdn.microsoft.com/en-us/library/ee373776(VS.85).aspx"&gt;&lt;strong&gt;ICertRequest3&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $CertRequest = New-Object -ComObject CertificateAuthority.Request.1
PS C:\&amp;gt; $CertRequest.GetCAProperty(&amp;quot;dc1\contoso ca&amp;quot;,0x18,0,1,0)
1
PS C:\&amp;gt; $CertRequest.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x18,0,1,0)
0
PS C:\&amp;gt; $CertRequest.GetCAProperty(&amp;quot;dc1\contoso ca&amp;quot;,0x19,0,1,0)
1
PS C:\&amp;gt; $CertRequest.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x19,0,1,0)
0&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Мы видим, что на сервере DC1 назначен 1 агент восстановления, а на DC2 ни одного. Сегодня мы добавим агентов восстановления на DC2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; чем отличаются &lt;strong&gt;KRACERTUSEDCOUNT&lt;/strong&gt; и &lt;strong&gt;KRACERTCOUNT&lt;/strong&gt;? KRACERTCOUNT показывает сколько всего KRA назначено на конкретном сервере CA. А KRACERTUSEDCOUNT показывает сколько из них будет использовать CA при архивации каждого закрытого ключа сертификата и это число может быть меньше, чем общее количество сертификатов KRA. В таком случае CA рандомно выбирает KRACERTUSEDCOUNT сертификатов и шифрует ими закрытый ключ. Например, KRACERTCOUNT = 5, а KRACERTUSEDCOUNT = 3, то CA при архивации ключа выберет рандомно 3 сертификата KRA из списка и зашифрует ими ключ. И только эти 3 агента восстановления могут восстановить ключ, а остальные 2 уже не смогут.&lt;/p&gt;

&lt;h1 align="center"&gt;&lt;strong&gt;Получение списка KRA назначенных на сервере CA&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;Чтобы посмотреть сами сертификаты KRA, мы должны воспользоваться &lt;strong&gt;PropID = CR_PROP_KRACERT (0x1A)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;И вот что мы увидим:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $CertAdmin.GetCAProperty(&amp;quot;dc1\contoso ca&amp;quot;,0x1A,0,3,0)
-----BEGIN CERTIFICATE-----
MIIGaDCCBVCgAwIBAgIKFR0WYAAAAAAABDANBgkqhkiG9w0BAQUFADBDMRMwEQYK
CZImiZPyLGQBGRYDY29tMRcwFQYKCZImiZPyLGQBGRYHY29udG9zbzETMBEGA1UE
AxMKQ29udG9zbyBDQTAeFw0wOTAyMTUxNTA1MjVaFw0xMTAyMTUxNTA1MjVaMFYx
EzARBgoJkiaJk/IsZAEZFgNjb20xFzAVBgoJkiaJk/IsZAEZFgdjb250b3NvMQ4w
DAYDVQQDEwVVc2VyczEWMBQGA1UEAxMNQWRtaW5pc3RyYXRvcjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAJG7T5yMninhrkXFQU8WGUr5BYYUeOz10Rkn
&amp;lt;...&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;В нулевом индексе мы видим первый сертификат. Последующие будут храниться в других индексах:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;$CertAdmin.GetCAProperty(&amp;quot;dc1\contoso ca&amp;quot;,0x1A,$Index,3,0)&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Этот сертификат можно спокойно записать в файл и через GUI просмотреть его свойства. Но вообще это не родной формат сертификата KRA для данного интерфейса, поскольку добавлять сертификаты KRA на сервере CA нужно в &lt;strong&gt;ASN1 DER-encoded string&lt;/strong&gt; формате. Т.е. &lt;strong&gt;Flags&lt;/strong&gt; должен быть не 0, а 2:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;$CertAdmin.GetCAProperty(&amp;quot;dc1\contoso ca&amp;quot;,0x1A,$Index,3,&lt;strong&gt;2&lt;/strong&gt;)&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;и увидим примерно такое:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $kra = $CertAdmin.GetCAProperty(&amp;quot;dc1\contoso ca&amp;quot;,0x1a,0,3,2)
PS C:\&amp;gt; $kra
?????A???`  ?????c?♣??????????????????T???????????????????????????????????????T????????????????????????????????????????
??ca♣??????☺???????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????☺????????Є?????????????????☻???????☻??????????????ЎЖ?????????????CA??????Ё????????????h??A???????
??????????????????????????????????????????????╣????????????????????????????????????????????????????????????????????????
?????????????????????C?cЁ??????C???????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????Х???CA?????Ё???????CA?????Б????CA??????????????????????a???☺????????????????????
????????????????????????????????????c?????????????????????????????????????H╝??????????????????{?????????????&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;выглядит весьма уныло, но вот в таком формате и надо записывать сертификаты агентов восстановления в CA.&lt;/p&gt;

&lt;h1 align="center"&gt;Назначение новых KRA для CA&lt;/h1&gt;

&lt;p&gt;Когда мы рассмотрели основные моменты связанные с агентами восстановления в контексте CryptoAPI, мы можем приступить к финальной части — назначению новых агентов восстановления. В принципе, здесь нет ничего сложного, поскольку для добавления KRA нужно сделать 5 вещи:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Получить массив байтов, которые бы представляли сертификат агента восстановления откуда угодно. Хоть из AD, хоть из файла сертификата; &lt;/li&gt;

  &lt;li&gt;Используя специальный конвертер, разобрать этот массив на пары байтов, сконвертировать эти пары в little-endian hex строку, получить десятичное представление этой hex-строки и получить итоговую символьную строку; &lt;/li&gt;

  &lt;li&gt;Записать эту строку используя метод SetCAProperty(); &lt;/li&gt;

  &lt;li&gt;Задать новое количество используемых агентов восстановления; &lt;/li&gt;

  &lt;li&gt;Перезапустить службу CA. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Первый этап у нас уже пройден, поскольку у нас уже есть такой массив в AD. Если сертификата агента восстановления нет в AD, то можно его получить из файла:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Import&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;.\desktop\kra.cer&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;RawData&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и переменная $bytes будет содержать такой же байтовый массив.&lt;/p&gt;

&lt;p&gt;А вот с конвертером чуть сложнее. Я не нашёл ни одного готового конвертера, который бы выполнял все шаги из пункта 2, поэтому я написал свой конвертер с блек-джеком и шлюхами:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;ConvertTo-DERstring&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём объект StringBuilder, который нам будет собирать конечную символьную строку&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$SB&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Text.StringBuilder&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; преобразовываем каждый байт в его hex значение&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;{0:X2}&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-f&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; циклом перебираем каждую пару байт&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes1&lt;/span&gt;&lt;span style="color: #000000"&gt;.count; &lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; переставляем элементы пары местами, чтобы получить little-endian hex-строку&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; после чего получаем десятичное представление этой строки и получаем Unicode&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; символ, который соответствует этому десятичному значению.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        [&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$SB&lt;/span&gt;&lt;span style="color: #000000"&gt;.Append([&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Invoke-Expression&lt;/span&gt;&lt;span style="color: #000000"&gt; 0x$((&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes1&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;]) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes1&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt;]))))
    }
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$SB&lt;/span&gt;&lt;span style="color: #000000"&gt;.ToString()
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;А дальше уже по накатанной дороге:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;[Administrator] # создаём COM объект ICertAdmin2
[Administrator] $CertAdmin = new-object -com certificateauthority.admin.1
[Administrator] # выбираем все Enterprise CA
[Administrator] $ldap = [ADSI]&amp;quot;LDAP://CN=KRA, CN=Public Key Services, CN=Services, CN=Configuration, DC=contoso,dc=com&amp;quot;
[Administrator] $kra = $ldap.psbase.children | %{$_}
[Administrator] # сразу конвертируем все сертификаты в DER-encoded string
[Administrator] $kra1 = ConvertTo-DERstring $kra[1].usercertificate[0]
[Administrator] $kra2 = ConvertTo-DERstring $kra[1].usercertificate[1]
[Administrator] # можем убедиться на месте, что строка имеет ожидаемый вид
[Administrator] $kra2
?????A???E  ?????c?♣??????????????????T???????????????????????????????????????T????????????????????????????????????????
??ca♣??????☺????????????????????????????K?????????????????????????????????????????????т????????????????????????????????
??????????????????????☺????????Є?????????????????☻???????☻??????????????ЎЖ?????????????CA??????Ё????????????h??A???????
??????????????????????????????????????????????╣????????????????????????????????????????????????????????????????????????
?????????????????????C?cЁ??????C???????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????Х???CA?????Ё???????CA?????Б????CA??????????????????????a???☺????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????
[Administrator] # и записываем первую строку сертификат агента восстанвовления в нулевой индекс
[Administrator] $CertAdmin.SetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x1a,0,3,$kra1)
[Administrator] # все последующие строки сертификатов записываются в последующие индексы массива
[Administrator] $CertAdmin.SetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x1a,1,3,$kra2)
[Administrator] # используем PropID = KRACERTUSEDCOUNT (0x18), чтобы сказать сколько у нас будет использоваться агентов
[Administrator] # я буду их использовать все
[Administrator] $CertAdmin.SetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x18,0,1,2)
[Administrator] # перезапускаем службу CertSvc
[Administrator] $wmi = gwmi win32_service -comp dc2 -filter &amp;quot;name='certsvc'&amp;quot;
[Administrator] [void]$wmi.StopService()
[Administrator] [void]$wmi.StartService()
[Administrator] # и проверяем нашу работу:
[Administrator] $CertReq = new-object -com certificateauthority.request.1
[Administrator] $CertReq.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x18,0,1,0)
2
[Administrator] $CertReq.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x19,0,1,0)
2
[Administrator]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;всё.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=eabb97f4-c14f-41ef-bc4c-c3df83ecd98f"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,eabb97f4-c14f-41ef-bc4c-c3df83ecd98f.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
      <category>PowerShell / CryptoAPI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=26d5addd-f057-4e3f-8a71-a4ed0f01a836</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,26d5addd-f057-4e3f-8a71-a4ed0f01a836.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,26d5addd-f057-4e3f-8a71-a4ed0f01a836.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=26d5addd-f057-4e3f-8a71-a4ed0f01a836</wfw:commentRss>
      <title>CryptoAPI и управление Certification Authority с помощью PowerShell (часть 3)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,26d5addd-f057-4e3f-8a71-a4ed0f01a836.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,26d5addd-f057-4e3f-8a71-a4ed0f01a836.aspx</link>
      <pubDate>Mon, 16 Nov 2009 16:04:48 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Update 05.12.2009:&lt;/FONT&gt;&lt;/STRONG&gt; разработчики подтвердили баг в ICertAdmin2 интерфейсе. Проблема заключается&amp;nbsp;в том, что после первого запроса указанных PropID они кешируются и при смене контекста конфигурации (Certification Authority), этот кеш не очищается.&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;Прежде чем продолжать исследование CryptoAPI COM интерфейсов, предлагаю посмотреть несколько полезных ссылок и поговорить о багах в интерфейсе &lt;STRONG&gt;ICertAdmin2&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;При использовании интерфейса ICertAdmin2, ICertRequest2D (этот интерфейс мы ещё посмотрим в будущих постах) мы используем различные аргументы для получения свойст CA с использованием метода &lt;STRONG&gt;GetCAProerty()&lt;/STRONG&gt;. И вот их где мы можем получить числовые значения этих аргументов:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;PropID&lt;/STRONG&gt; и &lt;STRONG&gt;PropType&lt;/STRONG&gt; — &lt;A href="http://msdn.microsoft.com/en-us/library/cc249749(PROT.10).aspx" target=_blank&gt;&lt;STRONG&gt;3.2.1.4.3.2 ICertRequestD2::GetCAProperty (Opnum 7)&lt;/STRONG&gt;&lt;/A&gt; 
&lt;LI&gt;&lt;STRONG&gt;Flags&lt;/STRONG&gt; — &lt;A href="http://msdn.microsoft.com/en-us/library/aa374936(VS.85).aspx" target=_blank&gt;&lt;STRONG&gt;EncodingType Enumeration&lt;/STRONG&gt;&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;А теперь поговорим о багах. Как выяснилось, &lt;STRONG&gt;ICertAdmin2::GetCAProperty()&lt;/STRONG&gt;, который определён в библиотеке &lt;EM&gt;certadm.dll&lt;/EM&gt; имеет баги с PropID, которые связаны с количественной информацией. Будь то количество сертификатов CA, количество агентов восстановления ключей (&lt;STRONG&gt;Key Recovery Agents&lt;/STRONG&gt;) и т.д. И вот в чём это выражается:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;DC1&lt;/STRONG&gt; — корневой CA с именем Contoso CA. Имеет 2 сертификата CA и одного назначенного агента восстановления; 
&lt;LI&gt;&lt;STRONG&gt;DC2&lt;/STRONG&gt; — подчинённый CA с именем Contoso-DC2-CA. Имеет 1 сертификат CA и ни одного назначенного агента восстановления. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Мы будем получать данные как с локального CA, так и с удалённого CA запуская код с каждого сервера. Кратко об используемых PropID:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;0x0B&lt;/STRONG&gt; — количество сертификатов CA; 
&lt;LI&gt;&lt;STRONG&gt;0x19&lt;/STRONG&gt; — общее количество агентов восстановления на CA; 
&lt;LI&gt;&lt;STRONG&gt;0x18&lt;/STRONG&gt; — общее количество используемых агентов восстановления; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;И вот какие результаты мы видим, когда собираем эти свойства с сервера &lt;STRONG&gt;DC1&lt;/STRONG&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;[Administrator] # создаём COM объек:
[Administrator] $CertAdmin = New-Object -com CertificateAuthority.Admin.1
[Administrator] # получаем список сертификатов CA на локальном серве
[Administrator] # мы видим 2 сертификата, как положено
[Administrator] $certadmin.GetCAProperty("dc1\contoso ca",0xb,0,1,0)
2
[Administrator] # и он то же самое показывает и для удалённого сервера, хотя там всего 1 сертификат
[Administrator] $certadmin.GetCAProperty("dc2\contoso-dc2-ca",0xb,0,1,0)
2
[Administrator] # ладно, смотрим, сколько всего KRA у нас на локальном сервере. Их 1, как на самом деле
[Administrator] $certadmin.GetCAProperty("dc1\contoso ca",0x19,0,1,0)
1
[Administrator] # используемых сертификатов тоже 1.
[Administrator] $certadmin.GetCAProperty("dc1\contoso ca",0x18,0,1,0)
1
[Administrator] # как я уже говорил, на DC2 нет агентов восстановления, хотя метод показывает их по одному в обоих случаях
[Administrator] $certadmin.GetCAProperty("dc2\contoso-dc2-ca",0x19,0,1,0)
1
[Administrator] $certadmin.GetCAProperty("dc2\contoso-dc2-ca",0x18,0,1,0)
1
[Administrator]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;собираем ту же информацию, запуская код с сервера &lt;STRONG&gt;DC2&lt;/STRONG&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;PS C:\&amp;gt; # создаём COM объект:
PS C:\&amp;gt; $CertAdmin = New-Object -com CertificateAuthority.Admin.1
PS C:\&amp;gt; # получаем список сертификатов CA с локального сервера.
PS C:\&amp;gt; # их мы видим ровно 1, как и должно быть
PS C:\&amp;gt; $certadmin.GetCAProperty("dc2\contoso-dc2-ca",0xb,0,1,0)
1
PS C:\&amp;gt; # в предыдущем примере мы видели, что на DC1 2 сертификата CA.
PS C:\&amp;gt; # проверим, так ли это?
PS C:\&amp;gt; $certadmin.GetCAProperty("dc1\contoso ca",0xb,0,1,0)
1
PS C:\&amp;gt; # wow! обломс, метод возвращает тоже 1. А сколько у нас агентов восстановления?
PS C:\&amp;gt; # и снова облом. На сервере DC1 нет агентов восстановления (хотя предыдущий пример говорит об обратном):
PS C:\&amp;gt; $certadmin.GetCAProperty("dc1\contoso ca",0x19,0,1,0)
0
PS C:\&amp;gt; $certadmin.GetCAProperty("dc1\contoso ca",0x18,0,1,0)
0&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;а теперь посмотрим на результаты с использованием того же метода и тех же PropID, но с использованием интерфейса ICertRequest, который определён в библиотеке &lt;EM&gt;certcli.dll&lt;/EM&gt;. Те же тесты уже возвращают правильные результаты:&lt;/P&gt;
&lt;P&gt;с &lt;STRONG&gt;DC1&lt;/STRONG&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;[Administrator] $request = New-Object -com CertificateAuthority.Request.1
[Administrator] $request.GetCAProperty("dc1\contoso ca",0xb,0,1,0)
2
[Administrator] $request.GetCAProperty("dc2\contoso-dc2-ca",0xb,0,1,0)
1
[Administrator] $request.GetCAProperty("dc1\contoso ca",0x19,0,1,0)
1
[Administrator] $request.GetCAProperty("dc1\contoso ca",0x18,0,1,0)
1
[Administrator] $request.GetCAProperty("dc2\contoso-dc2-ca",0x19,0,1,0)
0
[Administrator] $request.GetCAProperty("dc2\contoso-dc2-ca",0x18,0,1,0)
0
[Administrator]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;с &lt;STRONG&gt;DC2&lt;/STRONG&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;PS C:\&amp;gt; $request = New-Object -com CertificateAuthority.Request.1
PS C:\&amp;gt; $request.GetCAProperty("dc2\contoso-dc2-ca",0xb,0,1,0)
1
PS C:\&amp;gt; $request.GetCAProperty("dc1\contoso ca",0xb,0,1,0)
2
PS C:\&amp;gt; $request.GetCAProperty("dc1\contoso ca",0x19,0,1,0)
1
PS C:\&amp;gt; $request.GetCAProperty("dc1\contoso ca",0x18,0,1,0)
1
PS C:\&amp;gt; $request.GetCAProperty("dc2\contoso-dc2-ca",0x19,0,1,0)
0
PS C:\&amp;gt; $request.GetCAProperty("dc2\contoso-dc2-ca",0x18,0,1,0)
0
PS C:\&amp;gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Поэтому следует с осторожностью относиться к выводу &lt;STRONG&gt;ICertAdmin2::GetCAProperty()&lt;/STRONG&gt;, а ещё лучше — использовать этот метод, который реализован в интерфейсе &lt;A href="http://msdn.microsoft.com/en-us/library/aa385043(VS.85).aspx" target=_blank&gt;&lt;STRONG&gt;ICertRequest::GetCAProperty()&lt;/STRONG&gt;&lt;/A&gt;. Чем это вызвано я пока не знаю, но задал я задал вопрос нужным людям, поэтому я дам знать в случае ответа на вопрос.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=26d5addd-f057-4e3f-8a71-a4ed0f01a836"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,26d5addd-f057-4e3f-8a71-a4ed0f01a836.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
      <category>PowerShell / CryptoAPI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=ca3a2177-92b3-46af-bc7b-0497cdbce74e</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,ca3a2177-92b3-46af-bc7b-0497cdbce74e.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,ca3a2177-92b3-46af-bc7b-0497cdbce74e.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=ca3a2177-92b3-46af-bc7b-0497cdbce74e</wfw:commentRss>
      <title>CryptoAPI и управление Certification Authority с помощью PowerShell (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,ca3a2177-92b3-46af-bc7b-0497cdbce74e.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,ca3a2177-92b3-46af-bc7b-0497cdbce74e.aspx</link>
      <pubDate>Tue, 10 Nov 2009 16:04:48 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В &lt;a href="http://www.sysadmins.lv/PermaLink,guid,1cec0947-9113-4de2-bf48-809a09849f4c.aspx"&gt;&lt;strong&gt;первой части&lt;/strong&gt;&lt;/a&gt; управления Certification Authority (CA) мы рассмотрели метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa383238(VS.85).aspx"&gt;&lt;strong&gt;GetCAProperty&lt;/strong&gt;&lt;/a&gt;, при помощи которого мы можем получать различные сведения про сервер CA. Сегодня мы посмотрим ещё несколько интересных моментов, которые будут связаны с CRL и опять будет немного треша с CryptoAPI, а именно:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Получение статуса публикации CRL; &lt;/li&gt;    &lt;li&gt;Получение Base и Delta CRL из CA в виде файлов; &lt;/li&gt;    &lt;li&gt;Отзыв сертификатов; &lt;/li&gt;    &lt;li&gt;Извлечение сертификатов из CRL; &lt;/li&gt;    &lt;li&gt;Публикация новых CRL. &lt;/li&gt; &lt;/ul&gt;  &lt;h1 align="center"&gt;Начало работы&lt;/h1&gt;  &lt;p&gt;Для начала мы должны будем создать &lt;a href="http://msdn.microsoft.com/en-us/library/aa383234(VS.85).aspx"&gt;&lt;strong&gt;ICertAdmin2&lt;/strong&gt;&lt;/a&gt; COM объект для управления CA, который будет использоваться нами для всех сегодняшних операций:&lt;/p&gt;  &lt;div style="width: 935px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $CertAdmin = New-Object -ComObject &amp;quot;CertificateAuthority.Admin.1&amp;quot;
&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;h1 align="center"&gt;Получение Base и Delta CRL из CA в виде файлов&lt;/h1&gt;

&lt;p&gt;Далее мы должны узнать PropID, который бы отвечал за показ CRL вот по этой ссылке: &lt;a href="http://msdn.microsoft.com/en-us/library/cc249749(PROT.10).aspx"&gt;&lt;strong&gt;3.2.1.4.2.2 ICertRequestD2::GetCAProperty (Opnum 7)&lt;/strong&gt;&lt;/a&gt;. Нас будет интересовать 2 этих ID: &lt;strong&gt;CR_PROP_BASECRL (0x11)&lt;/strong&gt; и &lt;strong&gt;CR_PROP_DELTACRL (0x12)&lt;/strong&gt;. Поскольку тип возвращаемых данных будет &lt;strong&gt;Binary&lt;/strong&gt;, то &lt;strong&gt;PropType&lt;/strong&gt; будет равен 3, а &lt;strong&gt;Flags&lt;/strong&gt; выставим в 0 (Base64CRLHeader). Можно и другой указать, от этого только зависит метод записи в файл.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; напоминаю, что индекс &lt;strong&gt;PropType&lt;/strong&gt; начинается с 1, а &lt;strong&gt;Flags&lt;/strong&gt; с 0 и их возможные значения описаны здесь: &lt;a href="http://msdn.microsoft.com/en-us/library/aa383238(VS.85).aspx"&gt;&lt;strong&gt;GetCAProperty&lt;/strong&gt;&lt;/a&gt;. А так же то, что в Flags первые 2 значения перепутаны местами на MSDN.&lt;/p&gt;

&lt;p&gt;И вот как мы их можем получить:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $BaseCRL =  $certadmin.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x11,0,3,0)
PS C:\&amp;gt; $BaseCRL
-----BEGIN X509 CRL-----
MIIEDTCCAvUCAQEwDQYJKoZIhvcNAQEFBQAwRzETMBEGCgmSJomT8ixkARkWA2Nv
bTEXMBUGCgmSJomT8ixkARkWB2NvbnRvc28xFzAVBgNVBAMTDmNvbnRvc28tREMy
LUNBFw0wOTExMDkwNjI0NDlaFw0wOTExMTcwNjQ0NDlaMIIBzDAbAgpG7E9iAAAA
AACSFw0wOTExMDgxODM5MDBaMCkCCm716aoAAAAAAI8XDTA5MTAyMjE2MjI1OVow
DDAKBgNVHRUEAwoBBDAbAgpxOBcQAAAAAACLFw0wOTA5MjgwNjMzMDBaMBsCCl6/
ZbYAAAAAAIkXDTA5MDkyNDE3MTcwMFowGwIKXnVZiQAAAAAAiBcNMDkwOTI0MTUw
MjAwWjApAgoggMu3AAAAAAAVFw0wOTA1MTcyMDE0MDBaMAwwCgYDVR0VBAMKAQUw
KQIKYRZ2nAAAAAAADRcNMDkwNTAxMTk1MzAwWjAMMAoGA1UdFQQDCgEFMCkCCmJ0
33IAAAAAAAoXDTA5MDQxOTEzMDUwMFowDDAKBgNVHRUEAwoBBDApAgphINAVAAAA
AAAHFw0wOTAzMzExMTEzMDBaMAwwCgYDVR0VBAMKAQUwKQIKYRT3zAAAAAAABhcN
MDkwMzMxMTAzMTAwWjAMMAoGA1UdFQQDCgEFMCkCCmERwOwAAAAAAAUXDTA5MDMz
MTEwMTgwMFowDDAKBgNVHRUEAwoBBDApAgphDxXgAAAAAAAEFw0wOTAzMzExMDE0
MDBaMAwwCgYDVR0VBAMKAQSggakwgaYwHwYDVR0jBBgwFoAUZiAsZ5wOPk1F8vmX
BZdmE1QTJjYwEAYJKwYBBAGCNxUBBAMCAQAwCwYDVR0UBAQCAgDyMBwGCSsGAQQB
gjcVBAQPFw0wOTExMTYwNjM0NDlaMEYGA1UdLgQ/MD0wO6A5oDeGNWh0dHA6Ly9k
YzIuY29udG9zby5jb20vQ2VydEVucm9sbC9jb250b3NvLURDMi1DQSsuY3JsMA0G
CSqGSIb3DQEBBQUAA4IBAQCCNVxtZbAbB5C1bI5Z6PF+Eph2MaRhl9pv0FjYhH/j
Xlvffau1m5bW72No7FC2k8FFU2oHFSZvAVNKgjm6+ECb4iEpzREcHpwsot1TG0kn
Pv+DRGjQ2ndes8OM11v3oYUJxlNOMqY6q03lj/BEJb+ocNerWRay8G0sycy1ABCD
/UPvP9qq54WvwQnJyV5bZJcJG3WYtN7zkZZzf5MR3v+c4OODLiLw5pXgku49USFu
kTuEh5DYcF5zbo6h5IqAW+OP6iMFepxkUEZUb/5VOYK8VcpXDwMzIRzlf+bITHyX
6PVugwm6TXkn9eVrAfJUd70S9LV7XVTz32IykC3tNXFY
-----END X509 CRL-----


PS C:\&amp;gt; $DeltaCRL =  $certadmin.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x12,0,3,0)
PS C:\&amp;gt; $BaseCRL &amp;gt; base.crl
PS C:\&amp;gt; $DeltaCRL &amp;gt; delta.crl
PS C:\&amp;gt; &amp;amp; .\base.crl
PS C:\&amp;gt; &amp;amp; .\delta.crl
PS C:\&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;последние 2 команды просто запускают эти CRL файлы. К сожалению не существует ни одного родного класса, который бы представлял собой объект CRL, поэтому как-то разбирать его на таком уровне пока не представляется возможным. Хотя существуют сторонние библиотеки (например, в Mono есть класс X509CRL).&lt;/p&gt;

&lt;h1 align="center"&gt;Получение статуса публикации CRL&lt;/h1&gt;

&lt;p&gt;Но мы можем кое что узнать о статусе наших CRL. Для этого существует PropID = &lt;strong&gt;CR_PROP_CRLSTATE (0x14)&lt;/strong&gt;. Тип возвращаемых данных будет Long, значит PropType будет 1, а Flags будет игнорироваться, поэтому поставим его в 0:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $certadmin.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x14,0,1,0)
3&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Расшифровку этого значения можно найти здесь:&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/cc249794(PROT.10).aspx" target="_blank"&gt;&lt;strong&gt;3.2.1.4.2.2.20 PropID = 0x00000014 (CR_PROP_CRLSTATE) &amp;quot;CA CRL State&amp;quot;&lt;/strong&gt;&lt;/a&gt;. Число 3 означает, что с CRL у нас всё хорошо (&lt;strong&gt;CA_DISP_VALID (0x03)&lt;/strong&gt;). В принципе, на данном этапе нам больше ничего и не нужно. Но мы можем посмотреть более детальные сведения по каждому типу CRL. Для получения более детальной ошибки мы должны использовать следующие PropID:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CR_PROP_BASECRLPUBLISHSTATUS (0x1E) &lt;/strong&gt;&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;CR_PROP_DELTACRLPUBLISHSTATUS (0x1F)&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для этих PropID тип данных так же указан Long, поэтому PropType выставим в 1, а Flags в 0:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $certadmin.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x1E,0,1,0)
5
PS C:\&amp;gt; $certadmin.GetCAProperty(&amp;quot;dc2\contoso-dc2-ca&amp;quot;,0x1F,0,1,0)
6
PS C:\&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Мы получили число 5 для BaseCRL и 6 для DeltaCRL. Расшифровку этих значений можно посмотреть вот здесь: &lt;a href="http://msdn.microsoft.com/en-us/library/cc249804(PROT.10).aspx" target="_blank"&gt;&lt;strong&gt;3.2.1.4.2.2.30 PropID = 0x0000001E (CR_PROP_BASECRLPUBLISHSTATUS) &amp;quot;Base CRL Publishing Status&amp;quot;&lt;/strong&gt;&lt;/a&gt;. Поскольку вывод — не конкретное число, а результат двоичного оператора И (AND), то мы это число должны разбить на составляющие. И вот как это делается:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$Return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$certadmin&lt;/span&gt;&lt;span style="color: #000000"&gt;.GetCAProperty(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServerName\CA Name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0x1E&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$options&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;32&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;64&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;128&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;256&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;512&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;1024&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;2048&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-band&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;} | ?{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;}
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; поскольку значения масок являются результаты возведения двойки в степень&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; начиная от 0 до 11, то эту строчку можно переписать более готично.&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Напоминаю, что возведение любого числа в нулевую степень&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; всегда вернёт 1. Кажется, это из алгебры 5-6 класса.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$options&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;.11&lt;/span&gt;&lt;span style="color: #000000"&gt;| &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;Math&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Pow&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;)} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-band&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;} | ?{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;}
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$options&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The CRL is a base CRL&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The CRL is a delta CRL&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The last CRL publication that was completed and published to the locations specified in the CA&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The CRL is a shadow delta CRL&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The CA MAY publish the CRL to a local store that is not externally accessible.
        This error is returned when publishing to this intermediate store failed&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;32&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;An error occurred during publication of the CRL.
        The error indicates that the file schema cannot be recognized.The schema must be file: or ldap:&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;64&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Publication of the CRL was manually initiated by an administrator&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;128&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;A CRL signature error was detected. The CSP was not correct&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;256&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;An error occurred during publication of the CRL to an LDAP URL&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;512&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;An error occurred during publication of the CRL to a file URL&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;1024&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;An error occurred during publication of the CRL to an FTP URL. FTP URLs are not supported&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #000000"&gt;2048&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;The CA cannot publish CRLs to HTTP URLs. This error is returned if a CA administrator
        configured the CA to publish CRLs to HTTP URLs&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Следовательно число 5 (1+4) говорит нам о том, что это был Base CRL и он был опубликован успешно. А 6 (2+4) — Delta CRL был опубликован успешно.&lt;/p&gt;

&lt;h1 align="center"&gt;Отзыв сертификатов&lt;/h1&gt;

&lt;p&gt;Интерфейс IcertAdmin2 позволяет нам отзывать сертификаты на сервере CA. Для этого мы воспользуемся методом &lt;a href="http://msdn.microsoft.com/en-us/library/aa383251(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;RevokeCertificate()&lt;/strong&gt;&lt;/a&gt;. Метод достаточно простой и примерная команда для отзыва сертификата будет выглядеть так:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$CertAdmin&lt;/span&gt;&lt;span style="color: #000000"&gt;.RevokeCertificate(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServerName\CA Name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;0123456789&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;,(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-Date&lt;/span&gt;&lt;span style="color: #000000"&gt;).AddDays(&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;))&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;0123456789&lt;/strong&gt; будет обозначать серийный номер сертификата, &lt;strong&gt;4&lt;/strong&gt; — причина отзыва будет Superseded и эффективная дата отзыва (когда сертификат будет помещён в Revoked Certificates) будет 24 часа после выполнения команды. Да, именно этим методом можно отзывать корневые сертификаты &lt;img alt=":)" src="/smilies/happy.gif"&gt;.&lt;/p&gt;

&lt;h1 align="center"&gt;Извлечение сертификатов из CRL&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; хоть Microsoft и поддерживает извлечение сертификатов из CRL (отмена статуса Revoked), этой возможностью не следует пользоваться в силу определённых причин, как невозможность определеления в какое время сертификат был помещён и извлечён из CRL.&lt;/p&gt;

&lt;p&gt;Если сертификат был отозван со статусом Certificate Hold (6), то его можно в любое время вернуть обратно. Для всех остальных типов отзыва такая возможность не поддерживается. Для отмены статуса Revoked нужно использовать этот же метод, только в качестве причины отзыва указать значение MAX_DWORD, которое является &lt;strong&gt;0xffffffff&lt;/strong&gt; или просто &lt;strong&gt;–1&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$CertAdmin&lt;/span&gt;&lt;span style="color: #000000"&gt;.RevokeCertificate(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServerName\CA Name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;0123456789&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h1 align="center"&gt;Публикация новых CRL&lt;/h1&gt;

&lt;p&gt;Если вы хотите опубликовать новые CRL вручную (т.е. в промежутке между плановой публикацией CRL), то мы должны воспользоваться методом &lt;a href="http://msdn.microsoft.com/en-us/library/aa383249(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;PublishCRLs()&lt;/strong&gt;&lt;/a&gt;. Его синтаксис достаточно простой:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$CertAdmin&lt;/span&gt;&lt;span style="color: #000000"&gt;.PublishCRLs(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;ServerName\CA Name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Эта команда переопубликует как основной, так и инкрементальный CRL (при публикации Base CRL инкрементальный CRL публикуется всегда, потому что Effective Date у него не может быть меньше, чем у Base CRL). Что касается последнего аргумента, то он бывает ещё полезен, если по каким-то причинам потерялся какой-то файл CRL. Тогда вы можете выставить CRLFlags в 4 (0x4) и тогда CA переопубликует текущие CRL без обновления их содержимого и дат.&lt;/p&gt;

&lt;p&gt;На сегодня это всё.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=ca3a2177-92b3-46af-bc7b-0497cdbce74e"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,ca3a2177-92b3-46af-bc7b-0497cdbce74e.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
      <category>PowerShell / CryptoAPI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=1cec0947-9113-4de2-bf48-809a09849f4c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,1cec0947-9113-4de2-bf48-809a09849f4c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,1cec0947-9113-4de2-bf48-809a09849f4c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=1cec0947-9113-4de2-bf48-809a09849f4c</wfw:commentRss>
      <title>CryptoAPI и управление Certification Authority с помощью PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,1cec0947-9113-4de2-bf48-809a09849f4c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,1cec0947-9113-4de2-bf48-809a09849f4c.aspx</link>
      <pubDate>Thu, 05 Nov 2009 20:22:36 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Продолжая тему криптографии, предлагаю несколько ближайших постов посвятить вопросам использования CryptoAPI в PowerShell для управления &lt;strong&gt;Cerficiation Authority&lt;/strong&gt; (сокращённо &lt;strong&gt;CA&lt;/strong&gt;). Я считаю эту тему достаточно интересной, хоть у нас есть космическая утилита certutil.exe. Но тот, кто видел хелп к нему, тот знает какой это ужас, автоматизировать что-то с использованием certutil. Microsoft подарил нам не менее космический и православный инструмент автоматизации — PowerShell. К сожалению, вынужден признать, что в ряде задач PowerShell сильно уступает аналогам в cmd и с этим ничего нельзя поделать. Но по мере своих сил буду пытаться доказывать обратное. Одно из преимуществ PowerShell является поддержка .NET, который очень удобен в использовании. Но .NET не всемогущ и не содержит в себе ни единого класса, при помощи которого можно было бы управлять службой certificate services (точнее самим CA). CryptoAPI неплохо документированы на уровне unmanaged code (а это подразумевает использование низкоуровневых языков программирования, как C++). Но, опять, слава &lt;strike&gt;сиськамСноверу&lt;/strike&gt;Протоколу у нас есть одна лазейка — COM интерфейсы к CryptoAPI. Изучив немного эти интерфейсы, обнаружил, что они местами очень интересные и досточно легко управляемы. Но это не всегда так, иногда они бывают достаточно сложными для понимания с первого раза. В процессе исследования, были обнаружены вообще нелогичные вещи, с которыми нам придётся считаться.&lt;/p&gt;  &lt;p&gt;Эти COM интерфейсы позволили мне реализовать едва ли не половину функционала моего PowerPack'а для PowerGUI. Оценить моё детище можно по этой ссылке: &lt;a href="http://powergui.org/entry.jspa?externalID=2552&amp;amp;categoryID=21" target="_blank"&gt;&lt;strong&gt;Enterprise PKI management&lt;/strong&gt;&lt;/a&gt;. Я в него вложил достаточно много знаний для того, чтобы упростить жизнь администраторам инфраструктур PKI. Пока прогресс неважный, т.к. я пока только повторяю функционал консолей certmgr.msc, certsrv.msc, ocsp.msc и certutil.exe. Но я надеюсь реализовать там действительно что-то нужное и очень полезное.&lt;/p&gt;  &lt;p&gt;Наша отправная точка на MSDN будет находиться здесь: &lt;a href="http://msdn.microsoft.com/en-us/library/aa380253(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;Cryptography Interfaces&lt;/strong&gt;&lt;/a&gt;. Для начала мы поработаем с интерфейсом &lt;a href="http://msdn.microsoft.com/en-us/library/aa383234(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;ICertAdmin2&lt;/strong&gt;&lt;/a&gt;, который зарегистрирован в системе как COM класс &lt;strong&gt;CertificateAuthority.Admin.1&lt;/strong&gt;. Вот как он создаётся:&lt;/p&gt;  &lt;div style="width: 935px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $CertAdmin = New-Object -ComObject &amp;quot;CertificateAuthority.Admin.1&amp;quot;
PS C:\&amp;gt; $CertAdmin | gm


   TypeName: System.__ComObject#{f7c3ac41-b8ce-4fb4-aa58-3d1dc0e36b39}

Name                     MemberType Definition
----                     ---------- ----------
DeleteRow                Method     int DeleteRow (string, int, Date, int, int)
DenyRequest              Method     void DenyRequest (string, int)
GetArchivedKey           Method     string GetArchivedKey (string, int, int)
GetCAProperty            Method     Variant GetCAProperty (string, int, int, int, int)
GetCAPropertyDisplayName Method     string GetCAPropertyDisplayName (string, int)
GetCAPropertyFlags       Method     int GetCAPropertyFlags (string, int)
GetConfigEntry           Method     Variant GetConfigEntry (string, string, string)
GetCRL                   Method     string GetCRL (string, int)
GetMyRoles               Method     int GetMyRoles (string)
GetRevocationReason      Method     int GetRevocationReason ()
ImportCertificate        Method     int ImportCertificate (string, string, int)
ImportKey                Method     void ImportKey (string, int, string, int, string)
IsValidCertificate       Method     int IsValidCertificate (string, string)
PublishCRL               Method     void PublishCRL (string, Date)
PublishCRLs              Method     void PublishCRLs (string, Date, int)
ResubmitRequest          Method     int ResubmitRequest (string, int)
RevokeCertificate        Method     void RevokeCertificate (string, string, int, Date)
SetCAProperty            Method     void SetCAProperty (string, int, int, int, Variant)
SetCertificateExtension  Method     void SetCertificateExtension (string, int, string, int, int, Variant)
SetConfigEntry           Method     void SetConfigEntry (string, string, string, Variant)
SetRequestAttributes     Method     void SetRequestAttributes (string, int, string)


PS C:\&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Как вы видите, этот интерфейс позволяет использовать достаточно много интересных методов. Давайте начнём с простого (а может быть и не очень простого) — &lt;a href="http://msdn.microsoft.com/en-us/library/aa383238(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;GetCAProperty&lt;/strong&gt;&lt;/a&gt;. По ссылке вообще ничего непонятно, что и как там использовать. Единственное, что я понял — это то, что данный метод принимает 5 параметров в определённом порядке и всё. Поэтому давайте будем считать, что этой странички не существует в природе (кроме случаев, когда будем преследовать порядок расположения аргументов). Пошарившись на MSDN, нашёл более годную ссылку в спецификациях &lt;strong&gt;Windows Communications Protocols&lt;/strong&gt; — &lt;a href="http://msdn.microsoft.com/en-us/library/cc249749(PROT.10).aspx" target="_blank"&gt;&lt;strong&gt;3.2.1.4.2.2 ICertRequestD2::GetCAProperty (Opnum 7)&lt;/strong&gt;&lt;/a&gt;. И вот как должны выглядеть параметры:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;strConfig&lt;/strong&gt; — имя компьютера и сервера CA в формате &lt;font color="#0000ff"&gt;ComputerName\CAName&lt;/font&gt;. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;PropId&lt;/strong&gt; — ID требуемого свойства. Должно указываться в числовом формате (т.к. тип данных указан Long). Это число можно взять из колонки &lt;strong&gt;Numerical Value&lt;/strong&gt; таблички &lt;a href="http://msdn.microsoft.com/en-us/library/cc249749(PROT.10).aspx" target="_blank"&gt;&lt;strong&gt;3.2.1.4.2.2 ICertRequestD2::GetCAProperty (Opnum 7)&lt;/strong&gt;&lt;/a&gt;. Например, для получения DeltaCRL надо указать число &lt;strong&gt;18&lt;/strong&gt; (0x12). &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;PropIndex&lt;/strong&gt; — если свойство индексированное (т.е. содержит несколько искомых объектов), то PropIndex указывает на индекс массива, в котором хранится определённый объект искомого свойства. Например, CA может содержать несколько своих сертификатов. И с использованием PropIndex мы сможем выбирать различные сертификаты, выбирая их из массива. Начало индексирования начинается с нуля. Если свойство неиндексируемое, то это значение будет игнорироваться. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;PropType&lt;/strong&gt; — указываете тип данных, в котором хотите получить конкретное свойство. Во второй таблице уже указаны рекомендованные значения типов данных для каждого набора свойств. Тип данных так же нужно указывать в числовом формате. Однако, &lt;font color="#ff0000"&gt;здесь индекс начинается не с нуля, а с единицы&lt;/font&gt;. Т.е. тип данных &lt;strong&gt;String&lt;/strong&gt; будет иметь значение &lt;strong&gt;4&lt;/strong&gt;. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Flags&lt;/strong&gt; — помимо типа возвращаемых данных нам нужно указать формат этих данных. Во второй таблице так же приведены рекомендованные (хотя слово MUST и ещё капсом как бы намекает на обязательность. Хотя, это не совсем так. Если вы в первый раз будете этим заниматься, то используйте значения из второй таблички). А вот здесь индекс начинается с нуля. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; по всей видимости в табличке с флагами закралась ошибка, т.к. использование первого флага даёт Base64, но с заголовками Begin/End Certificate. А второй — наоборот, без заголовка.&lt;/p&gt;

&lt;p&gt;Вам кажется, что это всё ужасно и сложно? Поверьте, это не так. Давайте прочитаем парочку свойств. Например, прочитаем ссылки на CRL и CRT, которые публикуются в CDP и AIA издаваемых сертификатах. Исходя из таблички мы знаем, что CRL'ы вызываются &lt;strong&gt;PropID = 0x29&lt;/strong&gt; (или 41 в десятичной нотации), а CRT — &lt;strong&gt;PropID = 0x2A&lt;/strong&gt; (или 42). Поскольку это индексируемое свойство, то первая ссылка будет содержаться в индексе 0 (первый индекс массива), а последующие ссылки в индексах 1 и далее и &lt;strong&gt;PropIndex&lt;/strong&gt; мы укажем &lt;strong&gt;0&lt;/strong&gt;. PropType у нас будет &lt;strong&gt;String&lt;/strong&gt; и числовое значение — 4 (не забываем, что PropType считаются начиная с единицы). &lt;strong&gt;Flags&lt;/strong&gt; может быть любой, т.к. он будет игнорироваться при &lt;strong&gt;PropType = 4&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $CertAdmin.GetCAProperty(&amp;quot;ca\sysadmins-lv-ca&amp;quot;, 41, 0, 4, 0)
http://ca.sysadmins.lv/sysadmins-LV-CA.crl

PS C:\&amp;gt; $CertAdmin.GetCAProperty(&amp;quot;ca\sysadmins-lv-ca&amp;quot;, 42, 0, 4, 0)
http://ca.sysadmins.lv/sysadmins-LV-CA.crt

PS C:\&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Как вы видите, на самом деле здесь нет ничего страшного. Нужно лишь научиться оперировать табличкой. Давайте для разнообразия посмотрим на сертификат CA. Для этого мы должны найти PropID, который отвечал за сертификат. Это будет &lt;strong&gt;PropID = 0xC&lt;/strong&gt;. Поскольку этот параметр так же индексируемый, то он будет содержать все сертификаты CA, если их там несколько. Самый первый сертификат будет храниться в индексе 0, следующий сертификат в индексе 1 и т.д. Исходя из таблички, PropType должен быть 3. Посмотрим сертификат в Base64 кодировке, т.е. Flags должен быть 0 или 1:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $cert = $CertAdmin.GetCAProperty(&amp;quot;ca\sysadmins-lv-ca&amp;quot;, 0xc, 0, 3, 0)
PS C:\&amp;gt; $cert
-----BEGIN CERTIFICATE-----
MIIFbTCCA1WgAwIBAgIQPf+vkU1hMoJCe9WRwftYbTANBgkqhkiG9w0BAQUFADBJ
MRIwEAYKCZImiZPyLGQBGRYCbHYxGTAXBgoJkiaJk/IsZAEZFglzeXNhZG1pbnMx
GDAWBgNVBAMTD3N5c2FkbWlucy1MVi1DQTAeFw0wOTA4MDYwNzIxMDFaFw0xNDA4
MDYwNzMwNTRaMEkxEjAQBgoJkiaJk/IsZAEZFgJsdjEZMBcGCgmSJomT8ixkARkW
CXN5c2FkbWluczEYMBYGA1UEAxMPc3lzYWRtaW5zLUxWLUNBMIICIjANBgkqhkiG
9w0BAQEFAAOCAg8AMIICCgKCAgEAwL5wHTMEsMg6yDzqWPd9e/GT856o9OWJrv4Y
9iXtTa5mkdEZsbckVmAJODG28lcI7ScuD0rfceB6/gVn4VMK2SITsOv2XzC3ApRE
zExEIuRmspFlpaDmOvBTYafkzokN2RJ+UQq8M9RSnSBHrOcvNJQYgglbjQOHsg4f
qyMoPoZ+LYjoGZcCtqmR+FMOnalUGohnanf/fQJ/gcoAET6H45rqAB/P90sWOsZo
pwCgGmvJe4GBXbZDg4ADZIbrYm2baxwKJlhsDAhzZ8Fo2irnSBFJavu6+LwQHv8P
fL/ZGHBlf8s+uTeHfluG95bIe8VAGRwEwCyV5t+emBLq4ny5Q21MjWGDD3YjkKjA
lqC7c2mpCC6YVxBArVVm1G7/d8mpBuO5ZzyqIVkEhxZuYPfK6k7EEKx3BuCC97UT
ZcSVJBCHmxbxWm/U30VIpu0HDlbCiHX0OSDRJhv32ppazDonGSp/GiBocXNKTLA+
PyXQqRvObovTFPMutzLQDczeee5zvfJ7Gs7xCskcsLp8uBuhGJMnW87hRglm4p0/
tdIViIbMrwbVxjtHPnp5MARvQBT26ZzE3k0zr9Do3Gi6AY8Jt6ssD6r5CXbBA5SF
iGgp1czWb2xToqJtzuEjG1ssBj5MTMzINa4bMhQs52nXdUI2aG7n7mwoAVR3tHiW
sK1lvdsCAwEAAaNRME8wCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFHrmiNrp+Fw+BwTeEaI4Iql1oxOrMBAGCSsGAQQBgjcVAQQDAgEAMA0G
CSqGSIb3DQEBBQUAA4ICAQCuLfQSOcRoQ8EcuVMgIVjepuonY1MG7PhPvJ1fyanw
0MeKonNZ4a7gOop7R/8DSGBfnQMQJClVcFTxe8Osa88OkeJmb9LQix9wMfR1GAaw
NwaX6ve0x4Ixr7m3KQEBOc+fAAGNLcxnlIDUD9EiSlFqqH+HkjxREU5RmE0TQFVS
NfNtwFSX0loMuL8mo10m8CD/ETRdq6jXO6vMWll8wBirSD9/Zostn5+t1g6TU4fi
bpR/56ueiRh0px2A1lhDTTGjV7UTqPvavUqJejZJCHf269xJb1r8mc+AJn/O4g4q
WvVsTILLMw+Oit/7ZagFbjZa7jSBRFfEyU4lKnV9oxIO47FTjWgGi7R+Rg8VDWvQ
a5JMhMadUWrz5VQRY9iBr1wlmvZH5100otrikZLfVxQ+HZVccgLvZ4BJpdk+Lzyk
bqZSAwbOJlFF0po+4wWbakhzS/jZLcoO8NzE4SgW3NTcuWYsS2G8ubV139IykSCy
RA9UcyoNNQM8CXr6I2UmhQwBqMrGZIi/rybPRQvlVSssuusfbxIiWMjdo/mQyUH2
A1diiIt1bpkVdJ9yRSDtuldoYe2w0QtId6WWAg2H8bTiF+/cu1kZ//rcK5UQyuku
1ggS22YqWCUrSQ4/heQdP1Ni619sMHFcMYWZTP5XySLiN+BBrs6/4pnJOVNsy742
KQ==
-----END CERTIFICATE-----

PS C:\&amp;gt; $cert &amp;gt; file.cer
PS C:\&amp;gt; &amp;amp; c:\file.cer
PS C:\&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Последней строчкой я вызвал команду, которая покажет мне сертификат как я бы запустил сам файл (я это и сделал этой командой на самом деле). Если там сертификат не один, то следующий сертификат можно было бы получить вот такой командой:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;$CertAdmin.GetCAProperty(&amp;quot;ServerName\CA Name&amp;quot;, 0xC, 1, 3, 0)&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Я просто увеличил PropIndex на единицу. Чтобы узнать сколько же там всего сертификатов, достаточно посмотреть PropID = 0x0B, PropType = 1 (т.к. команда нам вернёт число, то тип должен быть числовой — &lt;strong&gt;Long&lt;/strong&gt;):&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS C:\&amp;gt; $CertAdmin.GetCAProperty(&amp;quot;ca\sysadmins-lv-ca&amp;quot;, 0xb, 0, 1, 0)
1
PS C:\&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Вот в данном случае у меня там всего 1 сертификат. На другом сервере у меня 2 сертификата:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;[Administrator] $CertAdmin.GetCAProperty(&amp;quot;dc1\contoso ca&amp;quot;, 0xb, 0, 1, 0)
2
[Administrator]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Если вам это интересно, то советую поупражняться в получении различных свойств в различном формате с использованием ICertAdmin2 интерфейса и таблички: &lt;a href="http://msdn.microsoft.com/en-us/library/cc249749(PROT.10).aspx" target="_blank"&gt;&lt;strong&gt;3.2.1.4.2.2 ICertRequestD2::GetCAProperty (Opnum 7)&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Это была первая часть использования CryptoAPI в PowerShell. В следующих частях мы рассмотрим другие интересные методы интерфейса &lt;strong&gt;ICertAdmin2&lt;/strong&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=1cec0947-9113-4de2-bf48-809a09849f4c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,1cec0947-9113-4de2-bf48-809a09849f4c.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
      <category>PowerShell / CryptoAPI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b3aacee7-8805-4fec-ad24-7f4c6826fec7</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b3aacee7-8805-4fec-ad24-7f4c6826fec7</wfw:commentRss>
      <title>PowerShell V2 RTM для Windows XP/Vista/2003/2008</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</link>
      <pubDate>Tue, 27 Oct 2009 18:34:36 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Слава &lt;strike&gt;сиськамПротоколу&lt;/strike&gt; Сноверу!&lt;/p&gt;  &lt;h1 align="center"&gt;&lt;font size="7"&gt;&lt;a href="http://support.microsoft.com/kb/968929" target="_blank"&gt;&amp;gt;&amp;gt; PowerShell V2 RTM &amp;lt;&amp;lt;&lt;/a&gt;&lt;/font&gt;&lt;/h1&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b3aacee7-8805-4fec-ad24-7f4c6826fec7"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=16ffa3d3-8449-4c16-9704-5d089b6a32e2</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=16ffa3d3-8449-4c16-9704-5d089b6a32e2</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <title>Certificate chaining engine в PowerShell (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</link>
      <pubDate>Mon, 19 Oct 2009 18:52:44 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; данный материал публикуется на правах ТЗ (&lt;strong&gt;ТЗ&lt;/strong&gt; — &lt;em&gt;Тайное Знание&lt;/em&gt;) и обязателен для знания администраторам PKI.&lt;/p&gt;  &lt;p&gt;В предыдущей части (&lt;a href="http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx"&gt;&lt;strong&gt;Certificate chaining engine в PowerShell&lt;/strong&gt;&lt;/a&gt;) мы рассмотрели реализацию certificate chaining engine в .NET в виде класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.aspx"&gt;&lt;strong&gt;X509Chain&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;. Но этот рассказ был бы неполным, если мы не поговорили про &lt;a href="http://msdn.microsoft.com/en-us/library/aa377611(VS.85).aspx"&gt;&lt;strong&gt;CAPICOM.Chain&lt;/strong&gt;&lt;/a&gt;. Хоть Microsoft рекомендует использовать .NET, а не CAPICOM для решения данной задачи, я считаю необходимым осветить этот вопрос. Для начала начнём с реализации CAPICOM в PowerShell. По непонятным мне пока причинам мне не удалось завести его в PowerShell на системах Windows Vista и выше, поэтому примеры буду приводить на Windows Server 2003.&lt;/p&gt;  &lt;div style="width: 935px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS G:\&gt; $chain = New-Object -ComObject "CAPICOM.Chain"
PS G:\&gt; $chain

Certificates
------------



PS G:\&gt; $chain | gm -MemberType methods


   TypeName: System.__ComObject#{ca65d842-2110-4073-aee3-d0aa5f56c421}

Name                MemberType Definition
----                ---------- ----------
ApplicationPolicies Method     IOIDs ApplicationPolicies ()
Build               Method     bool Build (ICertificate)
CertificatePolicies Method     IOIDs CertificatePolicies ()
ExtendedErrorInfo   Method     string ExtendedErrorInfo (int)


PS G:\&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Так же, как и в .NET у нас есть метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa377617(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;Build()&lt;/strong&gt;&lt;/a&gt;, который запускает certificate chaining engine для указанного сертификата. Но это COM объект и X509Certificate2 объекты не принимает. Поэтому мы средствами этого же CAPICOM получим нужный объект сертификата:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS G:\&gt; $store = New-Object -ComObject "CAPICOM.Store"
PS G:\&gt; $store.Open(2,"my",128)
PS G:\&gt; $cert = @()
PS G:\&gt; $store.Certificates | %{$cert += $_}
PS G:\&gt; $cert = $cert[1]
PS G:\&gt; $cert


Version       : 3
SerialNumber  : 167D6D32000000000011
SubjectName   : CN=Administrator, CN=Users, DC=sysadmins, DC=lv
IssuerName    : CN=sysadmins-LV-CA, DC=sysadmins, DC=lv
ValidFromDate : 2009.08.07. 16:09:56
ValidToDate   : 2010.08.07. 16:09:56
Thumbprint    : 1FA71B51BCE461BEE24B11AA9EF855ED00DFDFD4
Archived      : False
PrivateKey    :



PS G:\&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Вот такой объект сертификата мы получили. Вот его и пропустим через метод Build():&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS G:\&gt; $chain.Build($cert)
False
PS G:\&gt; $chain.Status()
32
PS G:\&gt; $chain.Certificates


Version       : 3
SerialNumber  : 167D6D32000000000011
SubjectName   : CN=Administrator, CN=Users, DC=sysadmins, DC=lv
IssuerName    : CN=sysadmins-LV-CA, DC=sysadmins, DC=lv
ValidFromDate : 2009.08.07. 16:09:56
ValidToDate   : 2010.08.07. 16:09:56
Thumbprint    : 1FA71B51BCE461BEE24B11AA9EF855ED00DFDFD4
Archived      : False
PrivateKey    :

Version       : 3
SerialNumber  : 3DFFAF914D613282427BD591C1FB586D
SubjectName   : CN=sysadmins-LV-CA, DC=sysadmins, DC=lv
IssuerName    : CN=sysadmins-LV-CA, DC=sysadmins, DC=lv
ValidFromDate : 2009.08.06. 10:21:01
ValidToDate   : 2014.08.06. 10:30:54
Thumbprint    : E82ACC45841280DDEAB9F7847418FA26354457A7
Archived      : False
PrivateKey    :



PS G:\&gt; $chain.ApplicationPolicies()

                                   Name FriendlyName                            Value
                                   ---- ------------                            -----
                                    123 Smart Card Logon                        1.3.6.1.4.1.311.20.2.2
                                    101 Client Authentication                   1.3.6.1.5.5.7.3.2


PS G:\&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Метод вернул &lt;strong&gt;False&lt;/strong&gt;, т.е. наш сертификат не прошёл проверку. Свойство &lt;a href="http://msdn.microsoft.com/en-us/library/aa377621(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;Certificate&lt;/strong&gt;s&lt;/a&gt; содержит все сертификаты в текущей цепочке. А метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa377615(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;ApplicationPolicies()&lt;/strong&gt;&lt;/a&gt; показал Application Policies (в прошлом EKU). Ну и метод &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa377630(VS.85).aspx" target="_blank"&gt;Status()&lt;/a&gt;&lt;/strong&gt; вернул код ошибки. Все коды ошибок расписаны в описании самого метода. Т.е. ошибка 32 по табличке означает:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;CAPICOM_TRUST_IS_UNTRUSTED_ROOT (&amp;H00000020) — The certificate or certificate chain is based on an untrusted root.&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Особо углубляться дальше я смысла не вижу, поскольку используя эти примеры можно поупражняться в других задачах с использованием CAPICOM. А вместо этого, мы разберём кое-какие неочевидные, но очень важные вещи.&lt;/p&gt;

&lt;p&gt;Когда вышел &lt;strong&gt;Remote Desktop Connection 7.0&lt;/strong&gt; (который поставляется вместе с Windows 7), &lt;strong&gt;Александр Станкевич&lt;/strong&gt; (MVP: Enterprise Security) заметил очень плохую особенность с ним, а именно — рандомно пропал доступ к терминальным серверам, которые используют SSL для терминальных подключений. В ходе множества проверок было констатировано:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;цепочка завершалась на доверенном корневом сертификате (через просмотр сертификата); &lt;/li&gt;

  &lt;li&gt;CDP/AIA пути были валидные и CRL не были просрочены; &lt;/li&gt;

  &lt;li&gt;остальные параметры были сконфигурированы верно. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RDP клиент мотивировал отказ в подключении следюущим: «RDP клиент не смог проверить сертификат на отзыв». Причём подключение с предыдущих версий RDC, а так же подключение к TS Web Access через IE было успешным. Как выяснилось на днях, причина была в том, что в новом RDC был изменён алгоритм certificate chaining engine и новая версия RDC больше не доверяла корневым сертификатам в пользовательском хранилище. Переустановка корневого сертификата в компьютерное хранилище решала проблему RDC 7. Но, как я говорил, в Windows 7/2008 R2 было изменено поведение certificate chaining engine в реализации X509Chain. Продемонстрирую небольшую табличку, которая покажет доверие пользовательским корневым сертификатам в CAPICOM и .NET реализациях certificate chaining engine для различных операционных систем:&lt;/p&gt;

&lt;table border="1" cellspacing="0" cellpadding="2" width="373" align="center"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt; &lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;strong&gt;X509Chain (.NET)&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;strong&gt;CAPICOM.Chain (CryptoAPI)&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows XP&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows Server 2003&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows Vista&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows Server 2008&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows 7&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows Server 2008 R2&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;blockquote&gt;
  &lt;p align="center"&gt;Таблица доверия пользовательскким корневым сертификатам различными движками построения цепочки сертификатов &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Следует учитывать, что различные приложения могут использовать свой движок для построения цепочек сертификатов, как &lt;strong&gt;RDC 7.0&lt;/strong&gt; и &lt;strong&gt;PKIView.msc&lt;/strong&gt; использует &lt;strong&gt;CAPICOM&lt;/strong&gt;, а &lt;strong&gt;PowerShell&lt;/strong&gt; — &lt;strong&gt;X509Chain&lt;/strong&gt;. Однако, у меня есть уверенность, что существует ещё одна реализация этого движка, которую использует &lt;strong&gt;Internet Explorer&lt;/strong&gt;. Это только мои догадки, но они основаны на том, что Internet Explorer (кроме Windows 7 и выше) использует пользовательский контейнер для проверки SSL веб-сайтов, т.е. по симптомам похоже на X509Chain. Однако, этот класс появился только в .Net Framework 2.0, которого, к примеру в оригинальной инсталляции Windows XP/2003 не было. Либо, как вариант, есть возможность настраивать этот момент в каждой реализации движка построения цепочек, но я пока не нашёл как. Это пока всё, что у меня есть по этому поводу.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=16ffa3d3-8449-4c16-9704-5d089b6a32e2"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
      <category>Security / PKI / Chaining Engine</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b14ea574-ca90-4f1b-9845-35b6ce273fb2</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b14ea574-ca90-4f1b-9845-35b6ce273fb2</wfw:commentRss>
      <slash:comments>18</slash:comments>
      <title>Certificate chaining engine в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</link>
      <pubDate>Sat, 17 Oct 2009 20:51:59 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Я предлагаю снова поговорить о certificate chaining engine, о котором мы уже говорили в посте &lt;A href="http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx"&gt;Certificate Chaining Engine — как это работает&lt;/A&gt; но в рамках его реализации в .NET и PowerShell. В Windows есть несколько реализаций этого chaining engine. Самые популярные:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.aspx" target=_blank&gt;&lt;STRONG&gt;X509Chain&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa377611(VS.85).aspx" target=_blank&gt;&lt;STRONG&gt;CAPICOM.Chain&lt;/STRONG&gt;&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;CAPICOM — вещь несколько стрёмная и её лучше избегать. Тем более мне не удалось завести его в Vista/Windows 7. Реализация в .NET в виде &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.aspx" target=_blank&gt;&lt;STRONG&gt;X509Chain&lt;/STRONG&gt;&lt;/A&gt; ничуть не хуже, но, в то же время, проще. Итак, предлагаю начать с создания этого объекта с помощью &lt;STRONG&gt;New-Object&lt;/STRONG&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain

                 ChainContext ChainPolicy                   ChainStatus                   ChainElements
                 ------------ -----------                   -----------                   -------------
                            0 System.Security.Cryptograp... {}                            {}


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain | gm -membertype methods


   TypeName: System.Security.Cryptography.X509Certificates.X509Chain

Name        MemberType Definition
----        ---------- ----------
Build       Method     bool Build(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
Reset       Method     System.Void Reset()
ToString    Method     string ToString()


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Здесь видно, что метод, который будет строить и проверять цепочку будет называться &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.build.aspx" target=_blank&gt;&lt;STRONG&gt;Build()&lt;/STRONG&gt;&lt;/A&gt; и в качестве аргумента этот метод принимает только объекты &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx" target=_blank&gt;&lt;STRONG&gt;x509Certificate2&lt;/STRONG&gt;&lt;/A&gt;, а возвращать объект типа Boolean — &lt;STRONG&gt;True/False&lt;/STRONG&gt;. Объекты такого типа можно найти в провайдере Certififcates (просто выполнить &lt;STRONG&gt;dir cert:\store\container&lt;/STRONG&gt;) или импортировать из файла — &lt;A href="http://www.sysadmins.lv/PermaLink,guid,9932bca2-6f85-4ed5-b001-32a37b67b146.aspx"&gt;Импорт сертификатов в PowerShell&lt;/A&gt;. Но сначала мы посмотрим, что здесь можнол настроить. А настроить можно &lt;STRONG&gt;ChainPolicy&lt;/STRONG&gt;, представляющий собой объект &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chainpolicy.aspx" target=_blank&gt;&lt;STRONG&gt;X509ChainPolicy&lt;/STRONG&gt;&lt;/A&gt;. Эта политика позволяет задавать порядок проверки отзыва сертификатов, соответствие сертификата каким-то certificate policy, наличие определённых application policy (в прошлом известен нам как &lt;STRONG&gt;EKU&lt;/STRONG&gt; — &lt;EM&gt;Extended Key Usage&lt;/EM&gt;) и некритичность каких-то ошибок. Мы всё разбирать не будем, а только основное:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy


ApplicationPolicy   : {}
CertificatePolicy   : {}
RevocationMode      : Online
RevocationFlag      : ExcludeRoot
VerificationFlags   : NoFlag
VerificationTime    : 17.10.2009 20:35:17
UrlRetrievalTimeout : 00:00:00
ExtraStore          : {}



&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Первое, что может быть интересным — &lt;STRONG&gt;Revocation Mode&lt;/STRONG&gt;, который задаёт режим проверки отзыва и может иметь 3 вполне понятных значения, которые перечислены в &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509revocationmode.aspx" target=_blank&gt;&lt;STRONG&gt;X509RevocationMode&lt;/STRONG&gt;&lt;/A&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] [System.Enum]::GetNames([system.security.cryptography.x509certificates.x509revocationmode])
NoCheck
Online
Offline&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Тут очень просто:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;NoCheck&lt;/STRONG&gt; — проверяет цепочку сертификатов без проверки на отзыв любых сертификатов в цепочке; 
&lt;LI&gt;&lt;STRONG&gt;Online&lt;/STRONG&gt; — проверяет сертификаты в цепочке скачивая новые списки CRL из свойства CDP сертификата, игнорируя локальный кеш CRL (используется по умолчанию, как это видно в просмотре свойств ChainPolicy) 
&lt;LI&gt;&lt;STRONG&gt;Offline&lt;/STRONG&gt; — проверяет сертификаты на отзыв с использованием кешированного CRL (если есть). &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Если проверяем сертификаты на отзыв, то мы можем выбрать что именно будем проверять и этот выбор перечислен в &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509revocationflag.aspx" target=_blank&gt;&lt;STRONG&gt;X509RevocationFlag&lt;/STRONG&gt;&lt;/A&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] [System.Enum]::GetNames([system.security.cryptography.x509certificates.x509revocationflag])
EndCertificateOnly
EntireChain
ExcludeRoot&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;и здесь тоже всё достаточно понятно:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;EndCertificateOnly&lt;/STRONG&gt; — проверяет на отзыв только сам проверяемый сертификат. Остальные сертификаты в цепочке не проверяются; 
&lt;LI&gt;&lt;STRONG&gt;EntireChain&lt;/STRONG&gt; — проверяет на отзыв абсолютно все сертификаты в цепочке включая корневой сертификат. Правила хорошего тона диктуют нам не включать в корневой сертификат CA поля CDP и AIA, поскольку это лишено смысла и в большинстве случаев с этим флагом вы будете получать невалидную цепочку; 
&lt;LI&gt;&lt;STRONG&gt;ExcludeRoot&lt;/STRONG&gt; — проверяет на отзыв все сертификаты в цепочке, кроме корневого сертификата, что есть религионзно правильно и этот флаг установлен по умолчанию. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Следующий момент определяет флаги проверки, т.е. по каким именно критериям будет проверяться цепочка сертификатов:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] [System.Enum]::GetNames([system.security.cryptography.x509certificates.x509verificationflags])
NoFlag
IgnoreNotTimeValid
IgnoreCtlNotTimeValid
IgnoreNotTimeNested
IgnoreInvalidBasicConstraints
AllowUnknownCertificateAuthority
IgnoreWrongUsage
IgnoreInvalidName
IgnoreInvalidPolicy
IgnoreEndRevocationUnknown
IgnoreCtlSignerRevocationUnknown
IgnoreCertificateAuthorityRevocationUnknown
IgnoreRootRevocationUnknown
AllFlags&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Эти флаги так же достаточно понятны и подробно разжёваны в перечислении &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509verificationflags.aspx" target=_blank&gt;&lt;STRONG&gt;X509VerificationFlags&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Примечание:&lt;/STRONG&gt;&lt;/FONT&gt; эти флаги показывают что будет исключено из проверки, а не наоборот. По умолчанию проверяется всё (установлен &lt;STRONG&gt;NoFlag&lt;/STRONG&gt;).&lt;/P&gt;
&lt;P&gt;Как можно задавать эти флаги и режимы, если есть такая потребность? Можно пойти двумя способами — правильным и неправильным, хотя оба рабочие:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] # правильный метод:
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $revflag = [System.Security.Cryptography.X509Certificates.X509RevocationFlag]::EndCertificateOnly
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy.RevocationFlag = $revflag
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy


ApplicationPolicy   : {}
CertificatePolicy   : {}
RevocationMode      : Online
RevocationFlag      : EndCertificateOnly
VerificationFlags   : NoFlag
VerificationTime    : 17.10.2009 20:35:17
UrlRetrievalTimeout : 00:00:00
ExtraStore          : {}



&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] # неправильный метод, но мне он нравится
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy.RevocationFlag = "excluderoot"
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy


ApplicationPolicy   : {}
CertificatePolicy   : {}
RevocationMode      : Online
RevocationFlag      : ExcludeRoot
VerificationFlags   : NoFlag
VerificationTime    : 17.10.2009 20:35:17
UrlRetrievalTimeout : 00:00:00
ExtraStore          : {}



&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;В принципе, все эти enumeration можно просто указывать в виде строки, а PowerShell уже сам подобъёт его под нужный тип.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; флаги проверки на отзыв можно указывать только по одному, а флаги исключений можно перечислять через запятую. Это видно по названию класса: если класс указан в единственном числе (X509RevocationFlag), то и значение можно указать только одно, а если во множественном числе (X509VerificationFlags), то их можно указать несколько через запятую.&lt;/P&gt;
&lt;P&gt;В принципе, можно делать проверку:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $valid = (dir cert:\currentuser\my)[1]
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $invalid = (dir cert:\currentuser\my)[0]
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.Build($valid)
True
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainElements | select -expand certificate

Thumbprint                                Subject
----------                                -------
986D375362652FE9E39BA4D042A6B8BA75745998  CN=Administrator, CN=Users, DC=sysadmins, DC=lv
E82ACC45841280DDEAB9F7847418FA26354457A7  CN=sysadmins-LV-CA, DC=sysadmins, DC=lv


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Я из локального хранилища взял заведомо хороший сертификат и плохой (разумеется, это сертификат с сайта БиЛайн &lt;img alt=":)" src="/smilies/happy.gif"&gt;). Метод &lt;STRONG&gt;Build()&lt;/STRONG&gt; вернул True, что означает успешную проверку всей цепочки моего сертификата до доверенного корня. А вот что случилось с сертификатом билайна:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.reset()
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.Build($invalid)
False
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainElements | select -expand certificate

Thumbprint                                Subject
----------                                -------
EB74DA32E865C78FCB853DDA5FE45962098E1B3B  CN=trust.beeline.ru, OU=DIT, O=Vimpelcom, L=Moscow, S=Moscow, C=RU


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainStatus

                                                     Status StatusInformation
                                                     ------ -----------------
                                               PartialChain Sertificesanas kedi nevareja veidot pie uzticamas saknes...
                                    RevocationStatusUnknown Atsauksanas funkcija nevareja parbaudit sertifikata atsa...
                                          OfflineRevocation Atsauksanas funkcija nevareja parbaudit atsauksanu, jo a...


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainStatus | %{$_.statusinformation.trim()}
Sertificesanas kedi nevareja veidot pie uzticamas saknes iestades.
Atsauksanas funkcija nevareja parbaudit sertifikata atsauksanu.
Atsauksanas funkcija nevareja parbaudit atsauksanu, jo atsauksanas serveris bija bezsaiste.
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Поскольку при каждой проверке сертификаты в ChainElements накапливаются, то после каждой проверки следует очищать объект методом &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.reset.aspx" target=_blank&gt;&lt;STRONG&gt;Reset()&lt;/STRONG&gt;&lt;/A&gt;. Как и следовало ожидать, сертификат билайна вернул False, показывая, что цепочка у этого сертификата имеет проблемы. В случае неуспешной проверки, будет заполняться свойство &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.chainstatus.aspx" target=_blank&gt;&lt;STRONG&gt;ChainStatus&lt;/STRONG&gt;&lt;/A&gt;. Данное свойство содержит все ошибки, которые были костатированы при проверке цепочки. Для меня пока непонятным стал факт, что ошибки он написал на латышском языке, хотя я его об этом не просил. Откуда он это взял — непонятно, но он сказал, что не смог построить цепочку до доверенного корня и функция проверки отзыва провалилась по всем статьям, поскольку пути в CDP сертификата нерабочие.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; обязательно следует учитывать тот факт, что при построении цепочки сертификатов и проверке доверия класс X509Chain в Windows 7 и Windows Server 2008 R2 работает в контексте &lt;STRONG&gt;LocalSystem&lt;/STRONG&gt; и всегда игнорирует пользовательские контейнеры &lt;STRONG&gt;Trusted Root Certification Authorities&lt;/STRONG&gt;. Поэтому если корень цепочки не заканчивается на одном из сертификатов &lt;STRONG&gt;Trusted Root CAs&lt;/STRONG&gt; хранилища &lt;STRONG&gt;LocalMachine&lt;/STRONG&gt;, то цепочка будет считаться недоверенной. Для предыдущих ОС цепочка может заканчиваться на пользовательском хранилище &lt;STRONG&gt;Current User&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;В принципе это всё, что вам следует знать про реализацию certificate chaining engine в .NET и его использование в PowerShell. В качестве бонуса прилагаю скрипт для проверки цепочки сертификатов:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;####################################################################&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Test-Certificate.ps1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Version 1.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Passes certificate through certificate chaining engine&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Vadims Podans (c) 2009&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; http://www.sysadmins.lv/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;####################################################################&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;requires –Version 2.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Test-Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
[CmdletBinding()]
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;param&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(
        [Parameter(Mandatory &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$true&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, ValueFromPipeline &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$true&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, Position &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)]
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;System.Security.SecureString&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Password&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
        [ValidateSet(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoCheck&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Online&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Offline&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)]
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CRLMode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Online&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
        [ValidateSet(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;EndCertificateOnly&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;EntireChain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ExcludeRoot&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)]
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CRLFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ExcludeRoot&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
        [ValidateSet(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;AllFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;AllowUnknownCertificateAuthority&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreNotTimeValid&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreCtlNotTimeValid&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreNotTimeNested&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreInvalidBasicConstraints&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreWrongUsage&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreInvalidName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreInvalidPolicy&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreEndRevocationUnknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreCtlSignerRevocationUnknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreCertificateAuthorityRevocationUnknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreRootRevocationUnknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)]
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[]]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$VerificationFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
    )
    
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;begin&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; создаём объекты X509Certificate2 и X509chain ещё до поступлениея первого объекта сертификата&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;New-Object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;New-Object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; в X509Chain записываем параметры проверки сертификатов. Как критерии&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; отзыва, так и исключения из проверки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ChainPolicy&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;RevocationFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CRLFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ChainPolicy&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;RevocationMode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CRLMode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ChainPolicy&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;VerificationFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$VerificationFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; мини-функция для предоставления понятного вывода на экран о статусе проверки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; и ошибках в цепочке, если они есть.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_getstatus_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Current&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;SerialNumber&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;and&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;revocation&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;is&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;valid&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ForegroundColor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Green&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
            } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Current certificate $($cert.SerialNumber) chain is invalid due of the following errors:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ChainStatus&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.StatusInformation.trim() &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ForegroundColor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Red&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            }
        }
    }
    
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;process&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если аргумент сертификата уже является объектом X509Certificate2, то&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; сразу строим цепочку и получаем статус цепочки вызывая мини-функцию&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-is&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Build&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_getstatus_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если аргумент не является объектом X509Certificate2, то это будет путь к файлу&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если указанный путь не существует, то ругаемся и выходим&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Test-Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Specified path is invalid&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если путь существует, то проверяем, что это путь файловой системы.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если это не так, то ругаемся и выходим&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ((&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Resolve-Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).Provider.Name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-ne&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FileSystem&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Spicifed path is not recognized as filesystem path. Try again&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
                } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если предварительные проверки прошли успешно, то выбираем объект файла&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; $(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Resolve-Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; и на основании расширения файла через Switch преобразуем файл в&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; X509Certificate2 объект или объекты&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-regex&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Extension) {
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\.CER|\.DER|\.CRT&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Import&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.FullName)}
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\.PFX&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Password&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Password&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Read-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Enter password for PFX file $certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-AsSecureString&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; тут пришлось указать контекст хранилища, куда предполагается сохранить сертификат.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; на самом деле мы никуда не будем сохранять объект сертификата, это было сделано&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; по причине отсутствия подходящего конструктора метода Import(), чтобы&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; можно было указать только путь к файлу и пароль от PFX&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Import&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.FullName, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$password&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UserKeySet&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
                        }
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\.P7B|\.SST&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;New-Object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2Collection&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Import&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;system.IO.File&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ReadAllBytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$file&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.FullName))
                        }
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;default&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Looks like your specified file is not a certificate file&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                    }
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; полученный объект или объекты сертификатов пропускаем через метод Build() и вызываем&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; мини-функцию расшифровки статуса проверки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Build&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_getstatus_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
                    }
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; после каждой итерации очищаем объекты сертификата и цепочки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Reset&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Reset&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
                }
            }
        }
    }
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Данный скрипт может принимать аргументы в виде уже готовых объектов X509Certificate2 или с указанием пути к файлу сертификата, например:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;dir&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; cert:\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;currentuser\my&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Test-Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Test-Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; .\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;mycert.cer&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Ну и при желании можно поуказывать там разные параметры и флаги проверки.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b14ea574-ca90-4f1b-9845-35b6ce273fb2"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
      <category>Security / PKI / Chaining Engine</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=9099b393-27a4-45c1-a9e2-ca39067035de</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,9099b393-27a4-45c1-a9e2-ca39067035de.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,9099b393-27a4-45c1-a9e2-ca39067035de.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=9099b393-27a4-45c1-a9e2-ca39067035de</wfw:commentRss>
      <title>Start/Stop-CertificationAuthority</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,9099b393-27a4-45c1-a9e2-ca39067035de.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,9099b393-27a4-45c1-a9e2-ca39067035de.aspx</link>
      <pubDate>Thu, 15 Oct 2009 16:55:57 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Ещё небольшое дополнение к &lt;STRONG&gt;Certificate Management Pack&lt;/STRONG&gt;, который я сейчас пишу. Данный код позволяет запускать и останавливать службу &lt;STRONG&gt;Certification Authority&lt;/STRONG&gt; на сервере. Поскольку я для решения этой задачи использую WMI, то ремотинг будет обеспечен. Следует учесть, что все команды по управлению службой CA будут расположены за конвейером после команды &lt;A href="http://www.sysadmins.lv/PermaLink,guid,947401b2-312a-4129-860b-4296dfe46cb2.aspx"&gt;Get-CertificationAuthority&lt;/A&gt;. Это было сделано в рамках удобства и стандартизации. Когда мы хотим что-то настроить в CA, то сначала должны указать его имя/объект. Поскольку у нас уже есть готовое решение для этого, то почему бы его и не использовать? Код на самом деле очень простой и в нём разберётся даже новичок:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;####################################################################&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Start-Stop CA.ps1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Version 1.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Starts and stops Certification Authority service on specified CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Requires Get-CertificationAuthority cmdlet:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; http://www.sysadmins.lv/PermaLink,guid,947401b2-312a-4129-860b-4296dfe46cb2.aspx&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Usage:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Get-CertificationAuthority "CAName" | Stop-CertificationAuthority&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; stops CA service on CA named CAName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Get-CertificationAuthority | Start-CertificationAuthority&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; starts all Enterprise CAs in current forest&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Vadims Podans (c) 2009&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; http://www.sysadmins.lv/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;####################################################################&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Start-CertificationAuthority&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;process&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_Service&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ComputerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Name = 'CertSvc'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).StartService()
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.ReturnValue &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.CAName &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Services&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;successfully&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;started&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;on&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ForegroundColor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Green&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unable to start $($CA.CAName) certificate services&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        }
    }
}

&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Stop-CertificationAuthority&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;process&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_Service&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ComputerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Name = 'CertSvc'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).StopService()
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.ReturnValue &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.CAName &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Services&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;successfully&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;stopped&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;on&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ForegroundColor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Green&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unable to stop $($CA.CAName) certificate services&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        }
    }
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Можно сказать, что выносить данные команды в отдельные функции излишне, ведь это можно и самому дописать в свой скрипт. Но можно и не сказать так, ведь представьте, насколько удобно, когда нужная функция у вас уже есть под рукой, и её не надо писать с нуля.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Update:&lt;/FONT&gt;&lt;/STRONG&gt; хочу ещё раз отметить на одну из частых ошибок, которые допускают при написании скриптов в PowerShell. Вы можете просто использовать переменные в двойных кавычках и при использовании этой строки в неё будет подставляться содержимое переменной. Но этого не будет, если вы используете свойство объекта, который хранится в этой переменной, поскольку переменные экспандятся только 1 раз. Этого достаточно для простой переменной, но недостаточно для извлечения содержимого свойста объекта в этой переменной. Ведь сначала нужно извлечь содержимое переменной, а потом прочитать содержимое указанного свойства. Чтобы экспандить такие вещи, переменные в двойных кавычках следует заключать в подвыражение &lt;STRONG&gt;$()&lt;/STRONG&gt;.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=9099b393-27a4-45c1-a9e2-ca39067035de"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,9099b393-27a4-45c1-a9e2-ca39067035de.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=89438ea9-9bec-4070-8d81-f355a2215a8c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,89438ea9-9bec-4070-8d81-f355a2215a8c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,89438ea9-9bec-4070-8d81-f355a2215a8c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=89438ea9-9bec-4070-8d81-f355a2215a8c</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <title>Windows Server 2008 R2 и Windows Backup (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,89438ea9-9bec-4070-8d81-f355a2215a8c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,89438ea9-9bec-4070-8d81-f355a2215a8c.aspx</link>
      <pubDate>Wed, 14 Oct 2009 20:29:30 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В предыдущей части бэкапа в Windows Server 2008 R2 (&lt;a href="http://www.sysadmins.lv/PermaLink,guid,ffb3aa89-0bc0-4de0-9eaf-5866e813afec.aspx"&gt;Windows Server 2008 R2 и Windows Backup (часть 1)&lt;/a&gt;) мы рассмотрели основные моменты создания бэкапа средствами PowerShell. Сегодня мы рассмотрим вопросы самого процесса бэкапа и о его хранении.&lt;/p&gt;  &lt;h1 align="center"&gt;Проверка успешности бэкапа&lt;/h1&gt;  &lt;p&gt;Когда процесс бэкапа закончится, можно посмотреть его статус:&lt;/p&gt;  &lt;div style="width: 935px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Get-WBSummary


NextBackupTime                  : 0001.01.01. 0:00:00
&lt;font color="#ffffff"&gt;&lt;strong&gt;NumberOfVersions                : 5&lt;/strong&gt;&lt;/font&gt;
LastSuccessfulBackupTime        : 2009.10.07. 14:39:42
LastSuccessfulBackupTargetPath  : \\?\Volume{ca6dbf07-14ad-11de-937f-806e6f6e6963}
LastSuccessfulBackupTargetLabel : Camelot Share-1
LastBackupTime                  : 2009.10.07. 14:39:42
LastBackupTarget                : E:
DetailedMessage                 :
&lt;font color="#ffffff"&gt;&lt;strong&gt;LastBackupResultHR              : 0&lt;/strong&gt;&lt;/font&gt;
LastBackupResultDetailedHR      : 0
CurrentOperationStatus          : NoOperationInProgress&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Здесь вы увидите основные сведения о результатах бэкапа. Свойство &lt;strong&gt;LastBackupResultHR&lt;/strong&gt; содержит код возврата. Если это 0, то всё хорошо. Если это не 0, то бэкап не был выполнен удачно. А вот свойство &lt;strong&gt;NumberOfVersions&lt;/strong&gt; показывает сколько уже копий бэкапа содержится в текущем архиве. Более подробно этот момент будет рассмотрен ниже.&lt;/p&gt;

&lt;h1 align="center"&gt;Процесс создания и хранения бэкапа&lt;/h1&gt;

&lt;p&gt;При выполнении бэкапа происходит несколько вещей:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;В корне диска назначения бэкапа создаётся структура папок: &lt;font color="#008000"&gt;&amp;lt;путь до диска или сетевой папки&amp;gt;\WindowsImageBackup\&amp;lt;имя компьютера&amp;gt;&lt;/font&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;После окончания бэкапа система делает теневую копию этого тома (кроме сетевых папок) тома, на котором хранится бэкап.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Обновляется каталог бэкапов.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если это сетевая папка, то в пути &lt;font color="#0000ff"&gt;\\Server\BackupShare\WindowsImageBackup&lt;/font&gt; создаст папку для каждого компьютера и в ней будет хранить бэкап соответствующего компьютера. При этом последующие операции бэкапа будут копировать архив в эту же папку.&amp;#160; Во времена ntbackup.exe мы могли выбирать метод выполнения бэкапа — с использованием VSS или без (это не относилось к SystemState бэкапам), а теперь этот вопрос решён однозначно — VSS используется всегда. Это обусловлено ещё тем, что &lt;em&gt;Server Backup использует VSS для ведения истории бэкапов&lt;/em&gt;, что исключает путаницу в архивных копиях. Внимательные читатели могут заметить, что внутри папки бэкапа есть VHD файл (по одному VHD на каждый архивируемый том), который содержит актуальное состояние бэкапа. И тут появляется интересная вещь: каждый новый бэкап копируется в один VHD файл — а куда же деваются предыдущие копии? На самом деле все они хранятся в этом VHD файле, но скрыты за теневыми копиями, которые создаются при каждой операции бэкапа и закрепляются за архивом:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Get-WBBackupSet


VersionId        : 10/07/2009-10:49
BackupTime       : 2009.10.07. 13:49:41
BackupTarget     : E:
RecoverableItems : Volumes, Files
Volume           : {System (C:)}
Application      : {}
VssBackupOption  : VssCopyBackup
SnapshotId       : 8d6aa8ef-bb24-4ffc-93da-08831bc4ae88

VersionId        : 10/07/2009-11:15
BackupTime       : 2009.10.07. 14:15:36
BackupTarget     : E:
RecoverableItems : Volumes, Files
Volume           : {System (C:)}
Application      : {}
VssBackupOption  : VssCopyBackup
SnapshotId       : ab2c6d39-3447-4c9b-b072-f03d746045c4

&amp;lt;...&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Команда &lt;strong&gt;Get-WBBackupSet&lt;/strong&gt; показывает историю бэкапов системы и &lt;strong&gt;ID&lt;/strong&gt; номер теневой копии, которая содержит файлы архива на момет выполнения конкретного задания бэкапа. При восстановлении из бэкапа консоль MMC считывает эти копии и позволяет восстановить файлы на любой момент времени выполнения бэкапа. Чтобы дать более понятное представление об этом, покажу простой пример:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Выполняется первый бэкап №1. &lt;/li&gt;

  &lt;li&gt;В BackupTarget создаётся папка с архивом и в VHD файл записываются данные, которые мы архивируем; &lt;/li&gt;

  &lt;li&gt;В BackupTarget создаётся теневая копия, которая так же содержит эти файлы и закрепляется за этим бэкапом; &lt;/li&gt;

  &lt;li&gt;Время бэкапа и ID теневой копии записывается в каталог бэкапа; &lt;/li&gt;

  &lt;li&gt;Выполняется следующий бэкап этого же задания под № 2. &lt;/li&gt;

  &lt;li&gt;В BackupTarget уже ничего не создаётся, а новые данные добавляются в VHD файл, скрывая данные из бэкапа №1; &lt;/li&gt;

  &lt;li&gt;В BackupTarget создаётся теневая копия, которая так же содержит новые данные и закрепляется за этим бэкапом (№2); &lt;/li&gt;

  &lt;li&gt;Время бэкапа и ID теневой копии записывается в каталог бэкапа. &lt;/li&gt;

  &lt;li&gt;повторяются пункты 5-8. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Несмотря на то, что при непосредственном просмотре VHD файла мы видим только данные сохранённые после последней операции бэкапа, в нём по прежнему хранятся и все предыдущие копии, которые система различает по теневым копиям, которые закреплены за каждым бэкапом. Именно здесь теневые копии играют огромную роль в хранении истории бэкапа. И пока эти теневые копии живы, мы имеем доступ к предыдущим версиям файлов внутри VHD архива. Это даёт следующие преимущества:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;больше нет кучи файлов архивов, которые нужно самому собирать в какое-то хранилище и как-то идентифицировать; &lt;/li&gt;

  &lt;li&gt;для восстановления файлов и томов не обязательно наличие самого бэкапа. Ведь теневая копия, которая закрепляется за этим бэкапом тоже может использоваться для восстановления. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В большинстве случаев это решение будет являться достаточным для любых операций восстановления. Единственное критичное место здесь будет наличие этих теневых копий. Это может вызвать трудности только при повреждении теневых копий на архивном томе. Но обычно это уже будет означать потерю всех бэкапов. Такие дела.&lt;/p&gt;

&lt;h1 align="center"&gt;Как долго хранятся бэкапы на архивном томе?&lt;/h1&gt;

&lt;p&gt;Хранятся они там сколь угодно долго, пока есть свободное место. Когда свободное место заканчивается, то Server Backup автоматически пытается отыскать себе место. Если у нас выполняются только полные бэкапы, то наиболее старые версии архивов просто удаляются. Если у нас комбинируются полные бэкапы с инкрементальными/дифференциальными, то берётся наиболее старый архив и в него вписываются инкрементальные/дифференциальные архивы, которые были выполнены в промежутках между полными бэкапами до тех пор, пока не освободится достаточно для нового бэкапа места. Таким образом обеспечивается сохранность наиболее новых архивов с удалением более старых. Такая схема автоматической ротации так же будет востребована в большинстве случаев. Для экономии места Server Backup для запланированного задания автоматически делает комбинирование полных и инкрементальных бэкапов. Каждые 2 недели выполняется полный бэкап и ежедневно в промежутках между полными будет выполняться только инкрементальное архивирование.&lt;/p&gt;

&lt;p&gt;Такая автонастройка режимов для запланированных бэкапов и авторотация будет достаточно эффективна и проста в сегменте SOHO/SMB, не отвлекая на себя слишком много внимания администратора. От администратора потребуется только создание задания и организация отказоустойчивости тома с архивами.&lt;/p&gt;

&lt;h1 align="center"&gt;Совмещение нескольких заданий и индивидуальная ротация архивов&lt;/h1&gt;

&lt;p&gt;Разработчики Server Backup сделали всё, чтобы упростить процесс выполнения бэкапа в стандартных случаях SOHO/SMB. Но когда появляются особые условия, то тут начинаются свои сложности, хотя это всё относительно преодолимо. Например, вы создали несколько заданий бэкапов, которые отдельно что-то архивируют в одну и ту же точку. Но к каждому заданию предъявляются свои требования по сроку хранения бэкапа.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Пример:&lt;/strong&gt; это файл-сервер и вы архивируете папку с документами пользователей ежедневно и следует хранить только 7 последние копии. Другое задание архивирует инсталляционные файлы вашей сети раз в неделю и требуется наличие только 4 последних копий. Так же все копии должны копироваться в сетевую папку или на съёмный диск на случай катастрофы и/или &lt;a href="http://lurkmore.ru/%D0%90%D0%B4_%D0%B8_%D0%B8%D0%B7%D1%80%D0%B0%D0%B8%D0%BB%D1%8C" target="_blank"&gt;ада и Израиля&lt;/a&gt;. В такой ситуации мы потеряем возможность использования авторотации архивов и прочих плюшек. Давайте посмотрим, как будет выглядеть примерный скрипт:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; подключаем оснастку Server Backup&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-PSSnapin&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Windows.Serverbackup&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём задание бэкапа&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$profiles&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-WBPolicy&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём и добавляем в задание бэкапа архивируемую папку&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$source&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-WBFileSpec&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-FileSpec&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;D:\Users&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-WBFileSpec&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Policy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$profiles&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-FileSpec&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$source&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; указываем локальный том, на который будет копироваться архив&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$target&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-WBBackupTarget&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-VolumePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;E:&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-WBBackupTarget&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Policy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$profiles&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Target&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$target&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выполняем бэкап&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Start-WBBackup&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Policy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$profiles&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем код возврата с результатом выполнения бэкапа&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; ((&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-WBSummary&lt;/span&gt;&lt;span style="color: #000000"&gt;).LastBackupResultHR &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; переименовываем архив в более понятное имя&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$newname&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Profiles_$(Get-Date -f dd.MM.yyyy)&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Ren&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;E:\WindowsImageBackup&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-NewName&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$newname&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; копируем архив в сетевую папку&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;copy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;e:\$newname&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;\\server\backups\profiles&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; удаляем все архивы из сетевой папки, которые старше 7 дней&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;\\server\backups\profiles&lt;/span&gt;&lt;span style="color: #000000"&gt; | ?{&lt;/span&gt;&lt;span style="color: #800080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.lastwritetime &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-Date&lt;/span&gt;&lt;span style="color: #000000"&gt;).AddDays(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt;)} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;del&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; ругаемся, что бэкап не был завершён успешно&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;font color="#00afff"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;И уже этот файл отдельно зашедулить в &lt;strong&gt;Task Scheduler&lt;/strong&gt;. В такой ситуации дополнительных шагов не требуется, т.к. пока живы теневые копии, вы можете восстанавливать файлы из них (наличие самого архива не требуется). А если теневых копий уже не осталось (например, том с архивами был отформатирован), то для восстановления данных просто копируете папку с архивом в корень любого тома с именем &lt;strong&gt;WindowsImageBackup&lt;/strong&gt; и тогда этот архив будет определён системой как пригодный для восстановления. Так вы можете делать несколько раздельных заданий с индивидуальным расписанием бэкапа и ротацией.&lt;/p&gt;

&lt;p&gt;Если ротация архивов в сетевой папке достаточно проста и укладывается в одну строчку, то с локальными архивами придётся подключать утилиты CMD, а именно — &lt;strong&gt;diskshadow.exe&lt;/strong&gt;! Вам нужно внутри diskshadow выполнить &lt;font color="#0000ff"&gt;Delete Shadows ID {GUID}&lt;/font&gt;, где &lt;strong&gt;GUID&lt;/strong&gt; — &lt;strong&gt;ID&lt;/strong&gt; теневой копии, которая закреплена за конкретным бэкапом и его можно получить из вывода &lt;strong&gt;Get-WBBackupSet&lt;/strong&gt; (свойство &lt;strong&gt;SnapshotID&lt;/strong&gt;)&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] diskshadow
Microsoft DiskShadow version 1.0
Copyright (C) 2007 Microsoft Corporation
On computer:  CAMELOT,  2009.10.13. 22:18:05


DISKSHADOW&amp;gt; delete shadows ID {8d6aa8ef-bb24-4ffc-93da-08831bc4ae88}
Deleting shadow copy {8d6aa8ef-bb24-4ffc-93da-08831bc4ae88}...

1 shadow copy deleted.

DISKSHADOW&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Вот таким образом можно удалять старые теневые копии архивов по одиночке. При удалении теневой копии при следующей операции бэкапа будет обновлён каталог бэкапов. Чтобы удалить все предыдущие архивы кроме текущего внутри diskshadow нужно выполнить:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;Delete Shadows Oldest E:&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;где &lt;strong&gt;E:&lt;/strong&gt; — путь к тому с архивами.&lt;/p&gt;

&lt;p&gt;Сами данные из VHD файла будут удалены только при следующей операции бэкапа. Однако, это не относится к архивам, которые содержат &lt;strong&gt;SystemState&lt;/strong&gt;. Для ротации архивов SystemState придётся воспользоваться уже другой утилитой — &lt;strong&gt;wbadmin.exe&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;wbadmin delete systemstatebackup –version: datetime&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;где datetime — дата и время выполнения бэкапа. Эту дату можно получить так же из вывода командлета &lt;strong&gt;Get-WBBackupSet&lt;/strong&gt; (свойство &lt;strong&gt;VersionID&lt;/strong&gt;). Чтобы удалить все бэкапы SystemState, кроме текущего следует выполнить:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;wbadmin delete systemstatebackup –backuptarget:E: –deleteoldest&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;и для удаления всех наиболее старых архивов SystemState с сохранением N копий выполнить:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;wbadmin delete systemstatebackup –keepversions:N&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;где &lt;strong&gt;N&lt;/strong&gt; — количество копий SystemState, которые должны быть сохранены.&lt;/p&gt;

&lt;p&gt;Исходя из изученного нами материала можно сделать такую вещь: локально хранить стандартный архив с несколькими заданиями бэкапа, а в сетевой папке каждый тип архива отдельно и применять к ним раздельную ротацию. Единственное, что мне пришло на ум — использовать CSV файл для каталогизации теневых копий. Вот как это примерно выглядит:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; подключаем оснастку Server Backup&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-PSSnapin&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Windows.Serverbackup&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём задание бэкапа&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$profiles&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-WBPolicy&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём и добавляем в задание бэкапа архивируемую папку&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$source&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-WBFileSpec&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-FileSpec&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;D:\Users&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-WBFileSpec&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Policy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$profiles&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-FileSpec&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$source&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; указываем локальный том, на который будет копироваться архив&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$target&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-WBBackupTarget&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-VolumePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;E:&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-WBBackupTarget&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Policy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$profiles&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Target&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$target&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выполняем бэкап&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Start-WBBackup&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Policy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$profiles&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем код возврата с результатом выполнения бэкапа&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; ((&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-WBSummary&lt;/span&gt;&lt;span style="color: #000000"&gt;).LastBackupResultHR &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; переименовываем архив в более понятное имя&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$newname&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Profiles_$(Get-Date -f dd.MM.yyyy)&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Ren&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;E:\WindowsImageBackup&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-NewName&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$newname&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; копируем архив в сетевую папку&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;copy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;e:\$newname&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;\\server\backups\profiles&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; удаляем все архивы из сетевой папки, которые старше 7 дней&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;\\server\backups\profiles&lt;/span&gt;&lt;span style="color: #000000"&gt; | ?{&lt;/span&gt;&lt;span style="color: #800080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.lastwritetime &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-Date&lt;/span&gt;&lt;span style="color: #000000"&gt;).AddDays(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt;)} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;del&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; читаем наш собственный каталог бэкапов&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$csv&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Import-Csv&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;E:\ProfileBackup.csv&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и считаем сколько там записей&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$count&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$csv&lt;/span&gt;&lt;span style="color: #000000"&gt;.count
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если записей больше 7, то считаем сколько лишних архивов нужно удалить.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если меньше 7 записей, то ничего удалять не надо и просто добавляем новую запись&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$count&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-gt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$old&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$count&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; генерируем случайное имя для скрипта, который будет использоваться в diskshadow&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.IO.Path&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetRandomFileName&lt;/span&gt;&lt;span style="color: #000000"&gt;()
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выбираем все лишние архивы и пропускаем их по конвейеру на удаление&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$csv&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;sort&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-First&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$old&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записываем команду во временный файл&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;delete shadows ID {$($_.SnapshotID)}&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &amp;gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Env:TEMP&lt;/span&gt;&lt;span style="color: #000000"&gt;\&lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и запускаем diskshadow в режиме скрипта&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;            diskshadow -s &lt;/span&gt;&lt;span style="color: #800080"&gt;$Env:TEMP&lt;/span&gt;&lt;span style="color: #000000"&gt;\&lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;del&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Env:TEMP&lt;/span&gt;&lt;span style="color: #000000"&gt;\&lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; считываем данные о последнем бэкапе&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-WBBackupSet&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Last&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;  | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; VersionID, &lt;/span&gt;&lt;span style="color: #800000"&gt;SnapshotId&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и добавляем его в массив объектов действующих бэкапов&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$csv&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; чтобы не было путаницы, снова сортируем объекты и пишем обратно в CSV файл&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$csv&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;sort&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Last&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;7&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Export-Csv&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;E:\ProfileBackup.csv&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-NoTypeInformation&lt;/span&gt;&lt;span style="color: #000000"&gt;
} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; ругаемся, что бэкап не был завершён успешно&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;В принципе, это только один вариант реализации подобной задачи и не обвешена никакими проверками. Однако, учитывая, что данный код публикуется на правах &lt;strong&gt;ТЗ&lt;/strong&gt; (&lt;strong&gt;ТЗ&lt;/strong&gt; — &lt;em&gt;Тайное Знание&lt;/em&gt;), поэтому может использоваться как шаблон алгоритма такой кастомной ротации. Данный скрипт только демонстрирует логику, которой вы можете воспользоваться и подпилить под свои условия самостоятельно.&lt;/p&gt;

&lt;p&gt;Вот и всё, наверное, что я хотел рассказать про бэкап в Windows Server 2008 R2. В Windows 7 нет командлетов для бэкапа,&amp;#160; поэтому свои хотелки придётся реализовывать только средствами CMD (&lt;strong&gt;wbadmin&lt;/strong&gt;, &lt;strong&gt;vssadmin&lt;/strong&gt;, &lt;strong&gt;diskshadow&lt;/strong&gt;). И это будет значительно сложнее, чем вариант с командлетами повершела.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=89438ea9-9bec-4070-8d81-f355a2215a8c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,89438ea9-9bec-4070-8d81-f355a2215a8c.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Server Backup</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=ffb3aa89-0bc0-4de0-9eaf-5866e813afec</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,ffb3aa89-0bc0-4de0-9eaf-5866e813afec.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,ffb3aa89-0bc0-4de0-9eaf-5866e813afec.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=ffb3aa89-0bc0-4de0-9eaf-5866e813afec</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Windows Server 2008 R2 и Windows Backup (часть 1)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,ffb3aa89-0bc0-4de0-9eaf-5866e813afec.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,ffb3aa89-0bc0-4de0-9eaf-5866e813afec.aspx</link>
      <pubDate>Wed, 07 Oct 2009 20:43:07 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;2 недели назад я выступал на рижском &lt;strong&gt;IT Pro&lt;/strong&gt; с темой бэкапа в &lt;strong&gt;Windows Server 2008 R2&lt;/strong&gt; с помощью &lt;strong&gt;PowerShell&lt;/strong&gt;. Доклад получится немного скомканный и на ряд вопров из зала я не смог ответить, т.к. эти вопросы требуют достаточно много времени на формулировку ответа. Поэтому я здесь подниму этот вопрос снова и постараюсь ответить на неотвеченные вопросы.&lt;/p&gt;  &lt;p&gt;Я думаю, что уже все знают про отсутствие &lt;strong&gt;ntbackup.exe&lt;/strong&gt; в системах начиная с Windows Server 2008. Его теперь заменяет отдельный системный компонент &lt;strong&gt;Windows Backup&lt;/strong&gt; (или &lt;strong&gt;Server Backup&lt;/strong&gt;) и, который, устанавливается как компонент сервера в оснастке &lt;strong&gt;Server Manager&lt;/strong&gt;. Первая версия Server Backup была достаточно грубой и примитивной. Она позволяла бэкапить только тома целиком блочным методом без возможности выбора отдельных файлов и папок. Блочный метод работает на уровень ниже, чем файловая система, поэтому никакой речи о файлах быть не могло. Так же ему требовался выделенный том под хранение бэкапа и при инициализации тома под бэкапы, он форматировался. Бэкап &lt;strong&gt;SystemState&lt;/strong&gt; производился отдельно и его нельзя было включить в состав бэкапа отдельного тома. Иными словами, первая версия была непотребна чуть более чем полностью, поэтому в отношении него говорить просто не о чем.&lt;/p&gt;  &lt;p&gt;С выходом Windows Server 2008 R2 ситуация немного улучшилась. После тысяч жалоб от покупателей и срачей на форумах в новой системе добавился бэкап на уровне файловой системы (как и ntbackup), сохранив и улучшив первоначальную версию Server Backup. Новая версия бэкапа отличается следующими характеристиками по сравнению с первой версией:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Добавлена возможность бэкапа файлов и папок &lt;/li&gt;    &lt;li&gt;Добавлена возможность комбинирования объектов бэкапа. Например, к бэкапу отдельных папок и файлов можно добавлять бэкап SystemState &lt;/li&gt;    &lt;li&gt;Теперь можно делать инкрементальный бэкап для SystemState (включено по умолчанию) &lt;/li&gt;    &lt;li&gt;Улучшенная поддержка PowerShell &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Как и раньше, командлеты для Server Backup поставляются в виде отдельной оснастки, которая подключается командой:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-PSSnapin&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Windows.ServerBackup&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И все командлеты для бэкапа будут иметь префикс &lt;strong&gt;WB&lt;/strong&gt; (от Windows Backup):&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Add-PSSnapin windows.serverbackup
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] gcm *-wb*

CommandType     Name                                                Definition
-----------     ----                                                ----------
Cmdlet          Add-WBBackupTarget                                  Add-WBBackupTarget [-Policy] &lt;wbpolicy&gt; [-Target...
Cmdlet          Add-WBBareMetalRecovery                             Add-WBBareMetalRecovery [-Policy] &lt;wbpolicy&gt; [-V...
Cmdlet          Add-WBFileSpec                                      Add-WBFileSpec [-Policy] &lt;wbpolicy&gt; [-FileSpec] ...
Cmdlet          Add-WBSystemState                                   Add-WBSystemState [-Policy] &lt;wbpolicy&gt; [-Verbose...
Cmdlet          Add-WBVolume                                        Add-WBVolume [-Policy] &lt;wbpolicy&gt; [-Volume] &lt;wbv...&gt;&lt;wbpolicy cmdlet get-wbbackuptarget [-Policy]&gt;&lt;wbbackuptarget... get-wbbackupset [[-BackupTarget]&gt; [-Verbos...
Cmdlet          Get-WBBareMetalRecovery                             Get-WBBareMetalRecovery [-Policy] &lt;wbpolicy&gt; [-V...
Cmdlet          Get-WBDisk                                          Get-WBDisk [-Verbose] [-Debug] [-ErrorAction &lt;ac...&gt;&lt;wbpolicy cmdlet [-Policy] Get-WBFileSpec&gt; [-Ve...
Cmdlet          Get-WBJob                                           Get-WBJob [[-Previous] &lt;uint32&gt;] [-Verbose] [-De...
Cmdlet          Get-WBPolicy                                        Get-WBPolicy [-Editable] [-Verbose] [-Debug] [-E...
Cmdlet          Get-WBSchedule                                      Get-WBSchedule [-Policy] &lt;wbpolicy&gt; [-Verbose] [...
Cmdlet          Get-WBSummary                                       Get-WBSummary [-Verbose] [-Debug] [-ErrorAction ...
Cmdlet          Get-WBSystemState                                   Get-WBSystemState [-Policy] &lt;wbpolicy&gt; [-Verbose...
Cmdlet          Get-WBVolume                                        Get-WBVolume [-Disk] &lt;wbdisk&gt; [-Verbose] [-Debug...
Cmdlet          Get-WBVssBackupOptions                              Get-WBVssBackupOptions [-Policy] &lt;wbpolicy&gt; [-Ve...
Cmdlet          New-WBBackupTarget                                  New-WBBackupTarget [-Disk] &lt;wbdisk&gt; [[-Label] &lt;s... cmdlet&gt;&lt;string  [] New-WBFileSpec [-FileSpec]&gt; [-NonRecur...
Cmdlet          New-WBPolicy                                        New-WBPolicy [-Verbose] [-Debug] [-ErrorAction &amp;lt;...
Cmdlet          Remove-WBBackupTarget                               Remove-WBBackupTarget [-Policy] &lt;wbpolicy&gt; [-Tar...
Cmdlet          Remove-WBBareMetalRecovery                          Remove-WBBareMetalRecovery [-Policy] &lt;wbpolicy&gt; ...
Cmdlet          Remove-WBFileSpec                                   Remove-WBFileSpec [-Policy] &lt;wbpolicy&gt; [-FileSpe...
Cmdlet          Remove-WBPolicy                                     Remove-WBPolicy [[-Policy] &lt;wbpolicy&gt;] [-All] [-...
Cmdlet          Remove-WBSystemState                                Remove-WBSystemState [-Policy] &lt;wbpolicy&gt; [-Verb...
Cmdlet          Remove-WBVolume                                     Remove-WBVolume [-Policy] &lt;wbpolicy&gt; [-Volume] &amp;lt;...
Cmdlet          Set-WBPolicy                                        Set-WBPolicy [-Policy] &lt;wbpolicy&gt; [-Force] [-Ver...
Cmdlet          Set-WBSchedule                                      Set-WBSchedule [-Policy] &lt;wbpolicy&gt; [-Schedule] ...
Cmdlet          Set-WBVssBackupOptions                              Set-WBVssBackupOptions [-Policy] &lt;wbpolicy&gt; [-Vs...
Cmdlet          Start-WBBackup                                      Start-WBBackup [-Policy] &lt;wbpolicy&gt; [-Async] [-F...


&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Мы видим достаточно приличное количество командлетов и часть из них мы используем для работы. Все задания бэкапов в ServerBackup являются политиками бэкапа. Следовательно, командлетом &lt;strong&gt;New-WBPolicy&lt;/strong&gt; мы будем создавать каждое задание бэкапа:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $pol = New-WBPolicy
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $pol


Schedule            :
BackupTargets       :
VolumesToBackup     :
FilesSpecsToBackup  :
FilesSpecsToExclude :
BMR                 : False
SystemState         : False
VssBackupOptions    : VssCopyBackup



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Мы создали объект новой политики бэкапа, который имеет ряд свойств. Эти свойства по названиям уже отражают своё назначение. Давайте сначала выберем объекты бэкапа. Например, добавим какую-нибудь папку, которую мы захотим бэкапить. Новые объекты бэкапа создаются в 2 этапа:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Создание самого объекта командой &lt;strong&gt;New-WBFileSpec&lt;/strong&gt; &lt;/li&gt;

  &lt;li&gt;Добавление этого объекта в политику бэкапа командой &lt;strong&gt;Add-WBFileSpec&lt;/strong&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Будь то отдельная папка или отдельный том. Это не относится только к &lt;strong&gt;Bare Metal Recovery&lt;/strong&gt; (полный бэкап системного тома, SystemState и всех системных файлов) и к самому SystemState. Они могут сразу добавляться в политику.&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $source1 = New-WBFileSpec -FileSpec &amp;quot;C:\Users&amp;quot;
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $source1 | ft -a

FilePath  FileName IsRecursive IsIncludeSpec
--------  -------- ----------- -------------
C:\Users\ *               True          True


&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $exclusion = New-WBFileSpec -FileSpec &amp;quot;C:\Users\vpodans&amp;quot; -Exclude
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $exclusion | ft -a

FilePath          FileName IsRecursive IsIncludeSpec
--------          -------- ----------- -------------
C:\Users\vpodans\ *               True         False


&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $source2 = New-WBFileSpec -FileSpec &amp;quot;D:\Users&amp;quot; -NonRecursive
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $source2 | ft -a

FilePath  FileName IsRecursive IsIncludeSpec
--------  -------- ----------- -------------
D:\Users\ *              False          True


&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $source1, $source2, $exclusion | Add-WBFileSpec -Policy $pol
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $pol


Schedule            :
BackupTargets       :
VolumesToBackup     :
FilesSpecsToBackup  : {C:\Users\*, D:\Users\*}
FilesSpecsToExclude : {C:\Users\vpodans\*}
BMR                 : False
SystemState         : False
VssBackupOptions    : VssCopyBackup



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Первой командой мы задали бэкап всей папки &lt;strong&gt;C:\Users&lt;/strong&gt;. Второй командой мы посмотрели объект этой точки. Как видно из таблички, эта папка будет бэкапить полностью включая все подпапки. Но я не хочу бэкапить папку профиля одного из пользователей. Для этого в командлете &lt;strong&gt;New-WBFileSpec&lt;/strong&gt; есть ключ &lt;strong&gt;–Exclude&lt;/strong&gt;, который исключит эту папку из бэкапа. В следующей строке это видно по состоянию свойства &lt;strong&gt;IsIncludeSpec = $false&lt;/strong&gt;. И чтобы исключить рекурсивную обработку папки (т.е. нам нужно бэкапить содержимое только текущей папки не трогая подпапки совсем) для неё достаточно указать ключ &lt;strong&gt;–NonRecursive&lt;/strong&gt;. под каждую категорию вы можете добавлять пути для бэкапа через запятую в одной команде. Но для каждой категории надо писать новую команду. В конце мы видим, что наша политика уже обросла какими-то данными. Если мы захотим сюда добавить ещё бэкап целого тома или физического диска, то нам уже придётся работать с командлетами &lt;strong&gt;Get/Add-WBDisk&lt;/strong&gt; и &lt;strong&gt;Get/Add-WBVolume&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Get-WBDisk


DiskName       : WDC WD3200JS-00PDB0 ATA Device
DiskNumber     : 1
DiskId         : d5fae841-0000-0000-0000-000000000000
TotalSpace     : 320072933376
FreeSpace      : 3591163904
Volumes        : {New Volume (S:\VM\Core), Camelot Share-2 (F:)}
ContainsBackup : False
BackupVolumeId : 00000000-0000-0000-0000-000000000000
Properties     : Dynamic, ValidTarget

&amp;lt;...&amp;gt;
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $disk = Get-WBDisk | ?{$_.disknumber -eq 1}
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Get-WBVolume -Disk $disk


VolumeLabel : New Volume
MountPath   : S:\VM\Core
MountPoint  : \\?\Volume{06d04bb0-1949-11de-a731-001fd08fc2f1}
FileSystem  : NTFS
Property    : ValidSource
FreeSpace   : 2133585920
TotalSpace  : 18875416576

VolumeLabel : Camelot Share-2
MountPath   : F:
MountPoint  : \\?\Volume{62bda1e6-b515-4102-b03f-40b7896ab0f3}
FileSystem  : NTFS
Property    : ValidSource
FreeSpace   : 1453031424
TotalSpace  : 301192970240



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Командлет &lt;strong&gt;Get-WBDisk&lt;/strong&gt; отобразит нам все физические диски, которые подключены к системе (с учётом аппаратного рейда, разумеется). Если захотим добавить этот диск в бэкап, то отфильтровываем через &lt;strong&gt;Where-Object&lt;/strong&gt; (или просто вопросительный знак) и добавляем его в политику командой &lt;strong&gt;Add-WBDisk&lt;/strong&gt;. Get-WBDisk нам так же потребуется и для просмотра логических томов, поскольку &lt;strong&gt;Get-WBVolume&lt;/strong&gt; в качестве аргумента принимает только объекты, полученные от команды Get-WBDisk. Т.е. сначала выбираем диск и только потом просматриваем нужные тома. И отфильтровав нужный том добавляем в политику, например:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Get-WBVolume -Disk $disk


VolumeLabel : New Volume
MountPath   : S:\VM\Core
MountPoint  : \\?\Volume{06d04bb0-1949-11de-a731-001fd08fc2f1}
FileSystem  : NTFS
Property    : ValidSource
FreeSpace   : 2133585920
TotalSpace  : 18875416576

VolumeLabel : Camelot Share-2
MountPath   : F:
MountPoint  : \\?\Volume{62bda1e6-b515-4102-b03f-40b7896ab0f3}
FileSystem  : NTFS
Property    : ValidSource
FreeSpace   : 1453031424
TotalSpace  : 301192970240



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $volume = Get-WBVolume -Disk $disk | ?{$_.volumelabel -eq &amp;quot;new volume&amp;quot;}
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Add-WBVolume -Policy $pol -Volume $volume


VolumeLabel : New Volume
MountPath   : S:\VM\Core
MountPoint  : \\?\Volume{06d04bb0-1949-11de-a731-001fd08fc2f1}
FileSystem  : NTFS
Property    : ValidSource
FreeSpace   : 2133585920
TotalSpace  : 18875416576



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $pol


Schedule            :
BackupTargets       :
VolumesToBackup     : {New Volume (S:\VM\Core)}
FilesSpecsToBackup  : {C:\Users\*, D:\Users\*}
FilesSpecsToExclude : {C:\Users\vpodans\*}
BMR                 : False
SystemState         : False
VssBackupOptions    : VssCopyBackup



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Если я вдруг не захочу уже бэкапить добавленный том, то его можно спокойно удалить (фактически командами Remove-WB* можно удалить что угодной из политики):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;Remove-WBVolume -Policy $pol -Volume $volume&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Теперь настало время выбрать точки, в которые мы будем копировать наш бэкап. Точки назначения добавляются в бэкап тоже задаются в 2 этапа:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;New-WBBackupTarget&lt;/strong&gt; — создаёт объект точки назначения бэкапа &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Add-WBBackupTarget&lt;/strong&gt; — добавляет эту точку в политику бэкапа &lt;/li&gt;
&lt;/ol&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $target = New-WBBackupTarget -VolumePath &amp;quot;F:&amp;quot;
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $target = New-WBBackupTarget -VolumePath &amp;quot;E:&amp;quot;
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Add-WBBackupTarget -Policy $pol -Target $target


Label                  : Camelot Share-1
WBDisk                 :
WBVolume               : Camelot Share-1 (E:)
Path                   : \\?\Volume{ca6dbf07-14ad-11de-937f-806e6f6e6963}
TargetType             : Volume
InheritAcl             : False
PreserveExistingBackup : False



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $pol


Schedule            :
BackupTargets       : {E:}
VolumesToBackup     : {}
FilesSpecsToBackup  : {C:\Users\*, D:\Users\*}
FilesSpecsToExclude : {C:\Users\vpodans\*}
BMR                 : False
SystemState         : False
VssBackupOptions    : VssCopyBackup



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Вы так же можете указать бэкап сразу в сеть. Для этого в команде &lt;strong&gt;New-WBBackupTarget&lt;/strong&gt; вместо параметра &lt;strong&gt;–VolumePath&lt;/strong&gt; использовать параметр &lt;strong&gt;–NetworkPath&lt;/strong&gt; и за ним уже указывать UNC путь к сетевой папке. Однако, следует учесть несколько нюансов:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;При бэкапе в сеть исходный размер копируемых данных неизвестен, в связи с чем будет катастрофически расти фрагментация в сетевой папке &lt;/li&gt;

  &lt;li&gt;В сети вы можете поддерживать только одну актуальную копию бэкапа. Последующие бэкапы в эту же папку будут перезаписывать предыдущие архивы &lt;/li&gt;

  &lt;li&gt;Вы не можете одновременно делать бэкап на локальный том или диск и в сеть. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; хелп заявляет, что бэкап можно одновременно копировать на несколько томов/дисков. Мне ещё неизвестна полностью природа всего происходящего и только могу констатировать факт, что физически бэкап копируется только на первый указанный том или диск.&lt;/p&gt;

&lt;p&gt;Теперь у нас есть 2 варианта: начать выполнение бэкапа немедленно, или регистрация нашей политике в системе для периодического выполнения в автоматическом режиме (по внутреннему шедулеру). В первом случае достаточно выполнить команду:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;Start-WBBackup –Policy $pol&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;или зашедулить командой &lt;strong&gt;Set-WBSchedule&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Set-WBSchedule -Policy $pol -Schedule &amp;quot;10.08.2009 21:00&amp;quot;

tresdiena, 2009. gada 7. oktobri 21:00:00


&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] $pol


Schedule            : {2009.10.07. 21:00:00}
BackupTargets       : {E:}
VolumesToBackup     : {}
FilesSpecsToBackup  : {C:\Users\*, D:\Users\*}
FilesSpecsToExclude : {C:\Users\vpodans\*}
BMR                 : False
SystemState         : False
VssBackupOptions    : VssCopyBackup



&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [Administrator] Set-WBPolicy –Policy $pol&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;И командой Set-WBPolicy наша политика регистрируется в системе. Шедулинг следует указывать в следующей форме:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#008000"&gt;Month.Day.Year Hours:Minutes&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;И теперь каждый день в 21:00 будет выполняться наше задание.&lt;/p&gt;

&lt;p&gt;Сегодня мы рассмотрели основные моменты создания политики бэкапа в Windows Server 2008 R2 с использованием PowerShell. В следующей (или следующих) рассмотрим вопросы управления этими политиками и вопросы каталогизации/ротации архивов.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=ffb3aa89-0bc0-4de0-9eaf-5866e813afec"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,ffb3aa89-0bc0-4de0-9eaf-5866e813afec.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Server Backup</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=947401b2-312a-4129-860b-4296dfe46cb2</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,947401b2-312a-4129-860b-4296dfe46cb2.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,947401b2-312a-4129-860b-4296dfe46cb2.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=947401b2-312a-4129-860b-4296dfe46cb2</wfw:commentRss>
      <title>Get-CertificationAuthority</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,947401b2-312a-4129-860b-4296dfe46cb2.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,947401b2-312a-4129-860b-4296dfe46cb2.aspx</link>
      <pubDate>Tue, 06 Oct 2009 18:15:39 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;А знаете ли вы как можно легко получить список всех Enterprise CA в текущем домене? А в текущем лесу? Оказывается это очень легко! &lt;STRONG&gt;ADSI&lt;/STRONG&gt; — самый лучший способ, если вы хотите пошариться в своей базе AD. Список таких CA находится по пути:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;CN=Enrollment Services, CN=Public Key Services, CN=Services, CN=Configuration, DC=Domain, DC=COM&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Последние 2 значения уже будут отличаться в зависимости от имени домена. Чтобы получить список объектов по этому пути нужно просто создать соответствующий LDAP объект. Объект делается просто, сначала указывается тип объекта [ADSI], следом идёт префикс ссылки &lt;STRONG&gt;LDAP://&lt;/STRONG&gt; (почти как HTTP://) и после префикса уже этот путь (который называется &lt;STRONG&gt;Distinguished Name&lt;/STRONG&gt; или просто &lt;STRONG&gt;DN&lt;/STRONG&gt;):&lt;/P&gt;
&lt;DIV style="WIDTH: 925px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;[Administrator] $CA = [ADSI]"LDAP://CN=Enrollment Services, CN=Public Key Services, CN=Services, CN=Configuration, DC=co
ntoso,DC=COM"
[Administrator] $CA


distinguishedName : {CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=contoso,DC=com}
Path              : LDAP://CN=Enrollment Services, CN=Public Key Services, CN=Services, CN=Configuration, DC=contoso,DC
                    =COM
[Administrator] $CA.distinguishedName
CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=contoso,DC=com&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Если посмотреть этот путь в &lt;STRONG&gt;ADSIEdit.msc&lt;/STRONG&gt;, то мы увидим, что это контейнер. А раз это контейнер, то нам нужно в него заглянуть. Здесь, к сожалению, нельзя сделать &lt;FONT color=#0000ff&gt;dir $CA.distinguishedName&lt;/FONT&gt;, а так хочется. Чтобы посмотреть содержимое нужно использовать свойство &lt;STRONG&gt;Children&lt;/STRONG&gt; (ворненк, дети отаке!):&lt;/P&gt;
&lt;DIV style="WIDTH: 925px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;[Administrator] $ca.Children


distinguishedName : {CN=contoso-DC2-CA,CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=co
                    ntoso,DC=com}
Path              : LDAP://CN=contoso-DC2-CA,CN=Enrollment Services,CN=Public Key Services, CN=Services, CN=Configurati
                    on, DC=contoso,DC=COM

distinguishedName : {CN=Contoso CA,CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=contos
                    o,DC=com}
Path              : LDAP://CN=Contoso CA,CN=Enrollment Services,CN=Public Key Services, CN=Services, CN=Configuration,
                    DC=contoso,DC=COM



[Administrator]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Уже отсюда невооружённым глазом видны имена CA. Собственно, можно показать только имя самого CA и компьютера, на котором работает этот CA:&lt;/P&gt;
&lt;DIV style="WIDTH: 925px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;[Administrator] $ca.Children | ft Name, DNSHostName

Name                                                        DNSHostName
----                                                        -----------
{contoso-DC2-CA}                                            {dc2.contoso.com}
{Contoso CA}                                                {DC1.contoso.com}


[Administrator]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Здесь есть один важный нюанс. Если получить этот LDAP объект в PowerShell 1.0, то он будет содержать только Distinguished Name, а свойство Children будет отсутствовать в нём. Для этого нужно воспользоваться свойством PSBase, в котором уже будет &lt;STRONG&gt;Children&lt;/STRONG&gt;. Командой &lt;STRONG&gt;Select&lt;/STRONG&gt; можете выводить на экран и другие свойства, какие вы захотите:&lt;/P&gt;
&lt;DIV style="WIDTH: 925px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;PS C:\&amp;gt; $ca.children


MemberType          : Method
OverloadDefinitions :
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               :
Name                : children
IsInstance          : True



PS C:\&amp;gt; $ca.psbase.children

distinguishedName
-----------------
{CN=contoso-DC2-CA,CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=contoso,DC=com}
{CN=Contoso CA,CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=contoso,DC=com}


PS C:\&amp;gt; $ca.psbase.children | select Name, DNSHostname

Name                                                        DNSHostname
----                                                        -----------
{contoso-DC2-CA}                                            {dc2.contoso.com}
{Contoso CA}                                                {DC1.contoso.com}


PS C:\&amp;gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Поэтому для обратной совместимости между версиями лучше использовать &lt;STRONG&gt;PSBase&lt;/STRONG&gt;. В этом объекте будут содержаться не только CA вашего домена, а во всех доменах вашего леса, поскольку эта часть AD реплицируется как &lt;EM&gt;Forest naming context&lt;/EM&gt;, т.е. между всеми контроллерами в лесу. Жизнь была бы неинтересной, если в каждом новом домене приходилось бы переписывать хвост (которая определяет домен, в котором следует искать) каждый раз. Для универсальности можно пойти на военную хитрость — раздобыть FQDN текущего домена, разобрать его и воткнуть в LDAP запрос. Получить имя текущего домена можно очень просто, с использованием статического метода &lt;A href="http://msdn.microsoft.com/en-us/library/system.directoryservices.activedirectory.domain.getcurrentdomain(VS.80).aspx" target=_blank&gt;GetCurrentDomain()&lt;/A&gt; класса &lt;A href="http://msdn.microsoft.com/en-us/library/system.directoryservices.activedirectory.domain(VS.80).aspx" target=_blank&gt;System.DirectoryServices.ActiveDirectory.Domain&lt;/A&gt;. На самом деле у этого класса есть ещё куча других полезных методов, поэтому не лишним будет заглянуть по ссылке.&lt;/P&gt;
&lt;DIV style="WIDTH: 915px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;PS C:\&amp;gt; [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()


Forest                  : contoso.com
DomainControllers       : {DC1.contoso.com}
Children                : {}
DomainMode              : Windows2003Domain
Parent                  :
PdcRoleOwner            : DC1.contoso.com
RidRoleOwner            : DC1.contoso.com
InfrastructureRoleOwner : DC1.contoso.com
Name                    : contoso.com



PS C:\&amp;gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;И свойство Name будет содержать имя нашего домена. Что дальше? А дальше, вполне очевидно, что нам надо заменить все точки на строку вида &lt;STRONG&gt;", DC=&lt;/STRONG&gt;". Вот так:&lt;/P&gt;
&lt;DIV style="WIDTH: 915px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;PS C:\&amp;gt; "contoso.com" -replace "\.", ", DC="
contoso, DC=com&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;А перед первым именем эту часть можно написать ручками. В итоге универсальная часть кода получится вот такая:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #800080"&gt;$domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;System.DirectoryServices.ActiveDirectory.Domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetCurrentDomain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()).Name
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;DC=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-replace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;, DC=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;ADSI&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;LDAP://CN=Enrollment Services, CN=Public Key Services, CN=Services, CN=Configuration, $domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Вот теперь у нас есть всё необходимое, чтобы написать простеньку функцию:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Get-CertificationAuthority&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CAName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;System.DirectoryServices.ActiveDirectory.Domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetCurrentDomain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()).Name
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;DC=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-replace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;, DC=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;ADSI&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;LDAP://CN=Enrollment Services, CN=Public Key Services, CN=Services, CN=Configuration, $domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CAs&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CA&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.psBase.Children | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$current&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;""&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Select&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; CAName, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$current&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.CAName &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Name}
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$current&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.DNSHostName}
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$current&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
    }
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CAName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CAs&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CAs&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | ?{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.CAName &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CAName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;})}
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CAs&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Count &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;throw&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Sorry, here is no CA that match your search&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CAs&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Если выполнить эту функцию без аргументов, то она вернёт все CA в лесу. Но можно указать и какой-то один для каких-то других целей.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=947401b2-312a-4129-860b-4296dfe46cb2"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,947401b2-312a-4129-860b-4296dfe46cb2.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificate Authority</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=8f153e17-466e-4777-bbd1-cab968f2b15e</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=8f153e17-466e-4777-bbd1-cab968f2b15e</wfw:commentRss>
      <title>Get-TextEncoding</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</link>
      <pubDate>Sun, 04 Oct 2009 11:07:34 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;По мотивам предыдущего поста и срача в ньюсгруппе &lt;A href="http://www.microsoft.com/communities/newsgroups/list/en-us/default.aspx?dg=microsoft.public.windows.powershell" target=_blank&gt;microsoft.public.windows.powershell&lt;/A&gt; перепубликовываю скрипт Роберта Робело для определения кодировки, в которой сохранён файл.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Get-TextEncoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;requires -Version 2.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;begin&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_Unicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Unicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF7&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;UTF7&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_BigEndian&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;BigEndianUnicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;UTF32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
    }
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;process&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-is&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IO.FileInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Get-Content&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Literal&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.pspath &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Byte&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Total&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;4&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ErrorAction&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SilentlyContinue&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_Unicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;elseif&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF7&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UTF7&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;elseif&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]  &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;elseif&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_BigEndian&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BigEndian&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;elseif&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.3&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UTF32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; undetermined, no BOM&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; undetermined, zero bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;            } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-PassThru&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; not an IO.FileInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
    }
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;ну и использование достаточно простое:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;dir&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; *.ps1 | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Get-TextEncoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Format-Table&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Name, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Encoding&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Уже тут видно мелкий косячок подсветки в PowerGUI. Name должно быть такого же цвета, что и Encoding. А выглядеть это будет примерно так:&lt;/P&gt;
&lt;DIV style="WIDTH: 915px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] dir desktop\*.ps1 | Get-TextEncoding | ft name, encoding

Name                                                        Encoding
----                                                        --------
Untitled1.ps1                                               BigEndian
untitled2.ps1                                               UTF8


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Не забудьте, что это будет работать только в V2. Для PowerShell 1.0 придётся чуточку подпилить его.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=8f153e17-466e-4777-bbd1-cab968f2b15e"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=1c8d0f5b-48b1-4fd4-8805-36dfada18ce4</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,1c8d0f5b-48b1-4fd4-8805-36dfada18ce4.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,1c8d0f5b-48b1-4fd4-8805-36dfada18ce4.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=1c8d0f5b-48b1-4fd4-8805-36dfada18ce4</wfw:commentRss>
      <slash:comments>11</slash:comments>
      <title>PowerShell ISE vs PowerGUI</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,1c8d0f5b-48b1-4fd4-8805-36dfada18ce4.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,1c8d0f5b-48b1-4fd4-8805-36dfada18ce4.aspx</link>
      <pubDate>Sat, 03 Oct 2009 15:19:24 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Когда пользователь начинает работать с PowerShell, то со временем перед ним возникает вопрос — какой редактор (вернее сказать, среду разработки) выбрать? Решений уже достаточно много, чтобы было из чего выбирать:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;PowerShell ISE &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;PowerGUI &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;PrimalScript &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;PowerShellPlus &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;…&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;в большинстве случаев выбор делают между первыми двумя продуктами. Иногда споры об этом переходят в разряд религиозных войн. Истинные фанаты PowerShell выбирают &lt;STRONG&gt;ISE&lt;/STRONG&gt;. В принципе, как просто редактор он вполне неплох, т.к. уже есть в коробке (начиная с первых CTP версий PowerShell V2) и для работы с ним никаких телодвижений делать не надо. Однако с ним есть ряд трудностей:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;IntelliSense&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;В ISE отсутствует IntelliSense (автозавершение команд и свойств/методов объекта). А это весьма необходимая функция в среде разработки. Мне кажется, что это поняли уже все, кроме разработчиков PowerShell ISE. Вот как это может выглядеть:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="PowerGUI IntelliSense support" border=0 alt="PowerGUI IntelliSense support" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellISEPowerGUI_D510/pguiis_85ba8f98-3fb4-43dc-92a8-ecfc9c32265d.png" width=622 height=226&gt; &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Подсказки (ToolTips)&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;При наведении курсора на команду, не отображаются подсказки (Tooltips). В PowerGUI это выглядит действительно классно, точь-в-точь как в Visual Studio:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="PowerGUI ToolTips" border=0 alt="PowerGUI ToolTips" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellISEPowerGUI_D510/pguitt_e197ef76-a50a-4bfa-bb01-5c819d78313f.png" width=499 height=54&gt; &lt;/P&gt;
&lt;P&gt;Причём, на этой картинке можно нажимать на стрелочки вверх/вниз для просмотра типов данных, которые принимаются в качестве аргумента. При наведении на переменную PowerGUI показывает даже тип и содержимое переменной (в разумных пределах).&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Multiple runspaces&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;В ISE включена поддержка одноврменного редактирования нескольких скриптов (за счёт табов). Однако, все табы выполняются в одном runspace, что часто приводит к негативным последствиям, когда в двух разных табах используются одинаковые имена переменных. В связи с этим, данные из определённой переменной одного таба будут мигировать во второй таб, если эта переменная ещё не определена. Это может привести к неожиданным результатам работы скрипта.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Кодировка сохраняемых файлов&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ISE по умолчанию сохраняет файлы в &lt;STRONG&gt;Big Endian&lt;/STRONG&gt; кодировке. Вроде бы ничего криминального, но... &lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Set-Authenticodesignature&lt;/STRONG&gt; не умеет подписывать скрипты в Big Endian кодировке!&lt;/FONT&gt; Поэтому вы не сможете подписать штатными средствами ни один скрипт, который был сохранён в ISE! Для этого нужно прибегать к грязным хакам. Т.е. использовать такую строку, которая переопределит кодировку, в которой скрипт будет сохранён: &lt;BR&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #800080"&gt;$psISE&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.CurrentFile.Save([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Исполнение сохранённых скриптов и Execution Policy&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Вы можете в нём исполнять свой сценарий до тех пор, пока не сохраните его в файл. А вот когда вы редактируете уже сохранённый скрипт, то получаете бонус в виде того, что скрипт не будет исполняться внутри ISE, если у вас политика исполнения скриптов выставлена в &lt;STRONG&gt;AllSigned&lt;/STRONG&gt;. ISE об этом честно предупреждает: &lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="The script you are about to run will be saved" border=0 alt="The script you are about to run will be saved" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellISEPowerGUI_D510/psisesavemsg.png" width=454 height=112&gt;&amp;nbsp; &lt;BR&gt;Т.е. он сохраняет файл и пытается его запустить. В PowerGUI сделано куда более гуманно. Из основного редактора код условно копируется и вставляется в консоль PowerShell. Т.е. вы можете спокойно редактировать и отлаживать свой скрипт и только когда он будет готов к работе — подписывать скрипт. В случае с ISE вам придётся либо после каждого изменения сохранять и переподписывать скрипт (а это дико неудобно), либо выделять весь код и выбирать &lt;STRONG&gt;Run Selection&lt;/STRONG&gt;. А это тоже не очень удобно. Плюс, сохранение скрипта перед исполнением ведёт к другой проблеме. Вы не сможете отменить изменения на более раннее состояние. &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Поддержка профиля $Profile&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;В ISE вы не можете использовать свой профиль (который в консоли содержится в переменной &lt;STRONG&gt;$Profile&lt;/STRONG&gt;), а только поддерживать дополнительный профиль, который находится в той же папке, что и основной, но под именем &lt;STRONG&gt;Microsoft.PowerShellISE_profile.ps1&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Отслеживание изменений в файле&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;ISE не поддерживает проверку файла на изменения, хотя это должно быть удобно. Я часто редактирую свои файлы дома на нотебуке и на работе. Папка со скриптами синхронизируется между домом и работой через Live Sync. Я достаточно редко закрываю редактор, поэтому вечером сохраняю файл (который уже открыт в редакторе на работе) и всё. Утром, придя на работу я могу без переоткрытия файла могу продолжать его редактировать. PowerGUI просто сообщит, что файл был изменён и сам предложит загрузить последнюю сохранённую версию. С ISE придётся вручную переоткрывать файл.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;About&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Я не могу вспомнить программ, которые бы имели меню Help, но внутри не имели подменю About. но это просто мелочи уже, которые не влияют на удобство разработки скриптов.&lt;/P&gt;
&lt;HR&gt;

&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Updated 04.10.2009&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Если подвести это всё в табличку, то получится примерно так:&lt;/P&gt;
&lt;TABLE border=1 cellSpacing=0 cellPadding=2 width=473 align=center&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;STRONG&gt;PowerShell ISE&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;STRONG&gt;PowerGUI&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;STRONG&gt;PowerShell Plus&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Built-In&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Is free&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Fast start&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Powershell Support&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;100%&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&amp;lt;100%&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&amp;lt;100%&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;External PowerShell window&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Remote PowerShell tab&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;IntelliSense&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Multiple Runspaces&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;ToolTips&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Syntax highlighting&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Error syntax highlighting&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Error autocorrection&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Changed lines highlighting&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Outline support&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Support for signing&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Can sign within IDE&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Run signed scripts in external window&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Readable command help&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Configurable editor panes&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Variable pane&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;PS $Profile support&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;BreakPoints&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Code templates&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Print from editor&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=center width=202&gt;&lt;STRONG&gt;Script autosave&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=131&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;
&lt;TD style="TEXT-ALIGN: center" vAlign=center width=138&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; последнее изменение таблицы 16.03.2010&lt;/P&gt;
&lt;P&gt;Вобщем, я обозначил те вещи, которые я хотел бы видеть в хорошем редакторе. И значительное большинство моих хотелок уже есть в PowerGUI. О достоинствах PowerGUI можно говорить сколько угодно, но не буду смущать Диму Сотникова, поэтому скажу, что их продукт очень крутой. Но, в то же время, есть к чему стремиться. &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/P&gt;
&lt;P&gt;Однако, хочу ещё раз напомнить, что PowerGUI никогда не закроет первую строчку в таблице, что для религиозных фанатиков будет самым главным преимуществом и, который, затмит остальные недостатки ISE. Но мой выбор в этом вопросе достаточно очевиден.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=1c8d0f5b-48b1-4fd4-8805-36dfada18ce4"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,1c8d0f5b-48b1-4fd4-8805-36dfada18ce4.aspx</comments>
      <category>PowerShell</category>
      <category>Полезности</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=d8da596d-479d-4d4b-8601-113a8cd5c118</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=d8da596d-479d-4d4b-8601-113a8cd5c118</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>PS FCIV 1.0</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</link>
      <pubDate>Thu, 01 Oct 2009 19:12:11 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;После небольшого перерыва продолжаю допиливать свой вариант FCIV на PowerShell. И радостно могу сообщить, что уже есть версия 1.0, т.е. полностью отвечающая нашим требованиям. Что изменилось в новой версии?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Основная команда переименована с Get-PsFCIV в &lt;strong&gt;Start-PsFCIV&lt;/strong&gt;; &lt;/li&gt;    &lt;li&gt;Включена предварительная проверка файлов на блокировку; &lt;/li&gt;    &lt;li&gt;В связи с предыдущим пунктом, к&amp;#160; параметру &lt;strong&gt;Show&lt;/strong&gt; добавлен аргумент – &lt;strong&gt;Locked&lt;/strong&gt;. В это свойство помещаются заблокированные файлы (а для них нельзя подсчитать хеш); &lt;/li&gt;    &lt;li&gt;Включена проверка пути. Если путь к исходной папке не является путём файловой системы, то скрипт будет генерировать ошибку; &lt;/li&gt;    &lt;li&gt;Исправлена ошибка невозврата на исходный путь, если в процессе работы произошла фатальная ошибка; &lt;/li&gt;    &lt;li&gt;Параметр &lt;strong&gt;Show&lt;/strong&gt; теперь выводит файлы из указанных категорий в красивое графическое окошко с использованием &lt;strong&gt;Out-GridView&lt;/strong&gt;. Однако, следует учесть, что &lt;font color="#ff0000"&gt;использование Out-GridView требует, чтобы был установлен .NET Framework 3.5 SP1&lt;/font&gt;. &lt;/li&gt;    &lt;li&gt;Добавлен режим &lt;strong&gt;Quiet&lt;/strong&gt;, который ничего не выводит на экран, а только генерирует коды возврата (&lt;strong&gt;LastExitCode&lt;/strong&gt;). Коды возврата обновлены. &lt;/li&gt;    &lt;li&gt;Пофиксены сообщения режимов &lt;strong&gt;Verbose&lt;/strong&gt; и &lt;strong&gt;Debug&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Исправлены мелкие неточности в коде и произведена небольшая оптимизация кода. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;А теперь и on-line справка по всем параметрам по просьбе трудящихся.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Path&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — путь к папке, файлы которой следует посчитать или проверить. Допускаются относительные пути. Данный параметр обязателен. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;XML&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — путь к XML файлу, который содержит сведения о файлах. Если указанный файл не существует, то после пересчёта файлов по этому пути будет создан новый файл БД со сведениями о файлах. Параметр обязателен. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Include&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — опциональный параметр в котором вы можете указать только конкретный файл из папки. В таком случае будет проверена не вся папка, а только указанный файл. В настоящее время параметр не поддерживает подстановочные знаки (wildcard), типа '*.ext' из-за обеспечения поддержки файлов с метасимволами (например, в имени содержатся квадратные скобки). &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Action&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — опциональный параметр, который указывает на действие над файлами, у которых не совпадают хеши или сведения о дате изменения и размере файла. Может принимать значение &lt;strong&gt;Rename&lt;/strong&gt; или &lt;strong&gt;Delete&lt;/strong&gt;. В первом случае к проблемным файлам добавляется расширение .BAD, а во втором файл просто удаляется. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Show&lt;/strong&gt; &amp;lt;String[]&amp;gt;&lt;/font&gt; — опциональный параметр, в котором указываются категории файлов для дальнейшего анализа. В зависимости от результата проверки каждый файл (его имя) помещается в ту или иную категорию. &lt;font color="#ff0000"&gt;Требует установленного .Net Framework 3.5 SP1&lt;/font&gt;. Может принимать один или несколько аргументов из списка:       &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;Bad&lt;/strong&gt; — содержит имена всех файлов, у которых обнаружен несовпадающий хеш или не совпадает дата/время изменеия и/или размер файла; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Locked&lt;/strong&gt; — в эту категорию помещаются файлы хеш которых проверить не удалось по причине блокировки файла в монопольном режиме каким-то приложением; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Missed&lt;/strong&gt; — содержит имена файлов, для которых есть запись в XML файле БД, но самого файла уже не существует (по любым причинам); &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; — в эту категорию попадают только имена новых файлов, для которых соответствующей записи ещё нет в XML файле. Новые файлы добавляются только в режиме Rebuild или когда файл БД создаётся с нуля. &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Ok&lt;/strong&gt; — сюда попадают файлы с успешным статусом проверки, т.е. хеш, дата/время изменения и размер файла совпадают со значениями в XML файле; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Total&lt;/strong&gt; — содержит имена всех обработанных файлов вне зависимости от результата проверки; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Unknown&lt;/strong&gt; — содержит имена файлов, для которых нельзя сопоставить хеш. Такая ситуация возможна, если в параметрах функции указан только хеш SHA1, но для файла в БД записан только MD5 хеш и наоборот. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Recurse&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — ключ, который включает проверку файлов не только в указанной папке, но и во всех вложенных папках. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Rebuild&lt;/strong&gt; &amp;lt;Swtich&amp;gt;&lt;/font&gt; — ключ, который задаёт особый режим работы скрипта — «освежение». Если этот ключ указан, то производится сверка файлов из БД с реальными файлами. Если файл более не существует, то соответствующая запись для него удаляется из БД. После чего целевая папка (и подпапки при указанном ключе –Recurse) проверяется на наличие новых файлов. Для каждого нового файла добавляется соответствующая запись в XML файл. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;SHA1&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — задаёт алгоритм хеширования, который будет использоваться для подсчёта новых файлов и/или для проверки уже существующих записей в XML файле. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;MD5&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — задаёт алгоритм хеширования, который будет использоваться для подсчёта новых файлов и/или для проверки уже существующих записей в XML файле. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Quiet&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает несопровождаемый режим работы скрипта. Если ключ указан, то итоговая статистическая информация не выводится на экран, а в зависимости от результата проверки генерируется код возврата (&lt;strong&gt;LastExitCode&lt;/strong&gt;). Код возврата может принимать одно из следующих значений:       &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; — в процессе работы скрипта все файлы были успешно проверены и их хеш, дата/время изменения и размер соответствуют записям в БД. Так же, данный код возврата будет сгенерирован, если создавался новый файл БД и все файлы были успешно в него добавлены; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; — в процессе проверки были обнаружены файлы с несовпадающим хешем и/или датой/временем и размером; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; — в процессе проверки было обнаружено, что для записи в БД нет соответствующего файла; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; — в процессе проверки были обнаружены файлы, для которых не удалось сопоставить алгоритм хеширования с хранимым в БД алгоритмом хеширования для файла. Такая ситуация возможна, если в параметрах функции указан только хеш SHA1, но для файла в БД записан только MD5 хеш и наоборот; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; — в процессе работы скрипта для некоторых файлов не удалось подсчитать хеш по причине блокировки файла в монопольном режиме другим приложением; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; — скрипт выполнялся в режиме &lt;strong&gt;Rebuild&lt;/strong&gt; (освежения файла БД) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Verbose&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает отображение дополнительной информации о ходе проверки файлов. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Debug&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает отображение отладочной информации о ходе работы скрипта. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Несколько примеров использования:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Show&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Bad, Missed&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет проверена папка &lt;strong&gt;C:\Files&lt;/strong&gt; и все вложенные папки. Файл &lt;strong&gt;db.xml&lt;/strong&gt; должен быть размещён непосредственно в этой папке. Если файл не существует, то будет создан с нуля. После проверки будет показано графическое окно с именами файлов, которые попали в категорию &lt;strong&gt;Bad&lt;/strong&gt; и &lt;strong&gt;Missed&lt;/strong&gt;. Для каждой категории будет отдельное графическое окно.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-MD5&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Include&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;data.dat&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет проверен только файл &lt;strong&gt;data.dat&lt;/strong&gt; в папке &lt;strong&gt;C:\Files&lt;/strong&gt; с использованием &lt;strong&gt;SHA1&lt;/strong&gt; алгоритмом хешиования. Если для файла в БД записан только &lt;strong&gt;MD5&lt;/strong&gt; хеш, то проверка будет произведена с использованием MD5. Если файл БД (db.xml) не существует, то создастся новый файл БД со сведениями о файле &lt;strong&gt;data.dat&lt;/strong&gt;. Файл будет подсчитан с использованием как SHA1, так и MD5.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-MD5&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Rebuild&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет произведено освежение файла БД для папки &lt;strong&gt;C:\Files&lt;/strong&gt;. Все записи, для которых соответствующего файла не обнаружено, будут удалены. Если в папке есть файлы, для которых нет соответствующей записи, то они будут обсчитаны с использованием алгоритмов SHA1 и MD5 и будут добвлены в XML файл. Файл &lt;strong&gt;db.xml&lt;/strong&gt; должен существовать, иначе скрипт вернёт фатальную ошибку.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Quiet&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Папка &lt;strong&gt;C:\Files&lt;/strong&gt; будет проверена в несопровождаемом режиме с использованием алгоритма SHA1. По умолчанию никакой информации на экране не будет. После окончания работы, в зависимости от результатов проверки, скрипт сгенерирует соответствующий код возврата (&lt;strong&gt;0-5&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;И, собственно, сам скрипт:&lt;/p&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;38,3 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self" alt="Download File"&gt;PSFCIV_1.0.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;И как обычно, любые замечания, комментарии постить в каменты.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=d8da596d-479d-4d4b-8601-113a8cd5c118"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=289efb4c-376a-435a-95a5-5a3e46ce7ce5</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,289efb4c-376a-435a-95a5-5a3e46ce7ce5.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,289efb4c-376a-435a-95a5-5a3e46ce7ce5.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=289efb4c-376a-435a-95a5-5a3e46ce7ce5</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Certificate management pack</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,289efb4c-376a-435a-95a5-5a3e46ce7ce5.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,289efb4c-376a-435a-95a5-5a3e46ce7ce5.aspx</link>
      <pubDate>Mon, 14 Sep 2009 19:02:32 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Представлю на обозрение пробный скрипт по управлению сертификатами в хранилище Certificate Store — &lt;strong&gt;CertMgmtPack.ps1&lt;/strong&gt;, который (как я надеюсь) может найти применение на серверах Windows Server 2008 R2 Server Core и реализован на основе наших недавних исследований:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,972e7000-555d-40af-9561-18d70467d82a.aspx"&gt;Простой экспорт сертификатов в PowerShell&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,72d9376a-a668-4122-8a35-c27d9679e071.aspx"&gt;Сложный экспорт сертификатов в PowerShell&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,9932bca2-6f85-4ed5-b001-32a37b67b146.aspx"&gt;Импорт сертификатов в PowerShell&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,ca62f1b3-ca7f-43cb-a4b2-948194adbc74.aspx"&gt;Экспорт PFX с удалением ключа из хранилища в PowerShell&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Версия пока что 0.47 (т.к. предстоит добавить ещё разного функционала и допилить существующий). Пока что мне удалось реализовать функционал импорта сертификатов из файлов в store и экспорт из store в файлы сертификатов.&lt;/p&gt;  &lt;div&gt;   &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/CertMgmtPack.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/CertMgmtPack.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/CertMgmtPack.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file              &lt;br /&gt;15,8 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/CertMgmtPack.ps1" target="_self" alt="Download File"&gt;CertMgmtPack.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; скрипт работает только в PowerShell V2. В каждую функцию вложена справка, которую вы можете прочитать набрав Get-Help Import/Export-Certiifcate.&lt;/p&gt;  &lt;p&gt;После подключения скрипта (используя dot-sourcing) у вас будут доступны 2 функции:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Export-Certificate &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Import-Certificate&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;И пару слов о том, как их использовать.&lt;/p&gt;  &lt;h4 align="center"&gt;Import-Certificate&lt;/h4&gt;  &lt;p&gt;содержит следующие параметры:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color="#0000ff"&gt;Path &amp;lt;String&amp;gt;&lt;/font&gt; — путь к файлу сертификата, который может иметь следующий набор расширений: &lt;strong&gt;CER&lt;/strong&gt;, &lt;strong&gt;DER&lt;/strong&gt;, &lt;strong&gt;PFX&lt;/strong&gt;, &lt;strong&gt;P7B&lt;/strong&gt;, &lt;strong&gt;SST&lt;/strong&gt;. Распознавание типов сертификатов осуществляется по расширению файла. Данная функция может принимать параметр пути из конвейера следующим путём:       &lt;pre&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; *.cer | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Import-Certificate&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;
Параметр обязательный. &lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font color="#0000ff"&gt;Password &amp;lt;SecureString&amp;gt;&lt;/font&gt; — пароль для PFX файла. Пароль не требуется для остальных типов файлов. Однако, хочу предупредить, что пароли не принимаются в открытом виде, а должны передаватьсякак &lt;strong&gt;SecureString&lt;/strong&gt;. Это можно реализовать различными способами, например, вот так: 

    &lt;pre&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Read-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Enter password for PFX file&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;–AsSecureString&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font color="#0000ff"&gt;Storage &amp;lt;String&amp;gt;&lt;/font&gt; — указывает контекст импорта сертификата, т.е. это будет хранилище текущего пользователя (по умолчанию) или в хранилище компьютера (требуются права локального администратора). Может принимать значения &lt;strong&gt;User&lt;/strong&gt; или &lt;strong&gt;Computer&lt;/strong&gt;. Если параметр не указан, то берётся значение по умолчанию — &lt;strong&gt;User&lt;/strong&gt;. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Container &amp;lt;String&amp;gt;&lt;/font&gt; — указывает контейнер размещения сертификата. Это может быть один из: &lt;strong&gt;AuthRoot&lt;/strong&gt;, &lt;strong&gt;CA&lt;/strong&gt;, &lt;strong&gt;Disallowed&lt;/strong&gt;, &lt;strong&gt;My&lt;/strong&gt; (&lt;em&gt;по умолчанию&lt;/em&gt;), &lt;strong&gt;REQUEST&lt;/strong&gt;, &lt;strong&gt;Root&lt;/strong&gt;, &lt;strong&gt;SmartCardRoot&lt;/strong&gt;, &lt;strong&gt;Trust&lt;/strong&gt;, &lt;strong&gt;TrustedPeople&lt;/strong&gt;, &lt;strong&gt;TrustedPublisher&lt;/strong&gt;, &lt;strong&gt;UserDS&lt;/strong&gt;. Расшифровка контейнеров (сопоставление названиям в оснастке CertMgr.msc) приведена внутри скрипта в хелпе функции. Если параметр не указан, то применяется параметр по умолчанию — &lt;strong&gt;My&lt;/strong&gt;. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Exportable &amp;lt;Switch&amp;gt;&lt;/font&gt; — применяется только для импорта PFX файлов. Данный ключ помечает импортируемый сертификат как экспортируемый. Это означает, что вы после процедуры импорта сможете снова экспортировать сертификат с закрытым ключом. Эсли ключ Exportable не указан, то закрытый ключ сертификата не помечается как экспортируемый и при экспорте у вас не будет возможности экспортировать закрытый ключ данного сертификата. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;StrongProtection &amp;lt;Switch&amp;gt;&lt;/strong&gt; — применяется только для импорта PFX файлов. Данный ключ включает режим усиленной защиты закрытого ключа PFX файла. Это означает, что для каждой попытки использования закрытого ключа от этого сертификата потребуется ручной ввод пароля. &lt;font color="#ff0000"&gt;Данный ключ нельзя использовать, если Storage указан как Computer&lt;/font&gt;, поскольку компьютерные сертификаты не поддерживают такой режим. Это связано с тем, что компьютерные сертификаты используются в контексте учётной записи LocalSystem и lsass.exe не предоставляет пользователю UI для ввода пароля. В любом случае, если вы попробуете это сделать, скрипт выдаст соответствующую ошибку и импорт произведён не будет. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;И пару примеров, как использовать функцию:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color: #800080"&gt;$pass&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Read-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Enter password for PFX&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;–AsSecureString&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Import-Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;mycert.pfx&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Password&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$pass&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Exportable&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;импортирует файл mycert.pfx в контейнер Personal хранилища текущего пользователя и пометит ключ как экспортируемый.&lt;/p&gt;

&lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Import-Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;mycert.pfx&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Password&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$pass&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-StrongProtection&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Импортирует файл mycert.pfx в контейнер Personal хранилища текущего пользователя, пометит ключ как неэкспортируемый и включит режим усиленной защиты закрытого ключа, что потребует ввод пароля пользователя каждый раз при его использовании.&lt;/p&gt;

&lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Import-Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;certs.p7b&lt;/span&gt;&lt;span style="color: #000000"&gt; –&lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;Storage&lt;/span&gt;&lt;span style="color: #000000"&gt; '&lt;/span&gt;&lt;span style="color: #800000"&gt;Computer'&lt;/span&gt;&lt;span style="color: #000000"&gt; –&lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;Container&lt;/span&gt;&lt;span style="color: #000000"&gt; '&lt;/span&gt;&lt;span style="color: #800000"&gt;TrustedPublisher'&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Импортирует все сертификаты из файла certs.p7b в контейнер Trusted Publishers компьютерного хранилища.&lt;/p&gt;

&lt;h4 align="center"&gt;Экспорт сертификатов&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font color="#0000ff"&gt;Path &amp;lt;String&amp;gt;&lt;/font&gt; — указывает путь к папке (не к файлу!), в которую будут экспортированы все указанные сертификаты. Парамер обязателен. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Type &amp;lt;String&amp;gt;&lt;/font&gt; — указывает тип экспортируемых сертификатов. Может принимать одно из значений: &lt;strong&gt;CERT&lt;/strong&gt;, &lt;strong&gt;PFX&lt;/strong&gt;, &lt;strong&gt;PKCS12&lt;/strong&gt;, &lt;strong&gt;PKCS7&lt;/strong&gt;, &lt;strong&gt;SST&lt;/strong&gt; (&lt;em&gt;Serialized Store&lt;/em&gt;). Параметр так же обязателен. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Password &amp;lt;SecureString&amp;gt;&lt;/font&gt; — задаёт пароль для экспортируемых PFX файлов (в качестве типа экспортируемых сертификатов указано PFX или PKCS12 и является для них обязательным). Параметр не принимает значение в виде простой строки, а только &lt;strong&gt;SecureString&lt;/strong&gt;. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Storage &amp;lt;String&amp;gt;&lt;/font&gt; — указывает контекст поиска экспортируемых сертификатов, т.е. поиск будет производиться в компьютерном хранилище или хранилище текущего пользователя (по умолчанию). Может принимать значения &lt;strong&gt;CurrentUser&lt;/strong&gt; или &lt;strong&gt;LocalMachine&lt;/strong&gt;. Если параметр не указан, то берётся значение по умолчанию — &lt;strong&gt;User&lt;/strong&gt;. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Container &amp;lt;String&amp;gt;&lt;/font&gt; — указывает контейнер размещения сертификата (или сертификатов). Это может быть один из: &lt;strong&gt;AuthRoot&lt;/strong&gt;, &lt;strong&gt;CA&lt;/strong&gt;, &lt;strong&gt;Disallowed&lt;/strong&gt;, &lt;strong&gt;My&lt;/strong&gt; (&lt;em&gt;по умолчанию&lt;/em&gt;), &lt;strong&gt;REQUEST&lt;/strong&gt;, &lt;strong&gt;Root&lt;/strong&gt;, &lt;strong&gt;SmartCardRoot&lt;/strong&gt;, &lt;strong&gt;Trust&lt;/strong&gt;, &lt;strong&gt;TrustedPeople&lt;/strong&gt;, &lt;strong&gt;TrustedPublisher&lt;/strong&gt;, &lt;strong&gt;UserDS&lt;/strong&gt;. Расшифровка контейнеров (сопоставление названиям в оснастке CertMgr.msc) приведена внутри скрипта в хелпе функции. Если параметр не указан, то поиск производится в контейнере по умолчанию — &lt;strong&gt;My&lt;/strong&gt;. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Thumbprint &amp;lt;String&amp;gt;&lt;/font&gt; — задаёт критерий поиска сертификатов по отпечатку ключа (соответствующее поле Thumbprint сертификата). Можно указывать как полный отпечаток, так и любую его часть. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Subject &amp;lt;String&amp;gt;&lt;/font&gt; — задаёт критерий поиска сертификатов по полю Subject. Можно указывать как полный Subject, так и любую его часть. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;Issuer &amp;lt;String&amp;gt;&lt;/font&gt; — задаёт критерий поиска по конкретному издателю сертификата. Можно указывать как полный CN издателя, так и любую его часть. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;SerialNumber &amp;lt;String&amp;gt;&lt;/font&gt; — задаёт критерий поиска по серийному номеру сертификата. Можно указывать как точный серийный номер, так и любую его часть. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;NotAfter &amp;lt;String&amp;gt;&lt;/font&gt; — задаёт критерий поиска по дате истечения сертификата. Дата задаётся в формате &lt;strong&gt;dd.MM.yyyy&lt;/strong&gt; (&lt;em&gt;день.месяц.год&lt;/em&gt;). В результате использования этого параметра будут отобраны сертификаты, которые истекут не позднее указанной даты. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;NotBefore &amp;lt;String&amp;gt;&lt;/font&gt; — задаёт критерий поиска по дате начала действия сертификате. Как и в NotAfter дата указывается в формате &lt;strong&gt;dd.MM.yyyy&lt;/strong&gt; и в результате использования этого параметра будут отобраны сертификаты, действие которых начинается не раньше указанной даты. &lt;/li&gt;

  &lt;li&gt;&lt;font color="#0000ff"&gt;DeleteKey &amp;lt;Swtich&amp;gt;&lt;/font&gt; — используется только при экспорте сертификатов вместе с закрытыми ключами в PFX файлы. Данный ключ при успешном экспорте удаляет закрытый ключ данного сертификата из хранилища. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Я не смог провести полноценное тестирование функции экспорта, поэтому гарантировать 100% работу пока не могу. Но вы, уважаемые читатели, можете мне в этом помочь.&lt;/p&gt;

&lt;p&gt;И несколько примеров использования:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Export-Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;c:\certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Type&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;PKCS7&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Экспортирует все сертификаты из Current User\Personal в один PKCS7 файл с именем &lt;strong&gt;ExportedCertificates.p7b&lt;/strong&gt; (это имя зашито на уровне скрипта).&lt;/p&gt;

&lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Export-Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;c:\certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Type&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;cert&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Storage&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'LocalMachine&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Container&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Root&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SerialNumber&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;663&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Экспортирует все сертификаты из контейнера доверенных центров сертификации (Trusted Root CAs) компьютерного хранилища, у которых в серийном номере встречается последовательность 663 в CER файлы. При этом каждый сертификат будет экспортирован в индивидуальный файл с именем, которое строится по схеме: &lt;font color="#008000"&gt;SubjectCN_Thumprint.CER&lt;/font&gt;, например: &lt;font color="#0000ff"&gt;Thawte Premium Server CA_4F65566336DB6598581D584A596C87934D5F2AB4.cer&lt;/font&gt;&lt;/p&gt;

&lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Export-Certificate&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;c:\certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Type&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;PKCS12&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Password&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$pass&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-DeleteKey&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Subject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;UserName&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Экспортирует все сертификаты из Current User\Personal в PFX файлы у которых в любом месте поля Subject есть UserName. При успешном экспорте закрытый ключ сертификата будет удалён из хранилища и будет содержаться только в PFX файле.&lt;/p&gt;

&lt;p&gt;В связи с тем, что CN поля Subject может содержать недопустимые символы для имён файлов, мне скорее всего придётся искать другой метод именования экспортируемых сертификатов и чтобы они были распознаваемые. Если вы обнаружите какие-то ошибки или будут пожелания, то пишите мне в коментарии или на почту. По мере дописывания я буду выкладывать новые версии скрипта.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=289efb4c-376a-435a-95a5-5a3e46ce7ce5"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,289efb4c-376a-435a-95a5-5a3e46ce7ce5.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=ca62f1b3-ca7f-43cb-a4b2-948194adbc74</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,ca62f1b3-ca7f-43cb-a4b2-948194adbc74.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,ca62f1b3-ca7f-43cb-a4b2-948194adbc74.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=ca62f1b3-ca7f-43cb-a4b2-948194adbc74</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Экспорт PFX с удалением ключа из хранилища в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,ca62f1b3-ca7f-43cb-a4b2-948194adbc74.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,ca62f1b3-ca7f-43cb-a4b2-948194adbc74.aspx</link>
      <pubDate>Thu, 10 Sep 2009 19:07:54 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Короткая заметка. Когда вы экспортируете сертификат вместе с закрытым ключом, то можете заметить такую опцию:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Delete the Private key if the export is successful" border="0" alt="Delete the Private key if the export is successful" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PFXPowerShell_122AC/Capture.png" width="517" height="470" /&gt; &lt;/p&gt;  &lt;p&gt;К сожалению, метод &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.export.aspx" target="_blank"&gt;Export()&lt;/a&gt; у объектов &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx" target="_blank"&gt;X509Certificate2&lt;/a&gt; не позволяет штатно проделывать данную операцию. Это можно сделать через &lt;a href="http://msdn.microsoft.com/en-us/library/aa387359(VS.85).aspx" target="_blank"&gt;CAPICOM.PrivateKey.Delete()&lt;/a&gt;, но данная возможность отсутствует в PowerShell, в то время, как вы можете это сделать в VBS. Это связано с весьма паршивой поддержкой COM со стороны PowerShell, поэтому для реализации функционала этой галочки вам придётся проделать следующие шаги:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Получить объект X509Certificate2 самого сертификата; &lt;/li&gt;    &lt;li&gt;Экспортировать его в PFX; &lt;/li&gt;    &lt;li&gt;Открыть хранилище в режиме ReadWrite; &lt;/li&gt;    &lt;li&gt;Удалить данный сертификат из хранилища; &lt;/li&gt;    &lt;li&gt;Экспортировать объект сертификата уже не в PFX, а в Cert; &lt;/li&gt;    &lt;li&gt;Импортировать этот экспортированный объект Cert (хотя, на самом деле там будет массив байтов, но это не столь существенно). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;На языке PowerShell это выглядеть будет примерно так:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; получаем объект сертификата с закрытым ключом&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; cert:\&lt;/span&gt;&lt;span style="color: #800000"&gt;currentuser\my&lt;/span&gt;&lt;span style="color: #000000"&gt;)[0]
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записываем пароль для PFX файла&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$pass&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Read-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Password&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AsSecureString&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; экспортируем его в PFX формат&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Export(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;pfx&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$pass&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и записывем его в файл&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;System.IO.File&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;WriteAllBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;mycert.pfx&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; снова экспортируем данный объект, но уже в Cert формат&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$tempcert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Export(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Cert&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём объект нашего хранилища&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.security.cryptography.X509Certificates.X509Store&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;my&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CurrentUser&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; открываем его на чтение и на запись&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Open([&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.X509Certificates.OpenFlags&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ReadWrite&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; удаляем текущий сертификат с закрытым ключом из хранилища&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Remove(&lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записываем обратно Cert объект в хранилище, теперь уже без закрытого ключа&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Add(&lt;/span&gt;&lt;span style="color: #800080"&gt;$tempcert&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Close()&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Это только образец кода и его не стоит использовать прямо в таком виде, т.к. вы должны точно убедиться, что у вас PFX файл создался и он валидный. В противном случае вы останетесь совсем без закрытого ключа. И ещё раз напоминаю, при работе с хранилищем – не забывайте его закрывать после работы.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=ca62f1b3-ca7f-43cb-a4b2-948194adbc74"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,ca62f1b3-ca7f-43cb-a4b2-948194adbc74.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=9932bca2-6f85-4ed5-b001-32a37b67b146</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,9932bca2-6f85-4ed5-b001-32a37b67b146.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,9932bca2-6f85-4ed5-b001-32a37b67b146.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=9932bca2-6f85-4ed5-b001-32a37b67b146</wfw:commentRss>
      <title>Импорт сертификатов в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,9932bca2-6f85-4ed5-b001-32a37b67b146.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,9932bca2-6f85-4ed5-b001-32a37b67b146.aspx</link>
      <pubDate>Wed, 09 Sep 2009 19:20:18 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В предыдущих статьях мы с вами уже изучили методы экспорта сертификатов из хранилища Certificate Store в файл:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,972e7000-555d-40af-9561-18d70467d82a.aspx"&gt;Простой экспорт сертификатов в PowerShell&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,72d9376a-a668-4122-8a35-c27d9679e071.aspx"&gt;Сложный экспорт сертификатов в PowerShell&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;а так же рассмотрели сопутствующие вопросы. Теперь же предлагаю рассмотреть обратную операцию – добавление сертификатов в cert store из файлов. Этот процесс будет несколько легче, чем экспорт, поэтому я в одном посте покажу импорт всех типов сертификатов (они все используют одну схему).&lt;/p&gt;  &lt;p&gt;Для импорта нам потребуется метод &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.import(VS.85).aspx" target="_blank"&gt;x509Certificate.Import()&lt;/a&gt;, который так же как и метод &lt;strong&gt;Export()&lt;/strong&gt; имеет несколько конструкторов. Мы можем выбрать один универсальный, который подойдёт нам для всех типов файлов сертификатов и это будет конструктор: &lt;a href="http://msdn.microsoft.com/en-us/library/ms148441(VS.85).aspx" target="_blank"&gt;X509Certificate2.Import Method (String, SecureString, X509KeyStorageFlags)&lt;/a&gt;. В качестве аргументов он принимает следующее:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;String&lt;/strong&gt; – путь к файлу сертификата &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;SecureString&lt;/strong&gt; – строка с паролем. Требуется только для импорта PFX сертификатов, т.к. остальные типы файлов не содержат закрытых ключей и защищать их паролем нет смысла. Если это не PFX, то значение этого аргумента просто выставляется в $null. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;объект типа &lt;/strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509keystorageflags(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;X509KeyStorageFlags&lt;/strong&gt;&lt;/a&gt;, который описывает область хранения сертификатов. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Давайте немного разберёмся с флагами последнего аргумента:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;DefaultKeySet&lt;/strong&gt; – указывает, что сертификат предназначен для импорта в контейнер Personal хранилища CurrentUser (дефолт). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Exportable&lt;/strong&gt; – используется только для PFX файлов и говорит, будет ли возможность экспортировать сертификат с закрытым ключом. Если мы этот флаг не указываем, то после импорта не будет возможности снова экспортировать в PFX файл. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;MachineKeySet&lt;/strong&gt; – указывает, что сертификат будет установлен в хранилище компьютера (LocalSystem). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;PersistKeySet&lt;/strong&gt; – используется только для PFX и сохраняет пароль от PFX файла в сертификате. Данный пароль будет использован при дальнейшем экспорте в PFX файл (будет работать только с флагом Exportable). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;UserKeySet&lt;/strong&gt; – указывает, что сертификат будет установлен в пользовательское хранилище. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;UserProtected&lt;/strong&gt; – используется только для PFX файлов и для пользовательских сертификатов. Этот флаг включает Private Key Strong Protection, который при каждом использовании закрытого ключа будет требовать ввода пароля. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; вы никогда не должны использовать флаг &lt;strong&gt;UserProtected&lt;/strong&gt; для компьютерных сертификатов, поскольку они используются в контексте &lt;strong&gt;LocalSystem&lt;/strong&gt; и у вас просто не будет возможности ввести пароль для использования этого закрытого ключа.&lt;/p&gt;  &lt;p&gt;Т.к. &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509keystorageflags(VS.85).aspx" target="_blank"&gt;X509KeyStorageFlags&lt;/a&gt; на самом деле является перечислителем (enumerator), то создавать его объект не обязательно и флаги можно просто использовать как строки. PowerShell уже сам подобъёт эти флаги к нужному типу данных.&lt;/p&gt;  &lt;p&gt;т.к. у нас ещё нет готового объекта сертификатов, то мы его просто создаём:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.security.cryptography.x509certificates.x509certificate2&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И в этом объекте у нас будет метод &lt;strong&gt;Import()&lt;/strong&gt;, которым мы уже воспользуемся:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;mycert.pfx&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$password&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Read-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Type password for PFX certificate&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AsSecureString&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$flags&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;UserKeySet, Exportable&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt;.Import(&lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$password&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$flags&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Обратите внимание, что вы за один раз можете указать несколько флагов для &lt;strong&gt;KeyStorage&lt;/strong&gt;, просто перечислив их через запятую. Теперь $certs у нас содержит x509Certificate2 объект нашего сертификата:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $certs = New-Object system.security.cryptography.x509certificates.x509certificate2
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = &amp;quot;mycert.pfx&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $password = Read-Host &amp;quot;Type password for PFX certificate&amp;quot; -AsSecureString
Type password for PFX certificate: *
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $flags = &amp;quot;UserKeySet, Exportable&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $certs.Import($path, $password, $flags)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $certs

Thumbprint                                Subject
----------                                -------
0F5157A8342C66493E7B1354530DD7A9F980BC69  CN=vPodans


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;как видите, у нас всё случилось, PFX файл был успешно прочитан и помещён в объект x509Certificate2. Но это только половина дела, поскольку этот сертификат пока существует только самом в объекте, но не в хранилище. Для того, чтобы записать объект в хранилище мы должны поработать с хранилищем. За него отвечает класс &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx" target="_blank"&gt;X509Store&lt;/a&gt;. Мы создадим этот объект с нуля и укажем какой именно контейнер в каком хранилище открывать. Для этого мы воспользуемся следующим конструктором: &lt;a href="http://msdn.microsoft.com/en-us/library/ms148581.aspx" target="_blank"&gt;X509Store Constructor (StoreName, StoreLocation)&lt;/a&gt;. Здесь я подробно останавливаться не буду, поскольку названия хранилищ и контейнеров мы уже рассматривали в одном из предыдущих постов: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,972e7000-555d-40af-9561-18d70467d82a.aspx"&gt;Простой экспорт сертификатов в PowerShell&lt;/a&gt;, в этом посте все контейнеры показаны в первом снимке консоли. В нашем случае &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspx" target="_blank"&gt;StoreName&lt;/a&gt; будет &lt;strong&gt;My&lt;/strong&gt; (&lt;em&gt;Personal&lt;/em&gt;), а &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storelocation.aspx" target="_blank"&gt;Store Location&lt;/a&gt; будет &lt;strong&gt;CurrentUser&lt;/strong&gt; (контекст текущего пользователя):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.security.cryptography.X509Certificates.X509Store&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;My&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CurrentUser&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Создали мы объект хранилища, теперь нам надо его открыть в режиме &lt;strong&gt;ReadWrite&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Open([&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.X509Certificates.OpenFlags&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ReadWrite&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Этот флаг открытия хранилища указывать надо обязательно, иначе у вас просто не будет к нему доступа. Теперь когда хранилище открыто, можно методом &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.add.aspx" target="_blank"&gt;Add()&lt;/a&gt;, который в качестве аргумента принимает только x509Certificate2 объекты (он у нас уже есть в переменной $certs):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Add(&lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Close()&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; MSDN настоятельно рекомендует закрывать хранилище после того, как вы провели с ним необходимые операции.&lt;/p&gt;

&lt;p&gt;Вот и всё, собственно, у нас теперь PFX файл был успешно импортирован в хранилище.&lt;/p&gt;

&lt;p&gt;Когда вы импортируете сертификаты из &lt;strong&gt;p7b&lt;/strong&gt; (&lt;em&gt;PKCS#7&lt;/em&gt;) файла, то в нём может быть несколько сертификатов, поэтому здесь поменяется всего 2 строчки. Поскольку у нас в одном файле может быть несколько сертификатов, то для их чтения из файла будем использовать не x509Certificate2 объект, а специальный массив таких объектов – &lt;strong&gt;x509Certificate2Collection&lt;/strong&gt;, о котором мы уже говорили в предыдущем посте:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.IO.File&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ReadAllBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2Collection&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt;.Import(&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Мы сначала прочитали байтовый массив из файла и засунули его в коллекцию x509Certificate2 объектов. Т.к. сертификатов там несколько, а метод &lt;strong&gt;Add()&lt;/strong&gt; у x509Store за раз может взять только один объект – воспользуемся циклом:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$certs&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$store&lt;/span&gt;&lt;span style="color: #000000"&gt;.Add(&lt;/span&gt;&lt;span style="color: #800080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;)}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;А в остальном схема импорта &lt;strong&gt;p7b&lt;/strong&gt; файлов будет такая же. Вот и всё, что я хотел рассказать по импорту сертификатов из файлов в хранилище. В принципе, используя эти знания вы уже можете затачивать код под свои нужды, тем более я везде, где это было необходимо, указывал ссылки на MSDN, где вы можете узнать более подробно этот материал. Но чтобы сделать жизнь чуточку проще, я постараюсь написать несколько полезных функций для управлениями сертификатами в PowerShell, что будет весьма актуально для Windows Server 2008 R2 Server Core.&lt;/p&gt;

&lt;p&gt;Спасибо за внимание &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=9932bca2-6f85-4ed5-b001-32a37b67b146"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,9932bca2-6f85-4ed5-b001-32a37b67b146.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=72d9376a-a668-4122-8a35-c27d9679e071</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,72d9376a-a668-4122-8a35-c27d9679e071.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,72d9376a-a668-4122-8a35-c27d9679e071.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=72d9376a-a668-4122-8a35-c27d9679e071</wfw:commentRss>
      <title>Сложный экспорт сертификатов в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,72d9376a-a668-4122-8a35-c27d9679e071.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,72d9376a-a668-4122-8a35-c27d9679e071.aspx</link>
      <pubDate>Mon, 07 Sep 2009 20:28:36 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Продолжая тему экспорта сертификатов поговорим о более сложных вещах, чем простой экспорт сертификата из хранилища в CER/DER файл. На сей раз расскажу про экспорт сертификатов из хранилища в &lt;strong&gt;PFX&lt;/strong&gt; (&lt;em&gt;Personal Information Exchange Syntax Standard&lt;/em&gt;) и &lt;strong&gt;PKCS#7&lt;/strong&gt; (&lt;em&gt;Cryptographic Message Syntax Standard&lt;/em&gt;) формат. Будет немного треша, но в пределах разумного.&lt;/p&gt;  &lt;p&gt;Для экспорта сертификата в &lt;strong&gt;PFX&lt;/strong&gt; нам потребуется выполнить половину кода из предыдущей статьи: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,972e7000-555d-40af-9561-18d70467d82a.aspx"&gt;Простой экспорт сертификатов в PowerShell&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Сначала выберем объект сертификат из хранилища:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; cert:\currentuser)[4]&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Как вы помните, если экспортировать сертификат в PFX нам нужно указывать пароль:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Certificate Export Wizard windows" border="0" alt="Certificate Export Wizard windows" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell_1219B/exppfx.png" width="517" height="470" /&gt; &lt;/p&gt;

&lt;p&gt;Следовательно, конструктор метода &lt;a href="http://msdn.microsoft.com/en-us/library/dxz81eb9.aspx"&gt;Export(X509ContentType)&lt;/a&gt;, который мы использовали нам уже не подойдёт, поскольку в этот конструктор нельзя вложить пароль. Мы можем воспользоваться одним из оставшихся конструкторов:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms148397.aspx"&gt;Export(X509ContentType, SecureString)&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/24ww6yzk.aspx"&gt;Export(X509ContentType, String)&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SecureString/String представляют собой аргумент для пароля. Я бы не советовал использовать простую строку для хранения пароля, а SecureString. Для этого мы сделаем такую строчку:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$password&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Read-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Password&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; –&lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;AsSecureString&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;А теперь по аналогии с примером из предыдущего поста укажем тип сертификата как PFX и применим наш метод &lt;a href="http://msdn.microsoft.com/en-us/library/ms148397.aspx"&gt;Export(X509ContentType, SecureString)&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.X509Certificates.X509ContentType&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Pfx&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Export(&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$password&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;У нас снова получится массив байтов, т.к. этот метод возвращает только его. Но что с этим бинарным мусором делать? Я сначала по наивности предположил, что его так же запаковать в &lt;strong&gt;Base64&lt;/strong&gt; и записать в файл. Да, у меня всё вышло хорошо, данные были записаны в файл и &lt;strong&gt;Certificate Import Wizard&lt;/strong&gt; принял его за валидный PFX файл. Но у меня всё обломалось на стадии ввода пароля, т.к. этот визард не хотел его брать. Ввиду отсутствия практики в этих делах, пришлось попросить помощи на одном из бложиков технета, откуда и пришёл ответ, что этот &lt;u&gt;Certificate Import Wizard не декодирует файл обратно из Base64&lt;/u&gt;, поэтому для записи в файл нужно писать сразу байты:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;System.IO.File&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;WriteAllBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;certificate.pfx&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;В качестве первого аргумента указывается путь к файлу и вторым аргументом наш массив. Лично я без подсказки долго бы ещё ломал голову, что сделать с этим массивом, чтобы получить нужный эффект.&lt;/p&gt;

&lt;p&gt;Но это всё относительно просто. Когда я задался вопросом “а как экспортировать в PKCS#7?”, то пришлось убить несколько часов на выяснение этого процесса. PKCS#7 удобен тем, что в себе может содержать кучу сертификатов и главным образом используется для хранения цепочки сертификатов (&lt;em&gt;Certificate Chain&lt;/em&gt;). Например, особенно наблюдательные пользователи при посещении многих HTTPS сайтов могут заметить, что поле AIA есть только у самих SSL сертификатов, а у промежуточных CA его уже нету. Но этих сертификатов нету и в хранилище сертификатов (Certificate Store). Напрашивается вопрос: а как же система построила эту цепочку сертификатов при отсутствующем AIA в сертификатах? Оказывается, всё очень просто, в RFC2246 есть хороший момент:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#804000"&gt;certificate_list 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; This is a sequence (chain) of X.509v3 certificates. The sender's 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; certificate must come first in the list. Each following 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; certificate must directly certify the one preceding it. Because 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; certificate validation requires that root keys be distributed 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; independently, the self-signed certificate which specifies the 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; root certificate authority may optionally be omitted from the 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; chain, under the assumption that the remote end must already 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; possess it in order to validate it in any case.&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Это означает, что веб-сервер может вместе с SSL сертификатом отправлять клиенту и цепочку сертификатов, которая как раз и есть в формате PKCS#7. Если что, это было просто введение к назначению данного типа сертификатов.&lt;/p&gt;

&lt;p&gt;Предупреждаю сразу, что методы &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.export.aspx"&gt;x509Certificate2.Export Method&lt;/a&gt; нам не сгодятся, т.к. в описании метода есть ремарка:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;The contentType parameter accepts only the following values of the &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509contenttype.aspx"&gt;&lt;em&gt;X509ContentType&lt;/em&gt;&lt;/a&gt;&lt;em&gt; enumeration: &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509contenttype.cert.aspx"&gt;&lt;em&gt;Cert&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509contenttype.serializedcert.aspx"&gt;&lt;em&gt;SerializedCert&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, and &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509contenttype.pkcs12.aspx"&gt;&lt;em&gt;Pkcs12&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Passing any other value causes a &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptographicexception.aspx"&gt;&lt;em&gt;CryptographicException&lt;/em&gt;&lt;/a&gt;&lt;em&gt; to be thrown.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Хоть класс System.Security.Cryptography.X509Certificates.X509ContentType и имеет в себе атрибут PKCS7, но метод Export класса x509Certificate2 его просто не принимает. Это был провал! Но делать нечего, пришлось искать. Наткнулся я вот на один замечательный пост: &lt;a href="http://blogs.technet.com/vishalagarwal/archive/2009/04/30/pkcs7-p7b-bag-of-certificates-and-powershell.aspx"&gt;PKCS7 (p7b) bag of certificates and powershell&lt;/a&gt;. Но там пример как раз наоборот – как извлечь сертификаты из p7b файла и вывести их в виде x509Certificate2 объектов:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;reflection.assembly&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;LoadWithPartialName&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;System.Security&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$data&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.IO.File&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ReadAllBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;certificates.p7b&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$cms&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;new-object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.security.cryptography.pkcs.signedcms&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$cms&lt;/span&gt;&lt;span style="color: #000000"&gt;.Decode(&lt;/span&gt;&lt;span style="color: #800080"&gt;$data&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$cms&lt;/span&gt;&lt;span style="color: #000000"&gt;.Certificates | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;echo&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Автор поста вообще удивительный человек. Просто взял и выложил код без каких-либо комментариев, предполагая, что все знают что делает этот код в деталях. Попробую за него сделать это я. Данный код читает бинарный мусор из файла (обратите внимание, что используется обратная операция экспорта PFX бинарного массива в файл). Далее создаётся объект &lt;strong&gt;CMS&lt;/strong&gt; (&lt;em&gt;Cryptographic Message Syntax&lt;/em&gt;). И что мы с него имеем:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [void][reflection.assembly]::LoadWithPartialName(&amp;quot;System.Security&amp;quot;)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cms = new-object system.security.cryptography.pkcs.signedcms
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cms


Version      : 0
ContentInfo  : System.Security.Cryptography.Pkcs.ContentInfo
Detached     : False
Certificates : {}
SignerInfos  : {}



&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cms | gm -MemberType methods


   TypeName: System.Security.Cryptography.Pkcs.SignedCms

Name             MemberType Definition
----             ---------- ----------
CheckHash        Method     System.Void CheckHash()
CheckSignature   Method     System.Void CheckSignature(bool verifySignatureOnly), System.Void CheckSignature(System....
ComputeSignature Method     System.Void ComputeSignature(), System.Void ComputeSignature(System.Security.Cryptograph...
Decode           Method     System.Void Decode(byte[] encodedMessage)
Encode           Method     byte[] Encode()
Equals           Method     bool Equals(System.Object obj)
GetHashCode      Method     int GetHashCode()
GetType          Method     type GetType()
RemoveSignature  Method     System.Void RemoveSignature(int index), System.Void RemoveSignature(System.Security.Cryp...
ToString         Method     string ToString()


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Мы имеем объект с 5 свойствами и различными методами. В коде используется метод &lt;strong&gt;Decode()&lt;/strong&gt; и как видно в описании метода, в качестве аргумента принимается массив байтов, полученный из p7b файла. Этот метод преобразует этот массив обратно в массив объектов x509Certificate2, что видно из последней строки кода. Более-менее тут что-то понятно. Следовательно, для экспорта нам нужно проделать операцию наоборот, создать объект CMS, в свойство Certificates запихать x509Certificate2 объекты сертификатов и применить метод &lt;strong&gt;Encode()&lt;/strong&gt;. Чтобы использовать этот метод у нас в свойстве Certificates должны храниться x509Certificate2 объекты наших сертификатов, которые хотим экспортировать. Но тут меня ждал облом, т.к. свойство &lt;strong&gt;Certificates&lt;/strong&gt; является Read-only и записать туда ничего нельзя. Однако, PowerTab мне показал, что там есть что-то интересное:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cms.Certificates.
                                ╔═ $cms.Certificates. ═════════════╗
                                ║&lt;span style="background-color: #ff0000"&gt;&lt;font color="#000000"&gt; $cms.Certificates.PSBase&lt;/font&gt;         &lt;/span&gt;║
                                ║ $cms.Certificates.Add(           ║
                                ║ $cms.Certificates.AddRange(      ║
                                ║ $cms.Certificates.Clear(         ║
                                ║ $cms.Certificates.Contains(      ║
                                ║ $cms.Certificates.CopyTo(        ║
                                ║ $cms.Certificates.Equals(        ║
                                ║ $cms.Certificates.Export(        ║
                                ║ $cms.Certificates.Find(          ║
                                ║ $cms.Certificates.GetEnumerator( ║
                                ║ $cms.Certificates.GetHashCode(   ║
                                ║ $cms.Certificates.GetType(       ║
                                ║ $cms.Certificates.Import(        ║
                                ║ $cms.Certificates.IndexOf(       ║
                                ║ $cms.Certificates.Insert(        ║
                                ║ $cms.Certificates.Remove(        ║
                                ║ $cms.Certificates.RemoveAt(      ║
                                ║ $cms.Certificates.RemoveRange(   ║
                                ║ $cms.Certificates.ToString(      ║
                                ║ $cms.Certificates.Item(          ║
                                ║ $cms.Certificates.Capacity       ║
                                ║ $cms.Certificates.Count          ║
                                ╚═[1] 1-22 (22/22)]════════════════╝&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Я испробовал несколько по смыслу похожих методов, как &lt;strong&gt;Add&lt;/strong&gt;, &lt;strong&gt;AddRange&lt;/strong&gt; и &lt;strong&gt;Import&lt;/strong&gt;, но всё неудачно. Сертификаты никак не хотели туда помещаться. После некоторого времени возни я бросил это занятие, как бесполезное, т.к. там ловить нечего:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cms.Certificates | gm
&lt;font color="#ff0000"&gt;Get-Member : No object has been specified to the get-member cmdlet.
At line:1 char:23
+ $cms.Certificates | gm &amp;lt;&amp;lt;&amp;lt;&amp;lt;
    + CategoryInfo          : CloseError: (:) [Get-Member], InvalidOperationException
    + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand&lt;/font&gt;

&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Вобщем, всякие вариации с этим CMS объектов никаких успехов не приносили до тех пор, пока я не посмотрел тип этого свойства Certificates:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cms.Certificates.GetType().FullName
System.Security.Cryptography.X509Certificates.X509Certificate2Collection&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Я отправился на MSDN читать макулатуру по этому классу (точнее по его членам): &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection_members.aspx" target="_blank"&gt;X509Certificate2Collection Members&lt;/a&gt;. Если вы ещё не забыли, то мы ищем способ разобрать наш x509Certificate2 объект на массив байтов, который бы соответствовал формату PKCS#7. Здесь из годных методов я нашёл метод &lt;a href="http://msdn.microsoft.com/en-us/library/ms148480.aspx"&gt;Add(X509Certificate2)&lt;/a&gt;. У меня уже есть этот объект, поэтому мы его можем добавить в объект &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection.aspx" target="_blank"&gt;X509Certificate2Collection&lt;/a&gt;. Данный класс по сути представляет массив объектов x509Certificate2. Давайте сделаем:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cert = (dir cert:\currentuser\my)[4]
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cert1 = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cert1.Add($cert)
0
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $cert1

Thumbprint                                Subject
----------                                -------
0F5157A8342C66493E7B1354530DD7A9F980BC69  CN=vPodans


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;ну хорошо, преобразовали мы x509Certificate2 в X509Certificate2Collection, а что дальше? Нам по прежнему нужен этот дурацкий массив байтов. После этого я посмотрел на метод &lt;a href="http://msdn.microsoft.com/en-us/library/ms148490.aspx" target="_blank"&gt;X509Certificate2Collection Export Method (X509ContentType)&lt;/a&gt; нового класса и прочитал ремарки:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;This method supports content types that do not require a password.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Вот тут я и сказал “слава &lt;strike&gt;сиськам&lt;/strike&gt;Протоколу!”. Данный метод позволяет экспортировать объекты сертификатов в любой тип, который не требует пароля (т.е. всё, кроме PFX/PKCS#12). А дальше уже по отработанной схеме:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $type = [System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs7
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $bytes = $cert1.Export($type)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.IO.File]::WriteAllBytes('certificate.p7b', $bytes)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Вот таким долгим и тяжёлым (для меня, во всяком случае) я смог его победить и научиться экспортировать сертификаты в PKCS#7.&lt;/p&gt;

&lt;p&gt;Что нас ждёт дальше? А дальше, возможно, поговорим про SerializedCert и SerializedStore (а может и не будем говорить) и уже импорт сертификатов из файлов в Certificate Store. А на сегодня, пожалуй, хватит.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=72d9376a-a668-4122-8a35-c27d9679e071"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,72d9376a-a668-4122-8a35-c27d9679e071.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=972e7000-555d-40af-9561-18d70467d82a</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,972e7000-555d-40af-9561-18d70467d82a.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,972e7000-555d-40af-9561-18d70467d82a.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=972e7000-555d-40af-9561-18d70467d82a</wfw:commentRss>
      <title>Простой экспорт сертификатов в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,972e7000-555d-40af-9561-18d70467d82a.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,972e7000-555d-40af-9561-18d70467d82a.aspx</link>
      <pubDate>Sun, 06 Sep 2009 09:46:46 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;С различной периодичностью на ньюсгруппах и англоязычных форумах встречаю вопрос, как экспортировать сертификаты из хранилища (Certificate Store) или сертификаты цифровых подписей файлов в .CER или .DER файл. Сегодня я продемонстрирую простой метод для экспорта этих сертификатов.&lt;/p&gt;  &lt;p&gt;На самом деле разница между экспортом сертификата из хранилища сертификатов и подписанного файла заключается только в методе извлечения самого сертификата в &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx" target="_blank"&gt;x509Certificate2&lt;/a&gt; объект. Давайте начнём с самого простого – экспорт сертификата из хранилища. В PowerShell уже есть свой провайдер для этого хранилища и свой PSDrive:&lt;/p&gt;  &lt;div style="width: 915px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] dir cert:\


Location   : CurrentUser
StoreNames : {SmartCardRoot, UserDS, AuthRoot, CA...}

Location   : LocalMachine
StoreNames : {SmartCardRoot, AuthRoot, CA, Trust...}



&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] dir cert:\currentuser


Name : SmartCardRoot

Name : UserDS

Name : AuthRoot

Name : CA

Name : AddressBook

Name : Trust

Name : Disallowed

Name : My

Name : Root

Name : TrustedPeople

Name : TrustedPublisher

Name : REQUEST



&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] dir cert:\currentuser\my


    Directory: Microsoft.PowerShell.Security\Certificate::currentuser\my


Thumbprint                                Subject
----------                                -------
9C5E4DCEF6598C1298894F62D4BD16E601B8C780  CN=Microsoft Corporation, OU=MOPR, O=Microsoft Corporation, L=Redmond, S=W...
986D375362652FE9E39BA4D042A6B8BA75745998  CN=Administrator, CN=Users, DC=sysadmins, DC=lv
4BB89D732920DD91DE66983DDF2CC4EEC272A802  CN=Administrator, CN=Users, DC=sysadmins, DC=lv
14B931DB4790403CCE2A3D03B62638FC7A0D5F34  CN=Administrator, OU=Administrators, DC=sysadmins, DC=lv


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Если просто посмотреть содержимое Cert:\, то мы увидим там 2 хранилища&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CurrentUser&lt;/strong&gt; – представляет хранилище текущего пользователя, т.е. является аналогом графической консоли CertMgr.msc &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;LocalMachine&lt;/strong&gt; – представляет хранилище локального компьютера и является аналогом графической консоли MMC – Certificates, запущенной в контексте LocalComputer. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Внутри уже видны контейнеры, которые мы видим в виде папок в MMC консоли. А дальше уже хранятся наши сертификаты. Эти сертификаты здесь представлены в виде массива &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx" target="_blank"&gt;x509Certificate2&lt;/a&gt;.&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] (dir cert:\currentuser\my)[0].gettype().FullName
System.Security.Cryptography.X509Certificates.X509Certificate2
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Если посмотреть свойства этого объекта через Get-Member, то мы сможем там увидеть метод &lt;strong&gt;Export()&lt;/strong&gt;. Но лучше посмотреть этот метод на MSDN, т.к. он имеет несколько конструкторов: &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.export.aspx" target="_blank"&gt;x509Certificate2.Export Method&lt;/a&gt;. Из них нас заинтересует только первый конструктор, который &lt;a href="http://msdn.microsoft.com/en-us/library/dxz81eb9.aspx"&gt;Export(X509ContentType)&lt;/a&gt;. Остальные 2 необходимы для экспорта с паролем (только для PFX). Но, как мы видим из описания метода, нам надо ещё указать &lt;strong&gt;x509ContentType&lt;/strong&gt; объект, который будет указывать нам на тип экспортируемого сертификата. Типы экспортируемых сертификатов можно посмотреть по ссылке: &lt;a title="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509contenttype.aspx" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509contenttype.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509contenttype.aspx&lt;/a&gt; или в консоли PowerShell:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Enum]::GetNames([system.security.cryptography.x509certificates.x509contenttype])
Unknown
Cert
SerializedCert
Pfx
Pkcs12
SerializedStore
Pkcs7
Authenticode&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Нас сейчас будет интересовать только тип &lt;strong&gt;Cert&lt;/strong&gt; (только открытая часть сертификата).&lt;/p&gt;

&lt;p&gt;Теперь мы уже знаем достаточно много, чтобы уже начать писать код. Мы сейчас получим объект сертификата, укажем тип экспортируемого сертификата и выполним метод Export():&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; cert:\&lt;/span&gt;&lt;span style="color: #800000"&gt;currentuser\My&lt;/span&gt;&lt;span style="color: #000000"&gt;)[0]
&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.X509Certificates.X509ContentType&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cert&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$ExportedData&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;.Export(&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Но это ещё не всё. Посмотрите, что у вас находится в переменной &lt;strong&gt;$ExportedData&lt;/strong&gt;! Там на самом деле огромный массив байтов (в среднем более 2-20 тысяч элементов). Это же и указано в описании метода, что он возвращает. Именно массив байтов. Но что с ним делать? Я сам по-началу думал об этом, пока не вспомнил про одну вещь:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Certificate Export Wizard" border="0" alt="Certificate Export Wizard" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell_8E9B/certexportb64_1.png" width="517" height="470" /&gt; &lt;/p&gt;

&lt;p&gt;У нас есть выбор, как экспортировать сертификат – в DER или Base64 кодировке. Когда я писал про &lt;a href="http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx" target="_blank"&gt;PsFCIV&lt;/a&gt;, то у меня была такая же ситуация. Hasher у меня так же возвращал массив байтов, который мы сразу же загоняли в Base64 кодировку. В нашем случае потребуется то же самое:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$base64Data&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Convert&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ToBase64String&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$ExportedData&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И на выходе мы молучим длинную Base64 строку, которую уже и нужно экспортировать в файл любым удобным для вас методом:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$base64Data&lt;/span&gt;&lt;span style="color: #000000"&gt; &amp;gt; path\file.cer
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Set-Content&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;path\file&lt;/span&gt;&lt;span style="color: #000000"&gt;.cer &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$base64Data&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;вы можете убедиться в этом просто открыв .CER файл.&amp;#160; Чтобы получить объект сертификата из цифровой подписи файла, то мы можем просто воспользоваться командлетом &lt;strong&gt;Get-AuthenticodeSignature&lt;/strong&gt; и выбрать свойство &lt;strong&gt;SignerCertificate&lt;/strong&gt;. Если подпись файла дополнительно подписана сертификатом сервера времени, то вы можете использовать так же и свойство &lt;strong&gt;TimeStampCertificate&lt;/strong&gt;:&lt;/p&gt;

&lt;div style="width: 915px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $a.SignerCertificate

Thumbprint                                Subject
----------                                -------
9E95C625D81B2BA9C72FD70275C3699613AF61E3  CN=Microsoft Corporation, OU=MOPR, O=Microsoft Corporation, L=Redmond, S=W...


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $a = Get-AuthenticodeSignature .\Desktop\EASetup.exe
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $a.SignerCertificate

Thumbprint                                Subject
----------                                -------
9E95C625D81B2BA9C72FD70275C3699613AF61E3  CN=Microsoft Corporation, OU=MOPR, O=Microsoft Corporation, L=Redmond, S=W...


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $a.TimeStamperCertificate

Thumbprint                                Subject
----------                                -------
4D6F357F0E6434DA97B1AFC540FB6FDD0E85A89F  CN=Microsoft Time-Stamp Service, OU=nCipher DSE ESN:85D3-305C-5BCF, OU=MOP...


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;В этих свойствах сертификаты уже хранятся в виде объектов &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx" target="_blank"&gt;x509Certificate2&lt;/a&gt; и дальше их можно экспортировать тем же самым путём, как мы это делали для сертификатов из Certificate Store. Собственно, для извлечения сертификатов из цифровых подписей файлов я написал неплохой скриптик, который добавляет в контекстное меню элемент &lt;strong&gt;Export Certificate&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Export Certificate Context menu" border="0" alt="Export Certificate Context menu" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell_8E9B/certcontmenu_3.png" width="290" height="54" /&gt; &lt;/p&gt;

&lt;p&gt;и по нажатию на него цифровая подпись будет экспортирована в &lt;font color="#0000ff"&gt;MyDocs\FileName.ext.cer&lt;/font&gt;, где &lt;font color="#0000ff"&gt;FileName.ext&lt;/font&gt; – оригинальное имя файла и к нему просто пристыковывается расширение CER. В скрипте предусмотрены несколько диалоговых окон о состоянии сертификата:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;файл подписан и хеш файла соответствует хешу в цифровой подписи: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Valid Certificate" border="0" alt="Valid Certificate" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell_8E9B/validcertmsg.png" width="386" height="148" /&gt; &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;файл подписан, но хеш файла не соответствует хешу в цифровой подписи: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Hash Mismatch" border="0" alt="Hash Mismatch" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell_8E9B/hmmsg_1.png" width="490" height="208" /&gt; &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;файл не содержит цифровых подписей: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="No certificate" border="0" alt="No certificate" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell_8E9B/nsmsg.png" width="491" height="178" /&gt; &lt;/p&gt;

&lt;p&gt;В двух последних случаях сертификат не экспортируется никуда по очевидным причинам. И, собственно скрипты-инсталляторы этого контекстного меню с рабочим кодом для:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;PowerShell 1.0: &lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 245px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/ExportCertificate_ps1.0.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/ExportCertificate_ps1.0.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/ExportCertificate_ps1.0.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;8,97 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/ExportCertificate_ps1.0.ps1" target="_self" alt="Download File"&gt;ExportCertificate_ps1.0.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;PowerShell V2: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 245px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/ExportCertificate_ps2.0.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/ExportCertificate_ps2.0.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/ExportCertificate_ps2.0.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;8,34 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/ExportCertificate_ps2.0.ps1" target="_self" alt="Download File"&gt;ExportCertificate_ps2.0.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;В следующих статьях я планирую поговорить про импорт сертификатов в Certificate Store, а так же и экспорт сертификатов с закрытыми ключами в PFX файл с использованем Windows PowerShell.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=972e7000-555d-40af-9561-18d70467d82a"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,972e7000-555d-40af-9561-18d70467d82a.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=54ff87c5-076f-453b-9f28-33091de136df</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,54ff87c5-076f-453b-9f28-33091de136df.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,54ff87c5-076f-453b-9f28-33091de136df.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=54ff87c5-076f-453b-9f28-33091de136df</wfw:commentRss>
      <title>Проверка блокировки файла приложениями</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,54ff87c5-076f-453b-9f28-33091de136df.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,54ff87c5-076f-453b-9f28-33091de136df.aspx</link>
      <pubDate>Sat, 05 Sep 2009 19:46:15 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Иногда бывает необходимость проверить, заблокирован ли файл каким-то приложением в монопольном режиме, прежде чем совершать какое-то действие над ним. Например, мой скрипт &lt;a href="http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx"&gt;Get-PsFCIV.ps1&lt;/a&gt; очень сильно ругается краснотой, если файл заблокирован, т.к. &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx"&gt;System.IO.StreamReader&lt;/a&gt;, который у меня используется для подсчёта хешей файлов требует, чтобы файл никем не был занят. Принцип проверки файла заключается в том, что мы пробуем получить доступ к файлу через &lt;strong&gt;System.IO.StreamReader&lt;/strong&gt; и если это нам не удалось, значит файл заблокирован. Вот и решил написать такой удобный фильтр, который можно использовать и отдельно, просто для проверки блокировки файлов:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test-FileLock&lt;/span&gt;&lt;span style="color: #000000"&gt; {
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, откуда пришли данные - из конвейера или через аргументы фильтра&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и создаём объекты текущего элемента&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$args&lt;/span&gt;&lt;span style="color: #000000"&gt;[0]) {&lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gi&lt;/span&gt;&lt;span style="color: #000000"&gt; $(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Resolve-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$args&lt;/span&gt;&lt;span style="color: #000000"&gt;[0]) &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt;} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.fullname &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; отфильтровываем папки&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt;.psiscontainer) {&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; задаём переменную $locked в исходное значение $false&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$locked&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$false&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём ловушку для ошибки доступа. Если ловушка сработает, то переменная &lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; $locked выставляется в $true, что будет означать, что файл заблокирован&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в монопольном режиме каким-то приложением&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;trap&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Set-Variable&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;locked&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-scope&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;continue&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; открываем файл в режиме read/write. Если файл заблокирован, то ошибка будет&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; поймана ловушкой&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.IO.StreamReader&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если файл не был заблокирован, то закрываем StreamReader&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt;.Close()}
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выводим результаты на экран в виде хеш-таблицы&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    @{&lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$locked&lt;/span&gt;&lt;span style="color: #000000"&gt;}
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;фильтр можно запускать как с аргументами, так и в конвейере:&lt;/p&gt;

&lt;div style="width: 900px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test-FileLock ntuser.dat

Name                           Value
----                           -----
C:\Users\vPodans\ntuser.dat    True


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test-FileLock ntuser.ini

Name                           Value
----                           -----
C:\Users\vPodans\ntuser.ini    False


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] dir ntuser.dat -Force | Test-FileLock

Name                           Value
----                           -----
C:\Users\vPodans\ntuser.dat    True


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] dir ntuser.ini -Force | Test-FileLock

Name                           Value
----                           -----
C:\Users\vPodans\ntuser.ini    False


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;надеюсь, этот фильтр кому-нибудь сгодится ещё &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=54ff87c5-076f-453b-9f28-33091de136df"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,54ff87c5-076f-453b-9f28-33091de136df.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=1896bbc0-ff31-437b-a73a-486e6f6716c6</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,1896bbc0-ff31-437b-a73a-486e6f6716c6.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,1896bbc0-ff31-437b-a73a-486e6f6716c6.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=1896bbc0-ff31-437b-a73a-486e6f6716c6</wfw:commentRss>
      <title>Управление PowerShell ExecutionPolicy в домене</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,1896bbc0-ff31-437b-a73a-486e6f6716c6.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,1896bbc0-ff31-437b-a73a-486e6f6716c6.aspx</link>
      <pubDate>Mon, 17 Aug 2009 15:50:42 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Короткая заметка.&lt;/p&gt;  &lt;p&gt;Я достаточно часто встречаю задачу централизованной установки политики исполнения скриптов PowerShell в домене и очень часто люди решают её используя правку реестра, что является идеологически неверным подходом. Я не раз говорил, что для централизованной настройки параметров следует использовать групповые политики на сколько это возможно, поскольку они обладают полезными свойствами:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;единая точка управления; &lt;/li&gt;    &lt;li&gt;охват множества компьютеров, совершая минимум движений; &lt;/li&gt;    &lt;li&gt;читабельность настроек и возможность их сохранения/восстановления; &lt;/li&gt;    &lt;li&gt;если настройки на какой-то машине были сбиты или изменены – политика перезапишет изменения на значения, которые установил администратор в групповой политике. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Однако, не везде у нас есть возможность использования такой настройки через GP, поскольку такая настройка есть только в ОС, в которых PowerShell поставляется по умолчанию – это Windows Server 2008, Windows Server 2008 R2 и Windows 7. Для остальных ОС такой настройки нету в политиках. Но не всё так плохо, как может показаться:&lt;/p&gt;  &lt;h3 align="center"&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2917a564-dbbc-4da7-82c8-fe08b3ef4e6d&amp;amp;DisplayLang=en" target="_blank"&gt;&amp;gt;&amp;gt; Administrative Templates for Windows PowerShell &amp;lt;&amp;lt;&lt;/a&gt;&lt;/h3&gt;  &lt;p align="center"&gt;Вам достаточно установить этот шаблон на компьютер, с которого вы управляете групповыми политиками. Данная политика будет размещена в секции: &lt;font color="#0000ff"&gt;Computer Configuration –&amp;gt; Administrative Templates –&amp;gt; Windows Components –&amp;gt; Windows PowerShell&lt;/font&gt;.&lt;/p&gt;  &lt;p align="center"&gt;Этот шаблон устанавливается на ОС не ниже Windows XP.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=1896bbc0-ff31-437b-a73a-486e6f6716c6"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,1896bbc0-ff31-437b-a73a-486e6f6716c6.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=515f1bd4-d948-4ae8-b890-6159dc58e366</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,515f1bd4-d948-4ae8-b890-6159dc58e366.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,515f1bd4-d948-4ae8-b890-6159dc58e366.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=515f1bd4-d948-4ae8-b890-6159dc58e366</wfw:commentRss>
      <title>Замена служебных символов в запросах WMI</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,515f1bd4-d948-4ae8-b890-6159dc58e366.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,515f1bd4-d948-4ae8-b890-6159dc58e366.aspx</link>
      <pubDate>Fri, 24 Jul 2009 20:32:55 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Мне вчера на почту пришёл комментарий на пост: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,243d77ee-4975-4335-9abf-ce8660e9439c.aspx"&gt;Смена владельца папки или файла в PowerShell (часть 2)&lt;/a&gt;, в котором сообщалось об ошибке, которую генерирует скрипт, если в пути есть служебные мета-символы, как апостроф (одиночкая кавычка). А дело было в том, что этот мета-символ нужно дополнительно эскейпить (помимо обратных слешей в пути). То же касается и квадратных скобок. Одиночные кавычки эскейпятся очень просто – одним обратным слешем:&lt;/p&gt;  &lt;div style="width: 900px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = &amp;quot;C:\Users\vPodans\text'text.txt&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\\|'&amp;quot;, '\$0'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path
C:\\Users\\vPodans\\text\'text.txt
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter &amp;quot;path='$path'&amp;quot;


__GENUS          : 2
__CLASS          : Win32_LogicalFileSecuritySetting
__SUPERCLASS     : Win32_SecuritySetting
__DYNASTY        : CIM_Setting
__RELPATH        : Win32_LogicalFileSecuritySetting.Path=&amp;quot;C:\\Users\\vPodans\\text'text.txt&amp;quot;
&amp;lt;...&amp;gt; &lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Но с квадратными скобками такой фокус не прошёл:&lt;/p&gt;

&lt;div style="width: 900px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = &amp;quot;C:\Users\vPodans\text[text.txt&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\\|\[&amp;quot;, '\$0'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path
C:\\Users\\vPodans\\text\[text.txt
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter &amp;quot;path='$path'&amp;quot;
&lt;font color="#ff0000"&gt;Get-WmiObject : Invalid query
At line:1 char:5
+ gwmi &amp;lt;&amp;lt;&amp;lt;&amp;lt;  Win32_LogicalFileSecuritySetting -filter &amp;quot;path='$path'&amp;quot;
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand&lt;/font&gt;

&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;попытка заэскейпить квадратные скобки при помощи бэктика (&lt;strong&gt;`&lt;/strong&gt;) успехом не увенчалась:&lt;/p&gt;

&lt;div style="width: 900px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = &amp;quot;C:\Users\vPodans\text[text.txt&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\\&amp;quot;, '\$0'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\[&amp;quot;, '`$0'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter &amp;quot;path='$path'&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;он вообще файл не нашёл так. На удачу решил опробовать хитрый вариант – не эскейпить символ, а вписать его &lt;strong&gt;char&lt;/strong&gt; номер из таблицы &lt;strong&gt;ASCII&lt;/strong&gt;. И вот что у меня вышло:&lt;/p&gt;

&lt;div style="width: 900px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = &amp;quot;C:\Users\vPodans\text[text.txt&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\\&amp;quot;, '\$0'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [int][char]&amp;quot;[&amp;quot;
91
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\[&amp;quot;, &amp;quot;$([char]91)&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path
C:\\Users\\vPodans\\text[text.txt
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter &amp;quot;path='$path'&amp;quot;


__GENUS          : 2
__CLASS          : Win32_LogicalFileSecuritySetting
__SUPERCLASS     : Win32_SecuritySetting
__DYNASTY        : CIM_Setting
__RELPATH        : Win32_LogicalFileSecuritySetting.Path=&amp;quot;C:\\Users\\vPodans\\text[text.txt&amp;quot;
&amp;lt;...&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;И этот финт сработал! Тот же самый манёвр делается и для второй квадратной скобки:&lt;/p&gt;

&lt;div style="width: 900px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = &amp;quot;C:\Users\vPodans\text[text].txt&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\\&amp;quot;, '\$0'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\[&amp;quot;, &amp;quot;$([char]91)&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [int][char]&amp;quot;]&amp;quot;
93
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = $path -replace &amp;quot;\]&amp;quot;, &amp;quot;$([char]93)&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path
C:\\Users\\vPodans\\text[text].txt
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gwmi Win32_LogicalFileSecuritySetting -filter &amp;quot;path='$path'&amp;quot;


__GENUS          : 2
__CLASS          : Win32_LogicalFileSecuritySetting
__SUPERCLASS     : Win32_SecuritySetting
__DYNASTY        : CIM_Setting
__RELPATH        : Win32_LogicalFileSecuritySetting.Path=&amp;quot;C:\\Users\\vPodans\\text[text].txt&amp;quot;
&amp;lt;...&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Но в именах файлов и папок может содержаться один коварный символ – backtick (&lt;strong&gt;`&lt;/strong&gt;). Его заэскейпить не представляется возможным, поэтому единственный выход с ним – прописывать путь в одинарных кавычках, чтобы этот мета-символ использовался в качестве литерала. В связи с чем я немного подрихтовал пост, ссылка на который приведена в начале этого поста.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=515f1bd4-d948-4ae8-b890-6159dc58e366"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,515f1bd4-d948-4ae8-b890-6159dc58e366.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=829a1ecd-f238-4ba1-b9f5-289768dadb40</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,829a1ecd-f238-4ba1-b9f5-289768dadb40.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,829a1ecd-f238-4ba1-b9f5-289768dadb40.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=829a1ecd-f238-4ba1-b9f5-289768dadb40</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>Восстановление функциональности классов WMI</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,829a1ecd-f238-4ba1-b9f5-289768dadb40.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,829a1ecd-f238-4ba1-b9f5-289768dadb40.aspx</link>
      <pubDate>Sat, 18 Jul 2009 13:45:06 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В своём предыдущем блоге я писал заметку про то, как можно случайно удалить классы WMI – &lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!192.entry"&gt;PowerShell - убийца WMI классов?&lt;/a&gt; И недавно узнал, как можно восстановить эту функциональность обратно. Сами Win32 классы находятся в библиотеке CIMWIN32.MOF, которая и повреждается при удалении классов. Чтобы вернуть эти классы – достаточно перекомпилировать эту библиотеку:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;C:\Windows\System32\wbem\MOFComp CIMWIN32.MOF&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;div style="width: 900px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [system32] gwmi win32_share

Name                                    Path                                    Description
----                                    ----                                    -----------
ADMIN$                                  C:\Windows                              Remote Admin
C$                                      C:\                                     Default share
D$                                      D:\                                     Default share
IPC$                                                                            Remote IPC
P$                                      P:\                                     Default share
print$                                  C:\Windows\system32\spool\drivers       Printer Drivers
Work                                    D:\Users\vpodans\Work
Z$                                      Z:\                                     Default share
_Shared Documents                       D:\Users\_Shared Documents


&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [system32] [wmiclass]'win32_share'


   NameSpace: ROOT\cimv2

Name                                Methods              Properties
----                                -------              ----------
Win32_Share                         {Create, SetShare... {AccessMask, AllowMaximum, Caption, Description...}


&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [system32] ([wmiclass]'win32_share').delete()
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [system32] gwmi win32_share
&lt;font color="#ff0000"&gt;Get-WmiObject : Invalid class
At line:1 char:5
+ gwmi &amp;lt;&amp;lt;&amp;lt;&amp;lt;  win32_share
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand&lt;/font&gt;

&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [system32] cd wbem
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [wbem] &lt;font color="#ffffff"&gt;MOFComp CIMWIN32.MOF
Microsoft (R) MOF Compiler Version 6.0.6000.16386
Copyright (c) Microsoft Corp. 1997-2006. All rights reserved.
Parsing MOF file: CIMWIN32.MOF
MOF file has been successfully parsed
Storing data in the repository...
Done!&lt;/font&gt;
&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [wbem] gwmi win32_share

Name                                    Path                                    Description
----                                    ----                                    -----------
ADMIN$                                  C:\Windows                              Remote Admin
C$                                      C:\                                     Default share
D$                                      D:\                                     Default share
IPC$                                                                            Remote IPC
P$                                      P:\                                     Default share
print$                                  C:\Windows\system32\spool\drivers       Printer Drivers
Work                                    D:\Users\vpodans\Work
Z$                                      Z:\                                     Default share
_Shared Documents                       D:\Users\_Shared Documents


&lt;font color="#00ff00"&gt;[↑]&lt;/font&gt; [wbem]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Вот так я сначала показал, как можно убить класс WMI и восстановить его обратно очень простым способом.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=829a1ecd-f238-4ba1-b9f5-289768dadb40"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,829a1ecd-f238-4ba1-b9f5-289768dadb40.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b</wfw:commentRss>
      <title>PS FCIV (часть 3)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</link>
      <pubDate>Thu, 09 Jul 2009 21:43:12 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;И я снова вернулся. После последнего анализа кода была обнаружена серьёзная ошибка в коде, из-за которой пришлось его очень сильно переписывать. Поэтому я предлагаю оценить RC версию скрипта, который уже выполняет свою задачу, которая расписана в предыдущих статьях.&lt;/p&gt;  &lt;div&gt;   &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; height: 66px; margin-left: auto; border-left-width: 0px; margin-right: auto" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt;&lt;span style="line-height: 1.25em; display: block; cursor: pointer; padding-top: 1px" title="Download file"&gt;PS1 file              &lt;br /&gt;25,5 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self" alt="Download File"&gt;PSFCIV_0.85.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt; &lt;/div&gt; Итак, как с этим скриптом начинать работать. В скрипте есть 3 обязательных параметра: путь к папке, которую нужно посчитать или проверить, путь к XML файлу (если файла нету, то он будет создан) и как минимум 1 алгоритм хеширования. Т.е. минимум это должно выглядеть вот так:   &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;.\PSFCIV_0.85.ps1 C:\Temp –xml DB.XML –sha1&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;При этом можно указать алгоритм &lt;font color="#0000ff"&gt;–md5&lt;/font&gt; или оба сразу (&lt;font color="#0000ff"&gt;-sha1 –md5&lt;/font&gt;). В таком случае для каждого файла будет сгенерировано 2 хеша. Без указания любого из этих параметров будет сгенерирована ошибка и работа будет остановлена.&lt;/p&gt;  &lt;p&gt;Опциональные параметры:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Include&lt;/strong&gt; file.ext&lt;/font&gt; – будет произведена проверка только указанного файла; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Recurse&lt;/strong&gt;&lt;/font&gt; – будет произведена проверка всех файлов в папке и подпапках; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Rebuild&lt;/strong&gt;&lt;/font&gt; – особый режим обновления XML файла, из которого будут удалены устаревшие записи и если есть новые файлы в папке или папках, то они будут добавлены в XML файл. Данный ключ требует наличия XML файла. Если файл БД не будет обнаружен, то будет выведена соответствующая ошибка. При этом режиме проверка целостности файлов не проверяется. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Verbose&lt;/strong&gt; brief/full&lt;/font&gt; – включает один из режимов вывода информации о ходе проверки на консоль. Можно выбрать Brief – упрощённый или Full – максимальный. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Show&lt;/strong&gt; Total/New/Ok/Bad/Miss&lt;/font&gt; – включает дополнительный режим вывода на экран одной из выбранных категорий. Например, всех проверенных файлов, только новых файлов, которые добавлены в БД, только файлов, которые прошли проверку, только файлы с несоответствующим хешем или только файлы, для которых есть запись в БД, но самого файла уже нету. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Force&lt;/strong&gt; Rename/Delete&lt;/font&gt; – включает режим действия над проблемными файлами. Можно выбрать – переименования (тогда к файлу будет добавлено расширение &lt;strong&gt;.BAD&lt;/strong&gt;) или удаления файла. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;На данном этапе реализована работа в соответствии с логикой (которая описана тут: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx"&gt;PS FCIV (часть 1)&lt;/a&gt;) и односторонняя совместимость с FCIV. Т.е. этой утилите можно скармливать XML файл, который сгенерирован с помощью этого скрипта. В скрипте начата реализация поддержки альтернативных БД, которые не совместимы с FCIV XML. Плюс планируется обеспечение двусторонней поддержки FCIV – т.е. скрипт сможет корректно воспринимать и обрабатывать XML файлы, которые сгенерированы утилитой FCIV. Ну и оптимизация самого кода. Сам скрипт снабжён достаточно плотными комментариями, поэтому будет совсем нетрудно с ним разобраться. По мере дописывания кода буду выкладывать более актуальные версии файла.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Update 27.07.2009&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Скрипт &lt;strong&gt;PsFCIV.ps1&lt;/strong&gt; переписан в виде &lt;em&gt;Advanced Function&lt;/em&gt; под именем &lt;strong&gt;Get-PsFCIV&lt;/strong&gt;. Теперь его достаточно загрузить в консоль используя &lt;em&gt;dot-sourcing&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;Добавлена справка для функции. После загрузки функции в консоль достаточно набрать команду: &lt;strong&gt;Get-Help Get-PsFCIV&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;По умолчанию на экран не выводится никакой информации, а только коды возврата. Коды возврата описаны в справке. &lt;/li&gt;    &lt;li&gt;Изменён ключ &lt;strong&gt;-Verbose&lt;/strong&gt;. Теперь используется стандартный ключ &lt;strong&gt;-Verbose&lt;/strong&gt; для вывода расширенной информации. Аргументы не принмаются.&lt;/li&gt;    &lt;li&gt;Добавлен стандартный ключ &lt;strong&gt;-Debug&lt;/strong&gt; для вывода диагоностической информации. &lt;/li&gt;    &lt;li&gt;Добавлена поддержка обработки XML файла сгенерированного утилитой FCIV (т.е. совместимость с FCIV теперь двусторонняя). &lt;/li&gt;    &lt;li&gt;Ключ &lt;strong&gt;-Force&lt;/strong&gt; заменён на ключ &lt;strong&gt;-Action&lt;/strong&gt; с сохранением аргументов.&lt;/li&gt;    &lt;li&gt;К ключу &lt;strong&gt;-Show&lt;/strong&gt; добавлен ещё один аргумент &lt;strong&gt;Unknown&lt;/strong&gt; для индикации файлов с неопределённым результатом проверки. Такое состояние у файла может быть в случае, если не удалось сопоставить алгоритмы хеширования. Т.е. когда при вызове функции указывается алгоритм –SHA1, но в XML файле есть только MD5 хеш и наоборот.&lt;/li&gt; &lt;/ul&gt;  &lt;div&gt;   &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file              &lt;br /&gt;32,4 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self" alt="Download File"&gt;PSFCIV_0.88.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=29898a6c-aceb-4738-82d8-318bc89272cc</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=29898a6c-aceb-4738-82d8-318bc89272cc</wfw:commentRss>
      <title>PS FCIV (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</link>
      <pubDate>Fri, 03 Jul 2009 20:26:05 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Продолжаем повествование о процессе разработки функционального аналога FCIV.&lt;/p&gt;  &lt;h1 align="center"&gt;Подсчёт хешей и кодирование в Base64 String&lt;/h1&gt;  &lt;p&gt;Как я уже упоминал, самая первая и основная функциональная часть – функция подсчёта хешей. Я уже делал скрипт, который считает хеши: &lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!201.entry"&gt;Полезная безделушка Hash SHA1 на PowerShell&lt;/a&gt;, который и стал основой моего скрипта. Однако, по одной причине саму считалку пришлось обрезать. Если посмотреть справку по FCIV (&lt;a href="http://support.microsoft.com/kb/841290"&gt;http://support.microsoft.com/kb/841290&lt;/a&gt;), то он не записывает в БД реальный хеш файла, а пропускает его ещё через &lt;strong&gt;Base64&lt;/strong&gt; кодировку и закодированный хеш уже записывается в XML файл. В .NET уже есть стандартный кодировщик Base64, который на входе принимает массив байтов. Если посмотреть на указанный пост из моего блога, то там я приводил вывод объекта &lt;strong&gt;$hasher&lt;/strong&gt;, который как раз и является байтовым массивом, который мы потом преобразовывали в строку. Здесь же преобразовывать в строку ничего не нужно, а сразу подаём этот массив в конвертер. Вот как выглядит функция подсчёта хеша:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_hashbytes_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;sha1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Create&lt;/span&gt;&lt;span style="color: #000000"&gt;()}
        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;md5&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.MD5&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Create&lt;/span&gt;&lt;span style="color: #000000"&gt;()}
    }
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.IO.StreamReader&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$hashBytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt;.ComputeHash(&lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt;.BaseStream)
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt;.Close()
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$hashBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;в качестве аргументов мы принимаем тип хеша – &lt;strong&gt;MD5&lt;/strong&gt; или &lt;strong&gt;SHA1&lt;/strong&gt; и сам файл:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] _hashbytes_ sha1 wsr.txt
7
11
122
247
126
249
232
24
193
38
194
124
237
202
26
183
178
64
173
45
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::ToBase64String($(_hashbytes_ sha1 wsr.txt))
Bwt693756BjBJsJ87coat7JArS0=
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::ToBase64String($(_hashbytes_ md5 wsr.txt))
kshzMfHPdtuXdL6l/vWwPA==
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;я подсчитал SHA1 хеш для текстового файла и на выходе получил такой же по структуре массив байтов, как и в предыдущей статье. И далее я этот массив подал в качестве аргумента для конвертера Base64 строки (статический метод &lt;a href="http://msdn.microsoft.com/en-us/library/dhx0d524.aspx" target="_blank"&gt;ToBase64String&lt;/a&gt; класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.aspx" target="_blank"&gt;System.Convert&lt;/a&gt;), а на выходе уже получил правильную Base64 строку. Именно эту строку FCIV записывает в файл. То же самое будем делать и мы. Кстати говоря. обратное преобразование делается через тот же класс&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.aspx" target="_blank"&gt;System.Convert&lt;/a&gt;, но с использованием метода &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx" target="_blank"&gt;FromBase64String&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::FromBase64String(&amp;quot;Bwt693756BjBJsJ87coat7JArS0=&amp;quot;)
7
11
122
247
126
249
232
24
193
38
194
124
237
202
26
183
178
64
173
45
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] -join ([System.Convert]::FromBase64String(&amp;quot;Bwt693756BjBJsJ87coat7JArS0=&amp;quot;) | %{&amp;quot;{0:X2}&amp;quot; -f $_})
070B7AF77EF9E818C126C27CEDCA1AB7B240AD2D
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;как видите, массив байтов получился точно такой же. Второй строкой я показал, как можно собрать строку самого хеша, которую показывают различные программы подсчёта хешей. Как можно заметить все числа в массиве меньше, чем 256, т.е. не превышают значения 2&lt;sup&gt;8&lt;/sup&gt;, что является 1 байтом в двоичной форме. В цикле &lt;strong&gt;Foreach-Object&lt;/strong&gt; я преобразовываю каждый байт в &lt;strong&gt;HEX&lt;/strong&gt; и собираю в единую строку оператором &lt;strong&gt;–Join&lt;/strong&gt;, который доступен только в PowerShell V2. Но можно собрать и через &lt;strong&gt;[System.String]::Join()&lt;/strong&gt; для PowerShell 1.0.&lt;/p&gt;

&lt;h1 align="center"&gt;Генерация FCIV-совместимого XML файла&lt;/h1&gt;

&lt;p&gt;Если посмотреть в статью по FCIV, то увидим, что он использует свою нестандартную XML схему:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FCIV&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;wsr.txt&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;Bwt693756BjBJsJ87coat7JArS0=&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;0&lt;/strong&gt;&amp;lt;/&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;xd/Rh0JyuW/I6sxPzY4sULyjS38=&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FCIV&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;По этой причине мы лишаемся возможности использования &lt;strong&gt;Export-CliXML&lt;/strong&gt; и подобных команд, а нужно собирать вручную.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Внимание:&lt;/font&gt;&lt;/strong&gt; хоть FCIV и непривередлив к дополнительным полям в XML, но он начинает сильно ругаться, если поле Name написано с большой буквы. Его нужно заполнять так, как он есть в экземпляре, т.е. все маленькие буквы.&lt;/p&gt;

&lt;p&gt;Объект, который будет хранить все данные о файле будет вот такой:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Т.е. мы в XML будем писать имя файла, его размер в байтах, время и дату последней модификации файла и хеши SHA1 и MD5. Если при создании БД мы будем использовать только один хеш, то второй будет просто пустым. Для сборки XML нам потребуется потребуется функция. Эту схему можно разложить на 3 составные части:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;заголовок XML и открывающийся тег &lt;strong&gt;&amp;lt;FCIV&amp;gt;&lt;/strong&gt;. Это присуствует только в начале XML файла и всё. Этот тег и заголовок больше нигде в XML не встречается. Поэтому header и открывающийся тег нужно поместить в скриптоблок &lt;strong&gt;Begin&lt;/strong&gt; функции.&lt;/li&gt;

  &lt;li&gt;А вот теги &lt;strong&gt;&amp;lt;FILE_ENTRY&amp;gt;&lt;/strong&gt; они повторяются для каждой записи. Следовательно этот тег будем заполнять в конструкции Process функции. Т.е. в каждой итерации &lt;strong&gt;Process&lt;/strong&gt; будет создаваться новый тег &lt;strong&gt;&amp;lt;FILE_ENTRY&amp;gt;&lt;/strong&gt;. Но внутри этого тега есть ещё вложенные теги, которые описывают наш файл. Чтобы решить эту задачу мы должны внутри конструкции &lt;strong&gt;Process&lt;/strong&gt; (которая по сути будет являться циклом) написать ещё один цикл, который будет разбирать входящий объект и данные из его свойств записывать во вложенные теги.&lt;/li&gt;

  &lt;li&gt;В конце XML файла будет закрывающийся тег &lt;strong&gt;&amp;lt;/FCIV&amp;gt;&lt;/strong&gt;, его будем помещать в скриптоблок End нашей функции.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt; Вот такая функция у меня получилась:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_toxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в Begin создаём заголовок XML и открывающийся тег &amp;lt;FCIV&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Begin&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;?xml version=`&amp;quot;1.0`&amp;quot; ?&amp;gt;`n &amp;lt;FCIV&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в Process будут по одному поступать объекты, которые описывают файл.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Process&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; для каждого файла у нас будет один тег &amp;lt;FILE_ENTRY&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;FILE_ENTRY&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; чтобы вручную не создавать и не заполнять вложенные теги мы простым foreach&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; перечисляем теги, какие у нас будут в XML и за счёт переменных автоматом&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём их в XML и заполняем их данными. Для этого свойства объектов должны&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; называться так же, как и теги.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$child&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)) {
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;$child&amp;gt;$($_.$child)&amp;lt;/$child&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда текущий объект обработан, закрываем тег и ждём следующий объект файла&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;/FILE_ENTRY&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда объекты закончились, закрываем первый тег &amp;lt;FCIV&amp;gt; и подаём полученный XML дальше&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;/FCIV&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;в ходе испытаний нарвался на одну засаду. В XML существуют некоторые символы как ‘&lt;strong&gt;&amp;amp;&lt;/strong&gt;’, ‘&lt;strong&gt;&amp;lt;&lt;/strong&gt;’, ‘&lt;strong&gt;&amp;gt;&lt;/strong&gt;’ и другие (полный список перечислен тут: &lt;a title="http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm" href="http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm"&gt;http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm&lt;/a&gt;), которые нужно эксейпить, поскольку являются метасимволами в XML. Эти символы (в частности одинарная кавычка и амперсанд) могут присутствовать в имени файла. Погуляв по сайту MSDN нашёл выход. Выход заключается в использовании метода &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape.aspx" target="_blank"&gt;Escape&lt;/a&gt; класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.securityelement.aspx" target="_blank"&gt;System.SecurityElement&lt;/a&gt;. Поэтому после того как массив объектов (которые описывают каждый файл) будет собран его нужно пропустить через фильтр и только после этого собирать XML вышеприведённой функцией. Вот как выглядит фильтр:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_escxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; {
    &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;Security.SecurityElement&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name)
    &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Напоминаю, что мы должны эскейпить только свойство Name нашего объекта.&lt;/p&gt;

&lt;h1 align="center"&gt;Преобразование FCIV-совместимого XML в массив объектов&lt;/h1&gt;

&lt;p&gt;Вот мы уже научились правильно создавать XML файл, который будет полностью совместим со схемой, которая используется в самом FCIV. Теперь у нас возникает задача чтения этого XML и преобразования в массив объектов. Сначала я долго горевал, плакал и бился головой об стену, что нельзя использовать &lt;strong&gt;Import-CliXML&lt;/strong&gt;, но преобразование типов решило задачу ничуть не сложнее:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_fromxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$xml&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;xml&lt;/span&gt;&lt;span style="color: #000000"&gt;]$(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gc&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-LiteralPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$xml&lt;/span&gt;&lt;span style="color: #000000"&gt;)).FCIV.FILE_ENTRY | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;сначала читаем файл и преобразовываем его в типа данных XML, опускаем теги &lt;strong&gt;FCIV&lt;/strong&gt; и &lt;strong&gt;FILE_ENTRY&lt;/strong&gt; и в цикле разбираем вложенные теги и собираем объект. Получилось достаточно просто. На сегодня, я думаю, что хватит, продолжение следует.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=29898a6c-aceb-4738-82d8-318bc89272cc"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=22a8186c-615b-41fa-8062-d74e1a2a28e0</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=22a8186c-615b-41fa-8062-d74e1a2a28e0</wfw:commentRss>
      <title>PS FCIV (часть 1)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</link>
      <pubDate>Thu, 02 Jul 2009 19:38:14 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;После продолжительного затишья вызванного различными причинами (как выступление на MCP клубе в Москве), продолжаю тему PowerShell. На этот раз реализованный на PowerShell аналог &lt;STRONG&gt;File Checksum Integrity Verifier&lt;/STRONG&gt; (&lt;EM&gt;FCIV&lt;/EM&gt;) с расширенным функционалом по просьбе &lt;A href="http://pronichkin.com/default.aspx" target=_blank&gt;Артёма Проничкина&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;У каждого системного администратора&amp;nbsp; имеется некоторый файловый ресурс, который содержит такие вещи как инсталляционные ресурсы для своей компании и зачастую эти ресурсы достаточно большие и очень важно отслеживать целостность каждого файла, что он не был случайно модифицирован dbhecjv или как-то иначе повреждён. А так же контролировать появление новых файлов и удаление имеющихся файлов. Так же при обмене файловыми ресурсами можно использовать данный скрипт (который будет опубликован чуть позже) для проверки целостности передачи данных по сети. Например, сформировали комплект файлов для пересылки по сети. Сначала заготавливается исходная БД и это всё передаётся по сети в точку назначения, где применяют этот же скрипт и приложенную БД и проверяют, все ли файлы пришли целыми.&lt;/P&gt;
&lt;P&gt;Для решения этой задачи Microsoft в своё время выпустила утилиту &lt;STRONG&gt;FCIV&lt;/STRONG&gt; - &lt;A title=http://support.microsoft.com/kb/841290 href="http://support.microsoft.com/kb/841290"&gt;http://support.microsoft.com/kb/841290&lt;/A&gt;. Суть работы этой утилиты заключается в том, что она в указанной папке (и подпапках по желанию) подсчитывает хеш каждого файла и заносит его значение в свою БД. БД представляет собой обычный XML файл, который содержит имя и хеш-сумму для файла. При повторной проверки утилита считывает данные из XML файла, подсчитывает для каждого файла хеш и сравнивает его с тем, который записан в БД. Собственно, это весь функционал утилиты. Чтобы расширить функционал этой утилиты пришлось написать свой скрипт, который решает эту задачу. Причём этот скрипт будет полностью совместим с FCIV, хоть и использует свои механизмы подсчёта файлов и генерации XML файла.&lt;/P&gt;
&lt;P&gt;Самое первое – правильно составить логику работы скрипта:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;ищем XML &lt;BR&gt;если XML есть &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; берём список файлов из XML &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; эталонные хеши тоже из XML &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; реальные хеши добываем при обсчёте файлов &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; сравниваем со всеми вытекающими последствиями &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; если файл есть в XML, а в папке нету - плачем &lt;BR&gt;если XML нету &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ничего не сравниваем &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; считаем хеши всех файлов в папке &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; записываем их в XML&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Как оказалось, FCIV оказался непривередливым в отношении полей в XML файле, поэтому я решил добавить 2 своих поля – дата последней модификации и размер файла в байтах. Добавив 2 новых поля я позволил немного сократить общее время работы скрипта: как известно, подсчёт хешей для файлов процесс ресурсоёмкий (по CPU и по времени) и если мы при сравнении обнаружим, что изменились либо дата последней модификации, либо размер файла, то пересчитывать для него хеш совершенно не обязательно, поскольку есть 100% вероятность, что он не совпадёт с тем, что записан в БД. Итак, описание функционала скрипта:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;возможность подсчёта хешей файлов не только в текущей папке, но и подпапках; 
&lt;LI&gt;возможность проверки только одного файла из БД; 
&lt;LI&gt;возможность проверки файлов только с определёнными расширениями; 
&lt;LI&gt;возможность подсчёта хешей: &lt;STRONG&gt;MD5&lt;/STRONG&gt; или &lt;STRONG&gt;SHA1&lt;/STRONG&gt;. А так же есть возможность подсчёта обоих типов хешей с записью всех результатов в файл БД; 
&lt;LI&gt;возможность контроля даты и времени последней модификации файла с точностью до секунды и размера файла с точностью до байта; 
&lt;LI&gt;3 режима вывода служебной информации: без вывода, с минимальным выводом и с полным выводом служебной информации; 
&lt;LI&gt;итоговая статистика, которая будет показывать общее количество проверенных файлов и количество файлов с определённым статусом (хороший/изменённый/отсутствующий/вновь добавленный); 
&lt;LI&gt;полная обратная совместимость с FCIV; 
&lt;LI&gt;возможность указания действия для изменённых файлов на выбор (переименование или удаление); 
&lt;LI&gt;поскольку БД статическая и при сверке новые файлы в каталогах не проверяются и устаревшие записи не удаляются, поэтому был добавлен отдельный режим &lt;STRONG&gt;ReSync&lt;/STRONG&gt;, который будет очищать записи для несуществующих более файлов и заносить в БД новые файлы, которые появляются в проверяемых папках. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Тело скрипта разбито на несколько функциональных частей:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;функция подсчёта хешей; 
&lt;LI&gt;генерация FCIV-совместимого XML файла; 
&lt;LI&gt;преобразование FCIV-совместимого XML файла в массив объкектов; 
&lt;LI&gt;организация итоговой статистики работы; 
&lt;LI&gt;обеспечение основной логики работы. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Это была вводная часть в достаточно длительную эпопею с реализацией заданного функционала. В следующих частях в деталях будет рассмотрена каждая функциональная часть скрипта и в конце повествования будет опубликован сам скрипт, поэтому не отключайтесь.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=22a8186c-615b-41fa-8062-d74e1a2a28e0"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=2fb222c6-20de-459b-ad2a-c3ccc1328d5c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,2fb222c6-20de-459b-ad2a-c3ccc1328d5c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,2fb222c6-20de-459b-ad2a-c3ccc1328d5c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=2fb222c6-20de-459b-ad2a-c3ccc1328d5c</wfw:commentRss>
      <title>Scripting Games 2009 – Event6 (The 110-meter hurdles)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,2fb222c6-20de-459b-ad2a-c3ccc1328d5c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,2fb222c6-20de-459b-ad2a-c3ccc1328d5c.aspx</link>
      <pubDate>Mon, 15 Jun 2009 21:15:38 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 35px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Scripting Games 2009" border="0" alt="Scripting Games 2009" align="left" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/ScriptingGames2009Event6The110meterhurdl_106E9/scripto_torchrunner_6.gif" width="150" height="167" /&gt; Бег на 110 метров с барьерами.&lt;/p&gt;  &lt;h1 align="center"&gt;Beginner Division&lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;В исходном файле скрипта найти все ошибки и исправить их. При запуске скрипта на рабочем столе должны появиться 3 ярылка: на сам скрипт, на веб-сайт Hey, Scripting Guys! и ярлык на блокнот (notepad.exe). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Всё копировать не буду, а только приведу уже готовый скрипт. Сам текст скрипта можно взять тут: &lt;a href="http://blogs.technet.com/heyscriptingguy/archive/2009/06/14/hey-scripting-guy-2009-scripting-games-event-6-details-released-beginner-and-advanced-110-meter-hurdles.aspx"&gt;Hey, Scripting Guy! Opening Ceremonies and 2009 Scripting Games Event 6 Details (Beginner and Advanced; 110-meter hurdles)&lt;/a&gt;. Исходные ошибочные строки привёл в комментарии:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;==========================================================================&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; PowerShell:  AUTHOR: Ed Wilson , msft,  6/15/2009&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; NAME: Beg_6.ps1&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; COMMENT: Key concepts are listed below:&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;1. Uses wscript.shell to create three shortcuts on the desktop. The first is a shortcut&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;2. to this actual script. It uses the scriptfullName property to assign the path.&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;3. The second is a simple Web site URL shortcut. The third one is a shortcut to&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;4. Notepad.&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;==========================================================================&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000080"&gt;$ErrorActionPreference&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;SilentlyContinue&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Set-PSDebug&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Strict&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Variable&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;objShell&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;instance of the wshSHell object&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Variable&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;strDesktop&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;pointer to desktop special folder&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Variable&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;used to set properties of the shortcut. Comes from using createShortCut&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Variable&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;objURL&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;used to set properties of webshortcut.&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; было: $oShell = New-Object -ComObject (&amp;quot;WScript.Shell&amp;quot;) - ошибка в имени переменной&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShell&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;WScript.Shell&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$strDesktop&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$objShell&lt;/span&gt;&lt;span style="color: #000000"&gt;.SpecialFolders.item(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Desktop&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)

&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$objShell&lt;/span&gt;&lt;span style="color: #000000"&gt;.CreateShortcut(&lt;/span&gt;&lt;span style="color: #800080"&gt;$strDesktop&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;\Shortcut Script.lnk&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; было: $objShortCut.TargetPath = $MyInvocation.ScriptName - неверное свойство&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.TargetPath &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$MyInvocation&lt;/span&gt;&lt;span style="color: #000000"&gt;.MyCommand
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.WindowStyle &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.Hotkey &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;CTRL+SHIFT+F&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.IconLocation &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;notepad.exe, 2&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.Description &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Shortcut Script&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.WorkingDirectory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$strDesktop&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; было: $objShortCut.Save - при вызове метода забыли скобки&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.Save()

&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; $wshShell = New-Object -ComObject wscript.shell - не нужно совсем&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; было: $objURL = $objShell.CreateShortcut($strDesktop &amp;amp; &amp;quot;\The Microsoft Scripting Guys.url&amp;quot;)&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; вместо + поставили &amp;amp; из VBS&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objURL&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$objShell&lt;/span&gt;&lt;span style="color: #000000"&gt;.CreateShortcut(&lt;/span&gt;&lt;span style="color: #800080"&gt;$strDesktop&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;\The Microsoft Scripting Guys.url&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objURL&lt;/span&gt;&lt;span style="color: #000000"&gt;.TargetPath &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;http://www.ScriptingGuys.com&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; было: $objURL.Discription = &amp;quot;Scripting Guys&amp;quot;. Такого свойства в URL файлах нету.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objURL&lt;/span&gt;&lt;span style="color: #000000"&gt;.Save()

&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; было: $wshNetwork = New-Object -ComObject wscript.network - не нужно свсем&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; было: $objShortCut = $objShell.CreateShortcut($strDesktop + &amp;quot;\notepad.link&amp;quot;)&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; расширение не LNK, а LINK&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$objShell&lt;/span&gt;&lt;span style="color: #000000"&gt;.CreateShortcut(&lt;/span&gt;&lt;span style="color: #800080"&gt;$strDesktop&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;\notepad.lnk&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; было: $objShortCut.TargetPath = &amp;quot;notpad.exe&amp;quot; - пропустили букву E&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.TargetPath &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;notepad.exe&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.IconLocation &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;notepad.exe, 0&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.description &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;notepad&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$objShortCut&lt;/span&gt;&lt;span style="color: #000000"&gt;.Save()&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Если запустить этот скрипт из файла, то получится 3 ярлыка и первый будет вести именно на файл самого скрипта.&lt;/p&gt;

&lt;h1 align="center"&gt;Advanced Division&lt;/h1&gt;

&lt;p&gt;и снова задача на парсинг текста. Потребуется файл &lt;b&gt;network trace_adv6.txt&lt;/b&gt; из Competitors pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;распарсить вывод tracert и показать участки, на которых наблюдается замедление скорости (т.е. время прыжка увеличивается) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Самая первая задача, которая перед нами встаёт – создание регулярного выражения. Выражение у меня получилось вот такое:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;^\d+\W+(\d+)\D+(\d+)\D+(\d+) ms&amp;#160; (.*)&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Что оно делает: оно откидывает порядковый номер прыжка (&lt;strong&gt;hop&lt;/strong&gt;), любую небуквенную последовательность (в общем смысле [A-Za-z0-9]) и выбирает первую последовательность чисел. Эта последовательность будет будет являться временем первой попытки посылки ICMP пакета. Далее откидывается любая нечисловая последовательность и выбирается первая же числовая последовательность, которая будет являться второй попыткой посылки ICMP пакета. То же самое делаем до 3-й попытки текущего прыжка включительно. После выкидываем пробел и последовательность букв “ms”, за ней 2 пробела и захватываем всё до конца строки, что будет являеться адресом и/или именем маршрутизатора. Т.к. перед порядковыми номерами прыжков (до 9 включительно) присуствует пробел, то его можно средать методом &lt;strong&gt;Trim()&lt;/strong&gt; и уже подставлять выражение. Из захваченного времени нужно на лету посчитать среднее значение. И вот что у меня вышло:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gc &amp;quot;Network Trace_Adv6.txt&amp;quot; | ?{$_.trim() -match &amp;quot;^\d+\W+(\d+)\D+(\d+)\D+(\d+) ms  (.*)&amp;quot;} | %{
&amp;gt;&amp;gt;     $current = &amp;quot;&amp;quot; | Select @{n='Average';e={[int](([int]$matches[1]+[int]$matches[2]+[int]$matches[3])/3)}},
&amp;gt;&amp;gt;     @{n='Name';e={$matches[4]}}
&amp;gt;&amp;gt;     $current
&amp;gt;&amp;gt; } | ft -a
&amp;gt;&amp;gt;

Average Name
------- ----
      1 r10.ntwk.nwtraders.com [192.168.227.82]
      1 r20.ntwk.nwtraders.com [192.168.169.1]
      1 r50.ntwk.nwtraders.com [192.226.42.47]
     13 r70.ntwk.nwtraders.com [192.226.42.12]
     34 r12.ntwk.nwtraders.com [192.226.42.9]
     34 r40.ntwk.nwtraders.com [192.226.42.22]
    104 r22.ntwk.nwtraders.com [192.226.34.80]
    105 r32.ntwk.nwtraders.com [192.226.47.10]
    125 r35.ntwk.nwtraders.com [192.226.41.198]
    173 r37.ntwk.nwtraders.com [192.226.38.14]
    173 r38.ntwk.nwtraders.com [192.226.226.119]
    389 192.168.216.5
    390 r60.ntwk.nwtraders.com [192.168.236.9]


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Теперь нужно определить на каких участках происходит замедление. Я решил поэтапно циклом For проверять каждый элемент массива – меньше ли он, чем следующий элемент или нет. Если он равен или больше следующего элемента, то ничего делать не надо, т.к. замедления нету. Если меньше, то он является пограничным этапом, где происходит замедление и выводим его на экран. Привожу уже готовый код и полученный результат:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @()
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gc&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Network Trace_Adv6.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | ?{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.trim() &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;^\d+\W+(\d+)\D+(\d+)\D+(\d+) ms  (.*)&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Average&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;](([&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;[1]+[&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;[2]+[&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;[3])&lt;/span&gt;&lt;span style="color: #ff0000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt;)}},
    @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;[4]}}
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;span style="color: #000000"&gt;
}
$(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-le&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;.Count; &lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #ff0000"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt; ) {
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt;].Average &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;].Average) {&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt;]}
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;.Count &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;)) {&lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt;]}
}) | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ft&lt;/span&gt;&lt;span style="color: #000000"&gt; @{l&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Average&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.Average};a&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;left&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;}, @{l&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name}} &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AutoSize&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $sum = @()
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gc &amp;quot;Network Trace_Adv6.txt&amp;quot; | ?{$_.trim() -match &amp;quot;^\d+\W+(\d+)\D+(\d+)\D+(\d+) ms  (.*)&amp;quot;} | %{
&amp;gt;&amp;gt;     $current = &amp;quot;&amp;quot; | Select @{n='Average';e={[int](([int]$matches[1]+[int]$matches[2]+[int]$matches[3])/3)}},
&amp;gt;&amp;gt;     @{n='Name';e={$matches[4]}}
&amp;gt;&amp;gt;     $sum += $current
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt; $(for ($i = 0; $i -le $sum.Count; $i++ ) {
&amp;gt;&amp;gt;     if ($sum[$i].Average -lt $sum[$i + 1].Average) {$sum[$i]}
&amp;gt;&amp;gt;     if ($i -eq ($sum.Count - 1)) {$sum[$i]}
&amp;gt;&amp;gt; }) | ft @{l='Average';e={$_.Average};a='left'}, @{l='Name';e={$_.name}} -AutoSize
&amp;gt;&amp;gt;

Average Name
------- ----
1       r50.ntwk.nwtraders.com [192.226.42.47]
13      r70.ntwk.nwtraders.com [192.226.42.12]
34      r40.ntwk.nwtraders.com [192.226.42.22]
104     r22.ntwk.nwtraders.com [192.226.34.80]
105     r32.ntwk.nwtraders.com [192.226.47.10]
125     r35.ntwk.nwtraders.com [192.226.41.198]
173     r38.ntwk.nwtraders.com [192.226.226.119]
389     192.168.216.5
390     r60.ntwk.nwtraders.com [192.168.236.9]


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;А теперь обратите внимание на одну вещь, о которой не все знают:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;pre&gt;  &lt;p&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ft&lt;/span&gt;&lt;span style="color: #000000"&gt; @{l&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Average&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.Average};a&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;left&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;при форматировании &lt;strong&gt;Format-Table&lt;/strong&gt; вы можете атрибутум &lt;strong&gt;A&lt;/strong&gt; (от слова align) двигать содержимое колонки относительно названия. В первом примере у меня стандартное форматирование и выравнивание &lt;strong&gt;Avarage&lt;/strong&gt; по правому краю. Здесь же я содержимое выравнил по левому краю, чтобы не сливались цифры. Хотя это решается удалением &lt;strong&gt;–AutoSize&lt;/strong&gt;, но мне нравится этот ключ &lt;img alt=":)" src="/smilies/happy.gif"&gt; вобщем, об этой фиче не забывайте.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=2fb222c6-20de-459b-ad2a-c3ccc1328d5c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,2fb222c6-20de-459b-ad2a-c3ccc1328d5c.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Scripting Games</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=3e718992-80e2-458a-b2a6-ad293c46fe0c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=3e718992-80e2-458a-b2a6-ad293c46fe0c</wfw:commentRss>
      <title>Scripting Games 2009 – Event5 (The 400-meter race)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</link>
      <pubDate>Sun, 14 Jun 2009 10:16:39 GMT</pubDate>
      <description>&lt;div&gt;&lt;h1 align="center"&gt;Beginner Division&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 30px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="Summer Scripting Games 2009" border="0" alt="Summer Scripting Games 2009" align="left" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/ScriptingGames2009The400meterrace_14888/scripto_torchrunner_3.gif" width="150" height="167" /&gt; задача на работу с реестром.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Найти текущее значение максимального количества закачек в Internet Explorer &lt;/li&gt;    &lt;li&gt;Увеличить это число на другое значение &lt;/li&gt;    &lt;li&gt;при чтении этого значения предусмотреть проверку существования этого параметра &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ключи и значения реестра для этой задачи можно найти тут: &lt;a title="http://support.microsoft.com/kb/282402" href="http://support.microsoft.com/kb/282402"&gt;http://support.microsoft.com/kb/282402&lt;/a&gt;. В принципе, очень просто тут:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;)) {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Item&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ItemType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Registry&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;}
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).MaxConnectionsPer1_0Server) {
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPer1_0Server property doesn't exist&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    [&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPer1_0Server&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-PropertyType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;DWord&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPer1_0Server is: &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).MaxConnectionsPer1_0Server}
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).MaxConnectionsPerServer) {
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPerServer property doesn't exist&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    [&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPerServer&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-PropertyType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;DWord&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPerServer is: &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;).MaxConnectionsPerServer}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и вот вывод:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] if (!(Test-Path $path)) {New-Item -ItemType Registry -Path $path -Force}
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] if (!(Get-ItemProperty $path).MaxConnectionsPer1_0Server) {
&amp;gt;&amp;gt;     Write-Warning &amp;quot;MaxConnectionsPer1_0Server property doesn't exist&amp;quot;
&amp;gt;&amp;gt;     [void](New-ItemProperty -Path $path -Name 'MaxConnectionsPer1_0Server' -Value 10 -PropertyType 'DWord')
&amp;gt;&amp;gt; } else {&amp;quot;MaxConnectionsPer1_0Server is: &amp;quot; + (Get-ItemProperty $path).MaxConnectionsPer1_0Server}
&amp;gt;&amp;gt; if (!(Get-ItemProperty $path).MaxConnectionsPerServer) {
&amp;gt;&amp;gt;     Write-Warning &amp;quot;MaxConnectionsPerServer property doesn't exist&amp;quot;
&amp;gt;&amp;gt;     [void](New-ItemProperty -Path $path -Name 'MaxConnectionsPerServer' -Value 10 -PropertyType 'DWord')
&amp;gt;&amp;gt; } else {&amp;quot;MaxConnectionsPerServer is: &amp;quot; + (Get-ItemProperty $path).MaxConnectionsPerServer}
&amp;gt;&amp;gt;
&lt;font color="#ffff00"&gt;WARNING: MaxConnectionsPer1_0Server property doesn't exist
WARNING: MaxConnectionsPerServer property doesn't exist&lt;/font&gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] if (!(Test-Path $path)) {New-Item -ItemType Registry -Path $path -Force}
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] if (!(Get-ItemProperty $path).MaxConnectionsPer1_0Server) {
&amp;gt;&amp;gt;     Write-Warning &amp;quot;MaxConnectionsPer1_0Server property doesn't exist&amp;quot;
&amp;gt;&amp;gt;     [void](New-ItemProperty -Path $path -Name 'MaxConnectionsPer1_0Server' -Value 10 -PropertyType 'DWord')
&amp;gt;&amp;gt; } else {&amp;quot;MaxConnectionsPer1_0Server is: &amp;quot; + (Get-ItemProperty $path).MaxConnectionsPer1_0Server}
&amp;gt;&amp;gt; if (!(Get-ItemProperty $path).MaxConnectionsPerServer) {
&amp;gt;&amp;gt;     Write-Warning &amp;quot;MaxConnectionsPerServer property doesn't exist&amp;quot;
&amp;gt;&amp;gt;     [void](New-ItemProperty -Path $path -Name 'MaxConnectionsPerServer' -Value 10 -PropertyType 'DWord')
&amp;gt;&amp;gt; } else {&amp;quot;MaxConnectionsPerServer is: &amp;quot; + (Get-ItemProperty $path).MaxConnectionsPerServer}
&amp;gt;&amp;gt;
MaxConnectionsPer1_0Server is: 10
MaxConnectionsPerServer is: 10
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;как бы ничего сложного.&lt;/p&gt;

&lt;h1 align="center"&gt;Advanced Division&lt;/h1&gt;

&lt;p&gt;работа с тэгами файлов. Потребуются файлы &lt;strong&gt;TechEd1.JPG&lt;/strong&gt;, &lt;strong&gt;TechEd2.JPG&lt;/strong&gt; и &lt;strong&gt;TechEd3.JPG&lt;/strong&gt; из Competitors Pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;прочитать следующие EXIF свойства файлов: &lt;/li&gt;

  &lt;li&gt;Имя &lt;/li&gt;

  &lt;li&gt;когда снимок был сделан &lt;/li&gt;

  &lt;li&gt;свойство Make &lt;/li&gt;

  &lt;li&gt;и модель камеры, которой был сделан снимок &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Задача не такая и сложная, на самом деле, как кажется. Для начала нам потребуется класс &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" target="_blank"&gt;System.Drawing.Bitmap&lt;/a&gt; и его метод &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.image.getpropertyitem.aspx" target="_blank"&gt;GetPropertyItem&lt;/a&gt;. Для работы с этим классом нужно подключить библиотеку System.Drawing.dll:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;][&lt;/span&gt;&lt;span style="color: #008080"&gt;reflection.assembly&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;loadfile&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и создать объект &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" target="_blank"&gt;System.Drawing.Bitmap&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.drawing.bitmap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ArgumentList&lt;/span&gt;&lt;span style="color: #000000"&gt; .\&lt;/span&gt;&lt;span style="color: #800000"&gt;TechEd1.jpg&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Этот объект будет содержать всё нам необходимое. Чтобы посмотреть нужные нам свойства, нужно получить где-то список всех ID, которым соответствуют эти свойства. К сожалению я не нашёл такого списка на MSDN, а только отдельными частями в интернете: 
  &lt;br /&gt;&lt;a title="http://www.exif.org/specifications.html" href="http://www.exif.org/specifications.html"&gt;http://www.exif.org/specifications.html&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;там в конце PDF файла есть Appendix с таблицой ID на эту тему. Если посмотреть в таблицу, то увидим, что Model находится под ID = 272. Глянем, что там есть:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $drawing = New-Object system.drawing.bitmap -ArgumentList .\TechEd1.jpg
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $drawing.GetPropertyItem(271).value
67
97
110
111
110
0
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Как-то не очень радует такой вывод. Но если внимательно посмотреть на эти цифры, то можно заметить, что они не превышают число 256, что подсказывает, что это массив &lt;strong&gt;ASCII&lt;/strong&gt; байтов. Эти ASCII байты можно сконвертировать в элемент вот так: &lt;strong&gt;[char]ASCII_Number&lt;/strong&gt;. А т.к. это массив, то его нужно собрать либо методом &lt;strong&gt;ToString()&lt;/strong&gt; или оператором &lt;strong&gt;–Join&lt;/strong&gt;, который есть в PowerShell V2:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $drawing = New-Object system.drawing.bitmap -ArgumentList .\TechEd1.jpg
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $drawing.GetPropertyItem(271).value
67
97
110
111
110
0
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] -join ($drawing.GetPropertyItem(271).value | %{[char]$_})
Canon
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Вот так оно всяко лучше стало. По такой же схеме выбираем и собираем все остальные свойства:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;][&lt;/span&gt;&lt;span style="color: #008080"&gt;reflection.assembly&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;loadfile&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; *.jpg | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;{
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.drawing.bitmap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ArgumentList&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Author&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Make&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Model&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;DateTaken&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.Name &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;.Name
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.Author &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-join&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetPropertyItem&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;315&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;/span&gt;&lt;span style="color: #8b4513"&gt;value&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;})
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.Make &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-join&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetPropertyItem&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;271&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;/span&gt;&lt;span style="color: #8b4513"&gt;value&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;})
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.Model &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-join&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetPropertyItem&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;272&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;/span&gt;&lt;span style="color: #8b4513"&gt;value&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;})
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.DateTaken &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-join&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetPropertyItem&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;36867&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;/span&gt;&lt;span style="color: #8b4513"&gt;value&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;})
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;} | &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ft&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AutoSize&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [void][reflection.assembly]::loadfile(&amp;quot;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll&amp;quot;)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] dir *.jpg | %{
&amp;gt;&amp;gt;     $drawing = New-Object system.drawing.bitmap -ArgumentList $_
&amp;gt;&amp;gt;     $photo = &amp;quot;&amp;quot; | Select Name, Author, Make, Model, DateTaken
&amp;gt;&amp;gt;     $photo.Name = $_.Name
&amp;gt;&amp;gt;     $photo.Author = -join ($drawing.GetPropertyItem(315).value | %{[char]$_})
&amp;gt;&amp;gt;     $photo.Make = -join ($drawing.GetPropertyItem(271).value | %{[char]$_})
&amp;gt;&amp;gt;     $photo.Model = -join ($drawing.GetPropertyItem(272).value | %{[char]$_})
&amp;gt;&amp;gt;     $photo.DateTaken = -join ($drawing.GetPropertyItem(36867).value | %{[char]$_})
&amp;gt;&amp;gt;     $photo
&amp;gt;&amp;gt; } | ft -AutoSize
&amp;gt;&amp;gt;

Name        Author     Make   Model               DateTaken
----        ------     ----   -----               ---------
TechEd1.JPG Ed Wilson  Canon  Canon PowerShot G9  2009:05:12 10:41:03
TechEd2.JPG Ed Wilson  Canon  Canon PowerShot G7  2009:05:12 10:25:59
TechEd3.JPG Ed Wilson  Sony   A-9                 2009:05:12 10:26:48


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Вобщем, как видите, тут тоже ничего сверхсложного нету.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=3e718992-80e2-458a-b2a6-ad293c46fe0c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
      <category>PowerShell / Scripting Games</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=7c0ba133-e2ee-47b8-a14d-9bb3943fb45f</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,7c0ba133-e2ee-47b8-a14d-9bb3943fb45f.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,7c0ba133-e2ee-47b8-a14d-9bb3943fb45f.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=7c0ba133-e2ee-47b8-a14d-9bb3943fb45f</wfw:commentRss>
      <title>Scripting Games 2009 – Event4 (The high jump)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,7c0ba133-e2ee-47b8-a14d-9bb3943fb45f.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,7c0ba133-e2ee-47b8-a14d-9bb3943fb45f.aspx</link>
      <pubDate>Sat, 13 Jun 2009 21:17:31 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 30px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="Summer Scripting Games 2009" border="0" alt="Summer Scripting Games 2009" align="left" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/ScriptingGames2009Event4Thehighjump_86F6/scripto_torchrunner_3.gif" width="150" height="167" /&gt; Прыжки с шестом.&lt;/p&gt;  &lt;h1 align="center"&gt;Beginner Division&lt;/h1&gt;  &lt;p&gt;Потребуется файл &lt;strong&gt;HighJumperDatabase.mdb&lt;/strong&gt; из Competitors Pack.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;опросить MDB файл и вывести имя лучшего прыгуна c шестом (хотя там цифры немного странные для этой дисциплины). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Никогда не приходилось работать с Access, поэтому пришлось честно гуглить: &lt;a title="http://www.visualbasicscript.com/m_43134/tm.htm" href="http://www.visualbasicscript.com/m_43134/tm.htm"&gt;http://www.visualbasicscript.com/m_43134/tm.htm&lt;/a&gt;. Его я взял за основу, только немного подрихтовал и вот что получилось:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём массив, который будет содержать все результаты&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt; @()
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; подключения к БД. Наглый копипаст с форума.&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; более-менее внятное описание этого кода тут:&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; http://technet.microsoft.com/en-us/magazine/2009.05.scriptingguys.aspx&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$adOpenStatic&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;3&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$adLockOptimistic&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;3&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$MDBConn&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-comobject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;ADODB.Connection&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$MDBConn&lt;/span&gt;&lt;span style="color: #000000"&gt;.Open(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;provider=microsoft.jet.oledb.4.0;data source=$pwd\HighJumperDatabase.mdb&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Record&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-comobject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;ADODB.RecordSet&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$Record&lt;/span&gt;&lt;span style="color: #000000"&gt;.Open(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;select * from [High Jumper Data]&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$MDBConn&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$adOpenStatic&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$adLockOptimistic&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Record&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;.MoveFirst()
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt; {
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; делаем объект текущего атлета и забиваем в него нужные значения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Record&lt;/span&gt;&lt;span style="color: #000000"&gt;.Fields.Item(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).Value}},
    @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Personal Best&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Record&lt;/span&gt;&lt;span style="color: #000000"&gt;.Fields.Item(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Personal Best&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).Value}},
    @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Season Best&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Record&lt;/span&gt;&lt;span style="color: #000000"&gt;.Fields.Item(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Season Best&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).Value}}
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; добавляем текущего участника в массив&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$current&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; переходим на следующую итерацию&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$Record&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;.MoveNext()
} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;until&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Record&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;.EOF)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; закрываем все подключения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;&lt;font size="2" face="Consolas"&gt;$Record&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;.Close() 
&lt;/span&gt;&lt;span style="color: #800080"&gt;$MDBConn&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;.Close()
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сортируем и выводим лучшего спортсмена&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Sort&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Season Best&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Personal Best&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Last&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Кстати, отличное решение этой задачи нашёл на VBS. Человек уложился в 4(!) строчки:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;Set adoCon = CreateObject(&amp;quot;ADODB.Connection&amp;quot;) 
      &lt;br /&gt;adoCon.Open &amp;quot;DRIVER=Microsoft Access Driver (*.mdb);DBQ=HighJumperDatabase.mdb&amp;quot; 

      &lt;br /&gt;Winner = adoCon.Execute(&amp;quot;SELECT TOP 1 Name FROM [High Jumper Data] ORDER BY [Personal Best] DESC&amp;quot;)(&amp;quot;Name&amp;quot;) 

      &lt;br /&gt;WScript.Echo &amp;quot;Expected Winner: &amp;quot; &amp;amp; Winner&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Есть мнение, что фанаты PowerShell должны дружно застрелиться &lt;img alt=":)" src="/smilies/happy.gif"&gt; хотя это просто вопрос запроса к базе Access.&lt;/p&gt;

&lt;h1 align="center"&gt;Advanced Division&lt;/h1&gt;

&lt;p&gt;потребуется файл High &lt;strong&gt;Jump Stats_Adv4.txt&lt;/strong&gt; из Competitors Pack.&lt;/p&gt;

&lt;p&gt;В файле перечислены имена прыгунов с шестом и через запятую перечислены высОты планки.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;на основании этих данных построить произвольный (желательно красивы) график в Excel. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Т.к. я графики тоже никогда не рисовал, поэтому тоже пришлось обратиться к гуглу. И вышло примерно такое:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; переименовываем txt файл в CSV. Теперь не нужно конвертировать тектовый файл в&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; формат Excel, т.к. при переименовании Excel сам это сделает&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ren&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;High Jump Stats_Adv4.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;High Jump Stats_Adv4.csv&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выполняем обычную рутину для создания COM объекта для Excel&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;excel.application&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Workbooks&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Open&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;$pwd\High Jump Stats_Adv4.csv&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; | Out-Null&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Visible&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$false&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.DisplayAlerts &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$false&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$sheet&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.Worksheets.Item(&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; добавляем диаграмму&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt;$chart = $excel.Charts.Add()&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; задаём диапазон для диаграммы&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$Range&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$sheet&lt;/span&gt;&lt;span style="color: #000000"&gt;.Range(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;A1:l1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; добавляем элемент Chart с нужным диапазоном. Я выбрал 10 первых попыток&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; для первого атлета. &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$chart&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Charts&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Add&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;()
&lt;/span&gt;&lt;span style="color: #800080"&gt;$chart&lt;/span&gt;&lt;span style="color: #000000"&gt;.SetSourceData(&lt;/span&gt;&lt;span style="color: #800080"&gt;$Range&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$chart&lt;/span&gt;&lt;span style="color: #000000"&gt;.ChartStyle &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;27&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сохраняем Chart в файл формата Excel и закрываем работу&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;.SaveAs(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;$pwd\High Jump Stats_Adv4.xlsx&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Quit&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;()
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gps&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;excel&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;stop-process&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; переименовываем CSV файл обратно в TXT&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ren&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;High Jump Stats_Adv4.csv&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;High Jump Stats_Adv4.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=7c0ba133-e2ee-47b8-a14d-9bb3943fb45f"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,7c0ba133-e2ee-47b8-a14d-9bb3943fb45f.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Scripting Games</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b3db9b44-5009-4490-b110-0d1dc9ad90bc</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b3db9b44-5009-4490-b110-0d1dc9ad90bc.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b3db9b44-5009-4490-b110-0d1dc9ad90bc.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b3db9b44-5009-4490-b110-0d1dc9ad90bc</wfw:commentRss>
      <title>Scripting Games 2009 – Event3 (The shot put)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b3db9b44-5009-4490-b110-0d1dc9ad90bc.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b3db9b44-5009-4490-b110-0d1dc9ad90bc.aspx</link>
      <pubDate>Fri, 12 Jun 2009 07:07:50 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 30px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="Summer Scripting Games 2009" border="0" alt="Summer Scripting Games 2009" align="left" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/ScriptingGames2009Event3Theshotput_9F/scripto_torchrunner_3.gif" width="150" height="167" /&gt; 3-е задание на парсинг текста.&lt;/p&gt;  &lt;h1 align="center"&gt;Beginner Division&lt;/h1&gt;  &lt;p&gt;Потребуется файл &lt;strong&gt;Shot Put.txt&lt;/strong&gt; из Competitors Pack.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;В файле есть 2 абзаца. Нужно первый абзац записать в файл &lt;strong&gt;Shot Put A.txt&lt;/strong&gt;, а второй абзац записать в &lt;strong&gt;Shot Put B.txt&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Переименовать файл Shot Put.txt в &lt;strong&gt;Shot Put.old&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Если внимательно посмотреть на файл, то в нём можно найти одну уникальную последовательность - &lt;strong&gt;`r`n`r`n&lt;/strong&gt;. Она разделяет 2 абзаца. Поэтому эту последовательность можно использовать в качестве разделителя для Get-Content:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $file = gc '.\Shot Put.txt' -Delimiter &amp;quot;`r`n`r`n&amp;quot;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $file[0]
This is the first paragraph of the shot put text file. It will
need to be placed into the first text file which you will create.
The shot put is an event involving putting and heavy metal ball.
The object of the event is to throw the put as far as possible,
or to put the shot : anyway, you get the idea.




&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $file[1]
This is the second paragraph of the shot put text file. it
contains information you will need to put into the second
file which you will also create.
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Если со вторым абзацем понятно, то у первого очень много пробелов и пустых строк. Их можно удалить при помощи метода Trim(), который использовался уже в Event1. Собственно, само решение:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gc&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;.\Shot Put.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Delimiter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;`r`n`r`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;.trim()}
&lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;[0] &amp;gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Shot Put A.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;[1] &amp;gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Shot Put B.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ren&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;.\Shot Put.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Shot Put.old&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h1 align="center"&gt;Advanced Division&lt;/h1&gt;

&lt;p&gt;потребуется файл &lt;strong&gt;Wordlist_ADV3.txt&lt;/strong&gt; из Competitors Pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;распарсить текстовый файл и вытащить из них слова, в которых используется не более одной уникальной гласной буквы. &lt;/li&gt;

  &lt;li&gt;записать эти слова в новый текстовый файл. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Решение:&lt;/p&gt;

&lt;p&gt;В принципе, тут есть только одно простое решение (считайте, что нагло стырено у Васи):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gc&lt;/span&gt;&lt;span style="color: #000000"&gt; .\&lt;/span&gt;&lt;span style="color: #800000"&gt;Wordlist_ADV3.txt&lt;/span&gt;&lt;span style="color: #000000"&gt; | ?{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;[^AEIOUY]&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;^(.)\1*$&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;} &amp;gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Wordlist_ADV3_new.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;суть решения заключается в том, чтобы из каждого слова убрать все согласные и проверить, что в слове используется только одна гласная 1 или более раз. Этот регексп описан в PowerShell Cookbook на странице 494.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b3db9b44-5009-4490-b110-0d1dc9ad90bc"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b3db9b44-5009-4490-b110-0d1dc9ad90bc.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Scripting Games</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=eed0d8e0-ecea-4368-9b9e-3db78514d0d3</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,eed0d8e0-ecea-4368-9b9e-3db78514d0d3.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,eed0d8e0-ecea-4368-9b9e-3db78514d0d3.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=eed0d8e0-ecea-4368-9b9e-3db78514d0d3</wfw:commentRss>
      <title>Scripting Games 2009 – Event2 (The long jump)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,eed0d8e0-ecea-4368-9b9e-3db78514d0d3.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,eed0d8e0-ecea-4368-9b9e-3db78514d0d3.aspx</link>
      <pubDate>Thu, 11 Jun 2009 07:00:41 GMT</pubDate>
      <description>&lt;div&gt;&lt;h1 align="center"&gt;Beginner Division&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 30px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Summer Scripting Games 2009" border="0" alt="Summer Scripting Games 2009" align="left" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/ScriptingGames2009Event2_AC1B/scripto_torchrunner_3.gif" width="150" height="167" /&gt; Тут очень простое задание из серии фаллометрии &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Задача:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Показать данные своего процессора (процессоров) в соответствии с рисунком &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://img.microsoft.com/library/media/1033/technet/images/scriptcenter/games/2009/beg_02_01.jpg" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Решение:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Тут нам потребуется WMI класс Win32_Processor. И из него выберем нужные данные. При этом я проверю, что значения не равны $null или нулю. Если это так, то в это поле впишу текст N/A для читабельности. Вот что получилось:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #000080"&gt;$Host&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;UI&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;RawUI&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;BackgroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Black&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;&lt;font size="2" face="Consolas"&gt;cls&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;win32_processor&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;AddressWidth&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;L2CacheSize&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;L2CacheSpeed&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;L3CacheSize&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;,
L3CacheSpeed, MaxClockSpeed, Name, NumberOfCores, NumberOfLogicalProcessors
&lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gm&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-MemberType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;NoteProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;{
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.$(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$null&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-or&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.$(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.$(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;N/A&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;}
}
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Strength evaluation for LocalHost&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Green&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Speed ... &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.MaxClockSpeed &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;L2 Cache Size:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.L2CacheSize &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;L2 Cache Speed:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.L2CacheSpeed &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;L3 Cache Size:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.L3CacheSize &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;L3 Cache Speed:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.L3CacheSpeed &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Yellow&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Strength&lt;/span&gt;&lt;span style="color: #000000"&gt; ... &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Number of Cores:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.NumberOfCores &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Number of Logical Processors:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.NumberOfLogicalProcessors &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Name: `t`t`t`t&lt;/span&gt;&lt;span style="color: #800000"&gt;' &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.Name &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Magenta&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Agility&lt;/span&gt;&lt;span style="color: #000000"&gt; ... &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Address Width:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$processor&lt;/span&gt;&lt;span style="color: #000000"&gt;.AddressWidth &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ForegroundColor&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Cyan&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И вот вывод:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: black; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $processor = gwmi win32_processor | Select AddressWidth, L2CacheSize, L2CacheSpeed, L3CacheSize,
&amp;gt;&amp;gt; L3CacheSpeed, MaxClockSpeed, Name, NumberOfCores, NumberOfLogicalProcessors
&amp;gt;&amp;gt; $processor | gm -MemberType NoteProperty | %{
&amp;gt;&amp;gt;  if ($processor.$($_.name) -eq $null -or $processor.$($_.name) -eq 0) {$processor.$($_.name) = &amp;quot;N/A&amp;quot;}
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt; Write-Host 'Strength evaluation for LocalHost' -ForegroundColor Green
&amp;gt;&amp;gt; Write-Host 'Speed ... ' $processor.MaxClockSpeed `
&amp;gt;&amp;gt; `n'L2 Cache Size:' $processor.L2CacheSize `
&amp;gt;&amp;gt; `n'L2 Cache Speed:' $processor.L2CacheSpeed `
&amp;gt;&amp;gt; `n'L3 Cache Size:' $processor.L3CacheSize `
&amp;gt;&amp;gt; `n'L3 Cache Speed:' $processor.L3CacheSpeed -ForegroundColor Yellow
&amp;gt;&amp;gt; Write-Host Strength ... `
&amp;gt;&amp;gt; `n'Number of Cores:' $processor.NumberOfCores `
&amp;gt;&amp;gt; `n'Number of Logical Processors:' $processor.NumberOfLogicalProcessors `
&amp;gt;&amp;gt; `n'Name:  $processor.Name -ForegroundColor Magenta
&amp;gt;&amp;gt; Write-Host Agility ... `
&amp;gt;&amp;gt; `n&amp;quot;Address Width: `t`t`t`t&amp;quot; $processor.AddressWidth -ForegroundColor Cyan
&amp;gt;&amp;gt;
&lt;font color="#00ff00"&gt;Strength evaluation for LocalHost&lt;/font&gt;
&lt;font color="#ffff00"&gt;Speed ...  2834
L2 Cache Size: 6144
L2 Cache Speed: 2000
L3 Cache Size: N/A
L3 Cache Speed: N/A&lt;/font&gt;
&lt;font color="#ff00ff"&gt;Strength ...
Number of Cores: 4
Number of Logical Processors: 4
Name:                Intel(R) Core(TM)2 Quad CPU    Q9550  @ 2.83GHz&lt;/font&gt;
&lt;font color="#00ffff"&gt;Agility ...
Address Width: 64&lt;/font&gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;По всей видимости оно получилось как и требовалось.&lt;/p&gt;

&lt;h1 align="center"&gt;Advanced Division&lt;/h1&gt;

&lt;p align="justify"&gt;И тут нас снова ждут соревнования. Здесь нам потребуется файл &lt;strong&gt;LongJump_Adv2.xls&lt;/strong&gt; из Competitors Pack. Файл содержит данные об участниках прыжков в длину и результаты их 3-х попыток.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;На основании результатов 3-х попыток в колонку Result записать лучший результат из 3-х попыток&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;На основании результатов третей попытки для каждого участника, выбрать лучший результат из них и вывести на экран&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Сравнить лучший результат из 3-х попыток для каждого участника с их средним результатом в сезоне. Такой графы я не нашёл, есть только лучший результат в сезоне. Вот с ним я и сравнивал. Если прыгун превзошёл свой личный рекорд сезона, то в графу Exceed,Achieve,Under Perform вписать Exceed. Если повторил, то Achieve или Under Perform, если лучший результат сегодня был хуже результата по сезону.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Отсортировать всю таблицу по графе Exceed,Achieve,Under Perform именно в таком порядке. Т.е. сперва идут те, кто улучшил свой показатель, потом – кто повторил и в самом конце те, кто не смог повторить свой результат в сезоне. И сохранить в файл с таким же именем.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Решение:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Вася Гусев решил окончательно сломать всем мозг разбором XLS в CSV, обработать его и собрать обратно в CSV – &lt;a href="http://xaegr.wordpress.com/2009/06/10/sg-2009-123/"&gt;тиснуть сюда&lt;/a&gt;. Когда я это увидел – стало как-то не очень хорошо. Я решил работать прямо с XLS. И вот что у меня получилось:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; массив, который будет содержать результаты последней попытки прыжков, на основании&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; которых нужно вывести лучший результат&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$lastattempt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt; @()
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём COM объект и прочую рутину.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ComObject&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Excel.Application&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.Visible &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$false&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;DisplayAlerts&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$false&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Workbooks&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Open&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Users\vPodans\LongJump_Adv2.xls&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;) | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Out-Null&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; у нас есть известное кол-во участников - 18. 19-я строка - это заголовки.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; поэтому я исходя из этого решил работать с колонкой Result (8-я по счёту). Т.к.&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; некоторые попытки были провалены и в таблице стояли крестики. Чтобы вручную не парсить&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Consolas"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Consolas"&gt; это всё, я в ячейку воткнул экселовскую формулу MAX, которая всё за меня сделает.&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;.19&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;=max(e$_`:g$_)&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; заодно в $lastattempt запишем результат последней попытки для текущего прыгуна&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #800080"&gt;$lastattempt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;7&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).Value2
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сравниваем лучший результат за сегодня с результатом за сезон&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;4&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).Value2) {
    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и в соответствующую графу пишем результат&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;9&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Under Perform&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; вот тут пришлось использовать читы. Я не очень силён в custom sort в экселе, поэтому&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; рядышком я для каждого статуса Exceed/Achieve/.. я приписываю число. Вот по этому числу&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; я потом буду сортировать таблицу&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;3&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    } &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;elseif&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;8&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;4&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).Value2) {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;9&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Achieve&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;2&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    } &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;font size="2" face="Consolas"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;9&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Exceed&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    }
}
&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выбираем из LastAttempt лучший результат, попутно заменяя крестики на нолики (лол) и выводя лучший результат&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$lastattempt&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;x&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;) {&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;};&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;sort&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-last&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выбираем диапазон изменения таблицы при сортировке. Заголовки не трогаем, поэтому начинаем с 2&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$selection&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.Range(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;a2:j19&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; указываем колонку, по которой будем сортировать&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$range&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.Range(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;j2:j19&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сортируем&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$selection&lt;/span&gt;&lt;span style="color: #000000"&gt;.Sort(&lt;/span&gt;&lt;span style="color: #800080"&gt;$range&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; удаляем читерские числа, которые использовались для сортировки.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;.19&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Cells&lt;/span&gt;&lt;span style="color: #000000"&gt;.Item(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value2 &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;}
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; готово.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Save&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;()
&lt;/span&gt;&lt;span style="color: #800080"&gt;$excel&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Quit&lt;/span&gt;&lt;span style="color: #000000"&gt;()&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Не скажу, что получилось коротко и идеально, но задачу вполне решает.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=eed0d8e0-ecea-4368-9b9e-3db78514d0d3"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,eed0d8e0-ecea-4368-9b9e-3db78514d0d3.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Scripting Games</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=eebb4566-4ff9-4ff8-81e2-e44cabb4192c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,eebb4566-4ff9-4ff8-81e2-e44cabb4192c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,eebb4566-4ff9-4ff8-81e2-e44cabb4192c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=eebb4566-4ff9-4ff8-81e2-e44cabb4192c</wfw:commentRss>
      <title>Scripting Games 2009 – Event1 (The 100-meter dash)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,eebb4566-4ff9-4ff8-81e2-e44cabb4192c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,eebb4566-4ff9-4ff8-81e2-e44cabb4192c.aspx</link>
      <pubDate>Wed, 10 Jun 2009 12:16:53 GMT</pubDate>
      <description>&lt;div&gt;&lt;p align="justify"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 25px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="Summer Scripting Games 2009" border="0" alt="Summer Scripting Games 2009" align="left" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/ScriptingGames2009Event1_11E9F/scripto_torchrunner_3.gif" width="150" height="167" /&gt; И оно свершилось! Хотя официально Scripting Games начинаются только 15-го июня, но уже со вчерашнего дня стали известны уже 2 задания. Для начала немного информации, что и как:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Условия участия и публикации: &lt;a href="http://blogs.technet.com/heyscriptingguy/archive/2009/05/28/details-leaked-about-the-2009-summer-scripting-games.aspx"&gt;Details Leaked About the 2009 Summer Scripting Games!&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Официальная страница Scripting Games: &lt;a title="Hey, Scripting Guy!" href="http://blogs.technet.com/heyscriptingguy/default.aspx"&gt;Hey, Scripting Guy!&lt;/a&gt; Там публикуются все задания&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Материал для заданий находится в &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=c463eef9-f096-475c-9910-2788e6bdc189"&gt;the Competitor's Pack&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Публиковать свои решения нужно на сайте &lt;a title="http://scriptinggames.poshcode.org/" href="http://scriptinggames.poshcode.org/"&gt;http://scriptinggames.poshcode.org/&lt;/a&gt; Требуется аутентификация с OpenID (а почему не LiveID?).&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;В принципе, вы можете решать задания как угодно, т.к. засчитываются все, которые отвечают условиям задания.&lt;/p&gt;  &lt;p align="justify"&gt;Итак, Event1 и оба дивизиона: &lt;/p&gt;  &lt;h1 align="center"&gt;Beginner Division&lt;/h1&gt;  &lt;p&gt;Из Competitors Pack нам потребуется файл &lt;strong&gt;100 Meter Event.txt&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Задача&lt;/strong&gt;:&lt;/font&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Выяснить, как читать файл? &lt;/li&gt;    &lt;li&gt;Как прочитать из каждой строки поля Name, Country, Time? &lt;/li&gt;    &lt;li&gt;Как отсортировать содержимое файла по полю Name? &lt;/li&gt;    &lt;li&gt;Выбрать 3-х победителей из списка. Победителем считается тот, у кого самое маленькое время в колонке Time &lt;/li&gt;    &lt;li&gt;Показать поля Name, Country и Time для первых 3-х победителей. &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Побегав курсором по файлу я обнаружил тот факт, что разделителем между столбцом &lt;strong&gt;Name&lt;/strong&gt; и &lt;strong&gt;Country&lt;/strong&gt; является табулятор (&lt;strong&gt;[Tab]&lt;/strong&gt;), а между &lt;strong&gt;Country&lt;/strong&gt; и &lt;strong&gt;Time&lt;/strong&gt; стоит один пробел во второй строке, а в остальных строках стоит &lt;strong&gt;[Tab]&lt;/strong&gt;. Следовательно, варианты использования командлетов с параметром –Delimeter не прокатят и нужно будет разбирать всё регулярными выражениями. Первый вопрос наталкивает на необходимость чтения файла не через Get-Content, а через &lt;strong&gt;[system.io.file]::ReadAllText()&lt;/strong&gt;. Но я не вижу особого криминала в использовании родного для PowerShell командлета &lt;strong&gt;Get-Content&lt;/strong&gt;. Это будет несложно. Основная проблема в том, как составить регулярное выражение. Я решил разобрать имя на &lt;strong&gt;First Name&lt;/strong&gt; и &lt;strong&gt;LastName&lt;/strong&gt; (т.к. правильней, всё же, будет, когда сначала идёт имя, а потом фамилия), далее выбрать &lt;strong&gt;Country&lt;/strong&gt; от табуляции до первого числа. Причём, тут потребуется каждую часть сделать именованной (&lt;em&gt;named capture&lt;/em&gt;). Если открыть PowerShell In Action на 111 странице, то там можно найти описание, как делать named captures. У меня регулярное выражение получилось вот такое: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;^(?&amp;lt;ln&amp;gt;\w+)..(?&amp;lt;fn&amp;gt;.*)\t(?&amp;lt;country&amp;gt;.+)(?&amp;lt;time&amp;gt;\d\.\d+)&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Что делает это выражение:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;в секцию &lt;strong&gt;LN&lt;/strong&gt; (&lt;em&gt;LastName&lt;/em&gt;) попадают все буквы до первого небуквенного знака. &lt;/li&gt;    &lt;li&gt;далее пропускаем 2 символа (запятую и пробел). &lt;/li&gt;    &lt;li&gt;в секцию &lt;strong&gt;FN&lt;/strong&gt; (&lt;em&gt;FirstName&lt;/em&gt;) попадает всё до первой табуляции. &lt;/li&gt;    &lt;li&gt;после табуляции идёт &lt;strong&gt;Country&lt;/strong&gt; и в него запишем всё, вплоть до первого числового знака. &lt;/li&gt;    &lt;li&gt;И числа записываем в секцию &lt;strong&gt;Time&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Давайте проверим его: &lt;/p&gt;  &lt;blockquote&gt;   &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $file = gc '.\100 Meter Event.txt'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $file[1] -match &amp;quot;^(?&amp;lt;ln&amp;gt;\w+)..(?&amp;lt;fn&amp;gt;.*)\t(?&amp;lt;country&amp;gt;.+)(?&amp;lt;time&amp;gt;\d\.\d+)&amp;quot;
True
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $matches

Name                           Value
----                           -----
country                        Australia
ln                             Aaberg
fn                             Jesper
time                           8.57
0                              Aaberg, Jesper    Australia 8.57


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $file[11] -match &amp;quot;^(?&amp;lt;ln&amp;gt;\w+)..(?&amp;lt;fn&amp;gt;.*)\t(?&amp;lt;country&amp;gt;.+)(?&amp;lt;time&amp;gt;\d\.\d+)&amp;quot;
True
[↓] [vPodans] $matches

Name                           Value
----                           -----
country                        Japan
ln                             Hansen
fn                             Anne Grethe
time                           8.85
0                              Hansen, Anne Grethe    Japan    8.85


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и теперь соберём объект с нужными свойствами и отправим его на выход. На выходе отсортируем объекты по параметру Time и выберем первые 3 объекта:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font face="consolas, lucida console"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gc&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;100 Meter Event.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | ?{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;^(?&amp;lt;ln&amp;gt;\w+)..(?&amp;lt;fn&amp;gt;.*)\t(?&amp;lt;country&amp;gt;.+)(?&amp;lt;time&amp;gt;\d\.\d+)&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;} |&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;/font&gt;&lt;font face="cons"&gt;&lt;span style="color: #000000"&gt;{
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$obj&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;.fn &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;/font&gt;&lt;font face="cons"&gt;&lt;span style="color: #000000"&gt;.ln}},
    @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Country&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;span style="color: #000000"&gt;.country}},@{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Time&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$matches&lt;/span&gt;&lt;/font&gt;&lt;font face="cons"&gt;&lt;span style="color: #000000"&gt;.time}}
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$obj&lt;/span&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font face="cons"&gt;} | &lt;/font&gt;&lt;/span&gt;&lt;font face="cons"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;sort&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;time&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-First&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;3 | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ft&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AutoSize&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и вот вывод:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gc &amp;quot;100 Meter Event.txt&amp;quot; | ?{$_ -match &amp;quot;^(?&lt;ln&gt;\w+)..(?&lt;fn&gt;.*)\t(?&lt;country&gt;.+)(?&lt;time&gt;\d\.\d+)&amp;quot;} |%{
&amp;gt;&amp;gt;     $obj = &amp;quot;&amp;quot; | Select @{n='Name';e={$matches.fn + &amp;quot; &amp;quot; + $matches.ln}},
&amp;gt;&amp;gt;     @{n='Country';e={$matches.country}},@{n='Time';e={$matches.time}}
&amp;gt;&amp;gt;     $obj
&amp;gt;&amp;gt; } | sort time | select -First 3 | ft -a
&amp;gt;&amp;gt;

Name          Country     Time
----          -------     ----
Jesper Aaberg Australia   8.57
David Pelton  Austria     8.6
Wilson Pais   Germany     8.62


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;решил ещё отформатировать в &lt;strong&gt;Format-Table&lt;/strong&gt; с ключом &lt;strong&gt;–AutoSize&lt;/strong&gt; для красоты. Признаюсь, что это задание меня сильно озадачило. Для меня оно оказалось очень непростым (такие дела).&lt;/p&gt;

&lt;h1&gt;&lt;/h1&gt;

&lt;h1 align="center"&gt;Advanced Division&lt;/h1&gt;

&lt;p&gt;Для этой задачи нам потребуется файл &lt;strong&gt;Personal Information Cards_ADV1.txt&lt;/strong&gt; из Competitors Pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;найти самую короткую строку в файле, которая содержит какой-либо текст. &lt;/li&gt;

  &lt;li&gt;вывести на экран 3 самые короткие строчки &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Решение:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;В файле много пустых строк, но это не проблема. Итак, one-liner решение:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font face="consolas, lucida console"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gc&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Personal Information Cards_ADV1.txt&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | ?{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.trim().length &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-ne&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;sort&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;length&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-First&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;3&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gc &amp;quot;Personal Information Cards_ADV1.txt&amp;quot; | ?{$_.trim().length -ne 0} | select –First 3
PPID
Claims
Street
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Странно, что в Advanced Division получилось такое простое задание.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=eebb4566-4ff9-4ff8-81e2-e44cabb4192c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,eebb4566-4ff9-4ff8-81e2-e44cabb4192c.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Scripting Games</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b811f308-0c3f-4b29-b206-d09971185510</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b811f308-0c3f-4b29-b206-d09971185510</wfw:commentRss>
      <title>Cmdlet wrapping и PsBoundParameters</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</link>
      <pubDate>Mon, 08 Jun 2009 21:41:52 GMT</pubDate>
      <description>&lt;div&gt;&lt;p align="justify"&gt;Работая с функциями в PowerShell можно столкнуться с одной особенностью – в качестве передачи аргументов в функции или скрипты вы можете использовать почти всё, кроме ключей (данных типа &lt;strong&gt;Switch&lt;/strong&gt;). Их передавать можно, но тут есть одна особенность. Обычно это ощущается, когда вы работаете с командлетами. Возьмём простой пример:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;) {
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Path is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Filter is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Force is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;}&lt;/font&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и вызовем эту функцию:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string[]]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt; Write-Host '$Path is:' $Path
&amp;gt;&amp;gt; Write-Host '$Filter is:' $Filter
&amp;gt;&amp;gt; Write-Host '$Force is:' $Force
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -force
$Path is: C:\
$Filter is: *
$Force is: True
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;В принципе, всё как и ожидалось. Но если внимательно посмотреть на последний аргумент, то мы увидим лишь &lt;strong&gt;True&lt;/strong&gt;, т.е. увидим факт, что ключ &lt;strong&gt;Force&lt;/strong&gt; был передан. Однако, PowerShell не умеет подставять (биндить) переменную &lt;strong&gt;$Force&lt;/strong&gt; (равно как и другие переменные) как именованный параметр в другую команду. Чтобы в этом убедиться, мы попробуем сымитировать нашу функцию как командлет &lt;strong&gt;Get-ChildItem&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string[]]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt; Get-ChildItem $Path $Filter $Force
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -Force
&lt;font color="#ff0000"&gt;Get-ChildItem : A positional parameter cannot be found that accepts argument 'True'.
At line:2 char:14
+ Get-ChildItem &amp;lt;&amp;lt;&amp;lt;&amp;lt;  $Path $Filter $Force
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand&lt;/font&gt;

&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Как видно, командлет Get-ChildItem не смог сопоставить последний аргумент ни с одним из своих параметров. Т.е. по факту выполнилась следующая строка:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ChildItem&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;True&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;PowerShell не смог сказать командлету, что мы указали ключ &lt;strong&gt;Force&lt;/strong&gt; и хотим именно его передать в командлет. По факту в этом коде Get-ChildItem не знал, какие параметры ему были переданы и подставлял их на основе номера позиции параметра. А т.к. у Get-ChildItem нету параметра с порядковым номером 3 (с номером &lt;strong&gt;1&lt;/strong&gt; идёт &lt;strong&gt;Path&lt;/strong&gt; или &lt;strong&gt;LiteralPath&lt;/strong&gt;, а с номером &lt;strong&gt;2&lt;/strong&gt; идёт &lt;strong&gt;Filter&lt;/strong&gt;. Остальные параметры именованные), то мы получили ошибку. Но всё же, как выкручиваться из этой ситуации? Вы можете как угодно пытаться подставить аргументы, но ничего не выйдет. Для этих целей в PowerShell V2 появилась специальная переменная - &lt;strong&gt;$PSBoundParameters&lt;/strong&gt;. Эта переменная по сути представляет собой хэш-таблицу:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt; $PSBoundParameters
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -Force

Key                                                         Value
---                                                         -----
Force                                                       True
Path                                                        C:\
Filter                                                      *


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;В отличии от первого примера переменная &lt;strong&gt;$PSBoundParameters&lt;/strong&gt; содержит не только значения переменных, но и их имена (в перовм примере я вручную дописывал имена переменных), которые используются в качестве именованных параметров. Т.е. при подстановке аргументов в команду, она сначала выбирает имя переменной в качестве именованного параметра и значение переменной подставляет в качестве аргумента этого параметра. Синтаксис использования этой переменной очень прост:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#009500"&gt;function Name ($arg1, $arg2, $arg3 ... $argN) { 
      &lt;br /&gt;Command @PSBoundParameters 

      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;и в результате будет исполняться вот такая команда:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#009500"&gt;Command –arg1 &amp;lt;значение $arg1&amp;gt; –arg2 &amp;lt;значение $arg2&amp;gt; –arg3 &amp;lt;значение $arg3&amp;gt; … –argN &amp;lt;значение $argN&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Т.е. будут подставляться именованные параметры и значения переменных соответствующих аргументов. Давайте проверим, как это подействует на наш пример с Get-ChildItem:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;) {
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ChildItem&lt;/span&gt;&lt;span style="color: #000000"&gt; @&lt;/span&gt;&lt;span style="color: #800000"&gt;PSBoundParameters&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt; Get-ChildItem @PSBoundParameters
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -Force


    Directory: C:\


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d--hs       10.07.2007.     19:44            $Recycle.Bin
d--hs       09.03.2008.     17:53            Boot
d----       23.11.2008.     19:41            inetpub
d-rh-       26.06.2007.     22:27            MSOCache
d----       09.03.2008.     17:41            PerfLogs
&amp;lt;...&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И вы можете видеть, что у нас всё получилось в наилучшем виде! В сравнении с предыдущим примером фактически выполнилась следующая команда:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ChildItem&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Для формирования аргументов для командлетов в функциях (так называемые &lt;strong&gt;wrapped cmdlets&lt;/strong&gt;) это самый красивый и идеальный вариант. Если вы захотите изменить логику стандартных командлетов или добавить в них свой функционал, то &lt;strong&gt;$PSBoundParamters&lt;/strong&gt; сделает за вас очень много лишней работы. Но это не единственное полезное применение для этой переменной. Она так же позволяет сократить возможность ошибки при вызове функции внутри скрипта или другой функции, которая принимает те же аргументы. Давайте посмотрим ещё один пример:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Path in Test is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Filter in Test is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Force in Test is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; ------------------------------&lt;/span&gt;&lt;span style="color: #800000"&gt;--&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test2&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Path in Test2 is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Filter in Test2 is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Force in Test2 is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    }
    &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;&lt;font size="2" face="Consolas"&gt;Test2&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;font size="2" face="Consolas"&gt; @PSBoundParameters
}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Что мы делаем: мы создали функцию &lt;strong&gt;Test&lt;/strong&gt;, которая принимает набор аргументов. Внутри этой функции есть другая функция &lt;strong&gt;Test2&lt;/strong&gt;, которая принимает те же аргументы. Далее из функции &lt;strong&gt;Test&lt;/strong&gt; вызываем функцию &lt;strong&gt;Test2&lt;/strong&gt; и с помощью &lt;strong&gt;$PSBoundParameters&lt;/strong&gt; передаём в неё аргументы. &lt;u&gt;Обратите внимание, что в функции Test2 я изменил порядок аргументов&lt;/u&gt;. Это сделано для того, чтобы показать, что $PSBoundParamters отсортирует наши аргументы. А теперь внимание на экран:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string[]]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt;     Write-Host '$Path in Test is:' $Path
&amp;gt;&amp;gt;     Write-Host '$Filter in Test is:' $Filter
&amp;gt;&amp;gt;     Write-Host '$Force in Test is:' $Force
&amp;gt;&amp;gt;     Write-Host --------------------------------
&amp;gt;&amp;gt;     function Test2 ([switch]$Force, [string[]]$Path, [String]$Filter) {
&amp;gt;&amp;gt;         Write-Host '$Path in Test2 is:' $Path
&amp;gt;&amp;gt;         Write-Host '$Filter in Test2 is:' $Filter
&amp;gt;&amp;gt;         Write-Host '$Force in Test2 is:' $Force
&amp;gt;&amp;gt;     }
&amp;gt;&amp;gt;     Test2 @PSBoundParameters
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -Force
$Path in Test is: C:\
$Filter in Test is: *
$Force in Test is: True
--------------------------------
$Path in Test2 is: C:\
$Filter in Test2 is: *
$Force in Test2 is: True
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;И смотрите, что у нас получилось. А у нас получилось, что функция Test2 получила тот же набор аргументов, причём они были подставлены в правильном соответствии. Фактически строка &lt;font color="#0000ff"&gt;Test2 @PSBoundParameters&lt;/font&gt; была преобразована в:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #5f9ea0"&gt;Test2&lt;/span&gt;&lt;span style="color: #000000"&gt; -Path &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt; -Filter &lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;span style="color: #000000"&gt; -Force &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Т.е. в вариант, который мы вынуждены использовать в PowerShell 1.0. Плюс, мы имеем возможность подставлять позиционно ключи (объекты типа &lt;strong&gt;Switch&lt;/strong&gt;), что есть очень позитивно.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b811f308-0c3f-4b29-b206-d09971185510"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=f37324bc-cf6b-4428-aee0-560f45ca7aee</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,f37324bc-cf6b-4428-aee0-560f45ca7aee.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,f37324bc-cf6b-4428-aee0-560f45ca7aee.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=f37324bc-cf6b-4428-aee0-560f45ca7aee</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>PowerShell flow control и конвейеры</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,f37324bc-cf6b-4428-aee0-560f45ca7aee.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,f37324bc-cf6b-4428-aee0-560f45ca7aee.aspx</link>
      <pubDate>Mon, 01 Jun 2009 17:25:14 GMT</pubDate>
      <description>&lt;div&gt;&lt;p align="justify"&gt;Иногда замечаю, что некоторые скриптописатели получают “поломанный” конвейер, когда данные из одной команды вышли, но никуда не пришли. Возьмём простой пример:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre style="background-color: #000040; font: 9pt consolas, courier new"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] foreach ($n in 1..3) {$n}
1
2
3
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Тут всё просто, циклом foreach перебираются данные и выводятся на экран. Мы привыкли, что всё, что выводится на экран можно передать дальше на конвейер. В принципе, это правильно, за исключением ряда случаев, когда это не работает. Чтобы убедиться в этом – передадим вывод этой команды через конвейер на Set-Content:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, courier new"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] foreach ($n in 1..3) {$n}
1
2
3
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] foreach ($n in 1..3) {$n} | Set-Content file.txt
&lt;font color="#ff0000"&gt;An empty pipe element is not permitted.
At line:1 char:28
+ foreach ($n in 1..3) {$n} | &amp;lt;&amp;lt;&amp;lt;&amp;lt;  Set-Content file.txt
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : EmptyPipeElement&lt;/font&gt;

&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;и мы получаем ошибку, что у нас пустой конвейер. Если написать простой проверочный фильтр:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test-Input&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;current $_ is: &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;и проверить, что у нас приходит с конвейера в этот фильтр, то вы получите такую же ошибку и можете долго гадать, почему так, на экране данные есть, а в конвейер ничего не поступает. Причиной этому является то, что &lt;strong&gt;flow control&lt;/strong&gt; (не знаю, как это на русский первести) конструкции не транслируют свой вывод в конвейер и вот список этих конструкций:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;If…Else&lt;/strong&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;If…ElseIf&lt;/strong&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;For&lt;/strong&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;Foreach&lt;/strong&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;While&lt;/strong&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;Do…While&lt;/strong&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;Do…Until&lt;/strong&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;Switch&lt;/strong&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Чтобы при использовании этих конструкций вывод транслировался на конвейер их нужно заключить в подвыражение – &lt;strong&gt;$( )&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, courier new"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $(foreach ($n in 1..3) {$n}) | Set-Content file.txt
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] gc file.txt
1
2
3
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $(foreach ($n in 1..3) {$n}) | Test-Input
current $_ is: 1
current $_ is: 2
current $_ is: 3
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;я заключил цикл Foreach в подвыражение и теперь данные стали поступать на конвейер. Это хорошо видно по выводу фильтра Test-Input, который приведён выше. Вот таким нехитрым способом мы решили проблему пустых конвейеров &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=f37324bc-cf6b-4428-aee0-560f45ca7aee"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,f37324bc-cf6b-4428-aee0-560f45ca7aee.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=5e247815-3494-4d33-8a09-98471bfef4a5</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=5e247815-3494-4d33-8a09-98471bfef4a5</wfw:commentRss>
      <title>Копирование файлов с графическим Progress Bar</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</link>
      <pubDate>Sat, 23 May 2009 23:23:37 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Навеяно множеством мотивов:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://social.technet.microsoft.com/Forums/ru-RU/scrlangru/thread/9346bf70-c878-445a-8e55-08280f60a1ea" target="_blank"&gt;Копирование файла + GUI&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://zorion.wordpress.com/2009/05/12/090512/" target="_blank"&gt;Evernote и ещё что-нибудь&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://zorion.wordpress.com/2009/05/13/copy-data/" target="_blank"&gt;copy-data&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Как мне кажется, с Write-Progress вряд ли получится что-то хорошее, поэтому немного сориентировался и нашёл вот это: &lt;a href="http://halr9000.com/article/706" target="_blank"&gt;PowerShell Script: Copy-FilePlus&lt;/a&gt;. Именно этот скрипт взят за основу визуального окна. А за основу логики был взят мой простенький скрипт копирования файлов с сохранением структуры каталогов:&lt;a href="http://www.sysadmins.lv/PermaLink,guid,f216661c-be01-441b-927c-239352611bda.aspx"&gt;Лёгкая разминка&lt;/a&gt;. Приведённый по ссылке на &lt;strong&gt;Copy-FilePlus&lt;/strong&gt; вариант Хала Роттенберга является достаточно базовым, поскольку не позволяет копировать за раз множество файлов, плюс требуется вводить имя конечного файла. Я решил его немного расширить и добавить следующий функционал:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;при вызове функции достаточно указать конечную директорию, т.е. имя конечного файла вводить не надо&lt;/li&gt;    &lt;li&gt;поддержка массового копирования файлов как через конвейер, так и через передачу исходных файлов в аргументы&lt;/li&gt;    &lt;li&gt;поддержка копирования с сохранением дерева каталогов относительно определённой точки монтирования дерева&lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;заранее оговорюсь, что скрипт обладает одним недостатком: не будет единого прогресс-бара для всех файлов, а только для каждого файла свой (издержки .NET). Зато хоть что-то и весьма актуально при копировании больших файлов. Код получился несколько солидным, но я его постарался снабдить комментариями о коде и о логике, на которой он работает. Причём следуя примеру Роттенберга я скрипт тоже оформил в Advanced Function. По advanced functions я в скрипте вложил ссылки, как почитать о них во встроенной справке PowerShell. И, собственно, сам код:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;#######################################################&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Copy files with GUI.ps1&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Version 1.3&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#
#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Copies single or couple files with GUI progressbar&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Original idea: Oisín Grehan&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; First edition: Hal Rottenberg&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Second edition: Vadims Podans&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#
#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Vadims Podans (c) 2009&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; &lt;a href="http://www.sysadmins.lv/"&gt;&lt;font color="#009500"&gt;http://www.sysadmins.lv/&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt;#######################################################&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сразу после названия идёт описание к функции. После загрузки функции в консоль&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; её справка будет доступна в консоли. Достаточно будет набрать:&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Get-Help Copy-FilesPlus&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; вобщем, как в настоящих командлетах&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Copy-FilesPlus&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;lt;#&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;.Synopsis
    Copies files and folders displaying GUI progress bar.
.Description
    This is a script, that demonstrates how PowerShell can use
    useful .NET types and PowerShell V2 capabilities.
.Parameter Path
    Specifies the filename or FileInfo object representing file to be copied.
    Objects can be passed through a pipeline.
.Parameter Destination
    Specifies the path for resulting copy operation
.Parameter Recurse
    Gets the items in the specified locations and in all child items of the locations.
    Used only when source directory passed through argument list. 
.Parameter Force
    Creates directory structure in destination folder and copies files to
    their source respective folders (Tree copy).
.EXAMPLE
    PS &amp;gt; Copy-FilesPlus -Path C:\tmp -Destination e:\Users
    
    This will copy only files from C:\tmp to E:\Users
.EXAMPLE
    PS &amp;gt; Get-Item C:\tmp\windows7.iso | Copy-FilesPlus -Destination E:\Users
    
    This will copy specified file from C:\tmp folder to e:\Users
.EXAMPLE
    PS &amp;gt; Get-Childitem D:\Shared | Copy-FilesPlus -Destination E:\ 
    
    This will copy all files from Shared folders to E: drive root directory
.EXAMPLE
    PS &amp;gt; Get-Childitem D:\Shared -Recurse | Copy-FilesPlus -Destination E:\ -Force
    
    This will copy all files in Shared folder and subfolders. Shared folder will be a
    tree root point. All directory structure will be copied with files to destination folder.
.EXAMPLE
    PS &amp;gt; Copy-FilesPlus C:\Users\User E:\ -Recurse
    
    This will copy all files from User folder and subfolders to destination directory without
    copying source folders tree
.EXAMPLE
    PS &amp;gt; Copy-FilesPlus C:\Users\User E:\ -Recurse -Force
    
    This will copy all files in User folder and subfolders. User folder will be a
    tree root point. All directory structure will be copied with files to destination folder.
.ReturnValue
    Genrally, script don't return anything, except errors!
.Link
    about_functions
    about_functions_advanced
    about_functions_advanced_methods
    about_functions_advanced_parameters
#Requires -Version 2.0
&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt;#&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;

&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; ну и теперь фишки от advanced functions в V2. CmdletBinding делает&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; подстановку передаваемых аргументов в функцию. Если аргумент не передан&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; то PowerShell попросит его ввести, а не вывалится с ошибкой&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;[CmdletBinding()]
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; (
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; первый аргумент. Он является обязательным и он может принимать значения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; из конвейера. Причём, внутри блока Process {} для обозначения текущего элемента&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; можно использовать, как переменную $path, так и $_.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;,ValueFromPipeline &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)]
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;,
        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)]
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;,
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Recurse&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;,
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;    )
    &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;font size="2" face="Verdana"&gt;begin&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; пробуем создать папку назначения, куда будут копироваться файлы.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        [&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](md &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; -Force -ea &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; вот тут я сделал переменную для счётчика. Счётчик мне потребуется для того,&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; чтобы при использовании ключа -Force и если файлы передаются по конвейеру&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; можно было брать точку начала дерева структуры, которая будет копироваться.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; временная функция, которая выполняет само копирование. Тут нужно учесть то,&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; что путь назначения должен указываться в полном формате с указанием имени&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; конечного файла. Относительные пути тут не поддерживаются. Поэтому дальше&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в коде я буду сохранять имя оригинального файла. т.е. переименовывание файлов&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; на лету не поддерживается&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;process&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
                &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-Type&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AssemblyName&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;microsoft.visualbasic&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                [Microsoft.VisualBasic.FileIO.FileSystem]::CopyFile(&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;, 
                [Microsoft.VisualBasic.FileIO.UIOption]::AllDialogs,
                [Microsoft.VisualBasic.FileIO.UICancelOption]::ThrowException)
            }
        }
    }
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;process&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; вот здесь я проверяю, откуда пришли файлы - через аргументы или через конвейер&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если данные пришли из обоих путей, то приоритет за конвейером&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что объект существует и что это объект файловой системы&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName -ea &lt;/span&gt;&lt;span style="color: #800000"&gt;stop&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsProvider &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileSystem$&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если объект в порядке и выполняется только первая итерация конвейера&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; то мы задаём точку начала дерева. Весь путь от этой точки до имени файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; будет копироваться в папку назначения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; здесь отрезаем от файла структуру папок, которая будет являться границей дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; $([&lt;/span&gt;&lt;span style="color: #008080"&gt;regex&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name))
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; заодно на основе этой структуры делаем регулярное выражение. Этим регулярным&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выражением будем у всех последующих файлов отрезать начало и оставлять необходимую&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; часть дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootRegEx&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;regex&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt;.Substring(&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt;.Length &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;))
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; важно, что эту операцию нужно проделать единожды, чтобы точка монтирования дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; больше не менялась в процессе. Поэтому увеличиваем счётчик и тогда в течении текущего&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; процесса копирования код сюда не вернётся&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;++&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                    }
                    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что нужно ли копировать дерево или нет.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если копируем дерево, то выбрасываем папки и работаем только с файлами&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.PsIsContainer}
                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если есть файлы для копирования, то выбираем весь путь папок до текущего файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и заранее приготовленным регэкспом отрезаем начало. В переменную $rep мы запишем&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; дерево папок от точки монтирования дерева до имени файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;.Directory.ToString() &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootRegEx&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                            &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; а теперь к папке назначения пристыковываем дерево папок от точки монтирования до имени файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                            &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; заранее создаём начальный хвостик папок в целевой папке и подавляем вывод на экран&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            [&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](md &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; -Force -ea &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; а теперь к новому конечному пути пристыковываем имя файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и теперь подаём текущий файл в функцию копирования. Вот тут мы и увидим прогресс-бар.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                        }
                    } &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;font size="2" face="Verdana"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если структуру папок копировать не надо, то все файлы, что пришли с конвейера будут копироваться&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в папку назначения без создания структуры папок.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.PsIsContainer) {
                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                        }
                    }
                &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если объект не существует или это не объект файловой системы (защита от дураков, да-да :)), то ругаемся&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Input object does not represent any applicable FileSystem object&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
            } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если данные об источнике копирования переданы через аргументы, то проверяем, что заданный путь допустим&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и объект, который мы получим после Get-Item является объектом файловой системы&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt; -ea &lt;/span&gt;&lt;span style="color: #800000"&gt;stop&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsProvider &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileSystem$&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если всё хорошо, то указанный файл или папка становятся точкой монтирования дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Resolve-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если ключи -Force -Recurse не указаны, то копируется либо указанный файл или все файлы в указанной&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; папке в папку назначения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #800080"&gt;$Recurse&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsIsContainer} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; хитрый режим, когда рекурсивно выбираются все файлы в указанной папке и всех подпапках и копируются&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в папку назначения без сохранения структуры (т.е. в папке назначения будет большая куча файлов).&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;elseif&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-and&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsIsContainer} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если указаны оба ключа, то мы повторяем структуру исходных папок относительно точки монтирования дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в папке назначения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;elseif&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-and&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsIsContainer} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;{
                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; тут мы делаем то же самое, что и в случае, когда файлы пришли с конвейера&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootRegEx&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;regex&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.Directory.ToString() &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootRegEx&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                            &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                            [&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](md &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; -Force -ea &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                        }
                    }
                } &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Input object does not represent any applicable FileSystem object&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
            }
        } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;&lt;font size="2" face="Verdana"&gt;}
    }
}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;font size="2" face="Verdana"&gt;Вот такой скриптик у меня получился. Местами даже очень умный, почти как я &lt;img alt=":)" src="/smilies/happy.gif"&gt;. Как мне кажется, на этом коде тоже можно чему-то поучиться. Если будут вопросы – то welcome в комментарии. &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/font&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=5e247815-3494-4d33-8a09-98471bfef4a5"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=21e35fc8-b739-45a9-8782-99d0aa9b8769</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,21e35fc8-b739-45a9-8782-99d0aa9b8769.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,21e35fc8-b739-45a9-8782-99d0aa9b8769.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=21e35fc8-b739-45a9-8782-99d0aa9b8769</wfw:commentRss>
      <title>PowerTab 0.99beta2</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,21e35fc8-b739-45a9-8782-99d0aa9b8769.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,21e35fc8-b739-45a9-8782-99d0aa9b8769.aspx</link>
      <pubDate>Sat, 16 May 2009 22:05:57 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Сегодня самый главный PowerShell Guy – &lt;strong&gt;Marc van Orsouw&lt;/strong&gt;, он же &lt;strong&gt;MoW&lt;/strong&gt;, он же &lt;strong&gt;/\/\o\/\/&lt;/strong&gt; выпустил очередную версию &lt;strong&gt;PowerTab&lt;/strong&gt;, в которой исправлены баги, которые были замечены в работе с PowerShell V2 CTP3, плюс &lt;u&gt;добавлена поддержка Windows 7 и Windows Server 2008 R2&lt;/u&gt;. Один из наиболее значимых багов – зависание окна автозавершения. Это выглядело вот так:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#00ff00"&gt;&lt;span background-color: black? #00ff00?;&gt;&lt;p&gt;[vPodans] dir -include *.log
[vPodans]      ╔═ - ══════════════╗
               ║ -Debug           ║
               ║ -ErrorAction     ║
               ║ -ErrorVariable   ║
               ║&lt;span style="background-color: #ff0000"&gt;&lt;font color="#000000"&gt; -Exclude&lt;/font&gt;         &lt;/span&gt;║
               ║ -Filter          ║
               ║ -Force           ║
               ║ -Include         ║
               ║ -LiteralPath     ║
               ║ -Name            ║
               ║ -OutBuffer       ║
               ║ -OutVariable     ║
               ║ -Path            ║
               ║ -Recurse         ║
               ║ -UseTransaction  ║
               ║ -Verbose         ║
               ║ -WarningAction   ║
               ║ -WarningVariable ║
               ╚═[4] 1-17 [17]════╝&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;т.е. по этому меню можно было перемещаться вниз. Но при любом нажатии стрелки вверх – оно намертво прилипало к экрану:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#00ff00"&gt;&lt;span background-color: black? #00ff00?;&gt;&lt;p&gt;[vPodans] dir -include *.log
[vPodans] bla-bla-bla═════════════╗
&lt;font color="#ff0000"&gt;The term 'bla-bla-bla' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and t
ry again.&lt;/font&gt;      ║ -ErrorAction     ║
&lt;font color="#ff0000"&gt;At line:1 char:12&lt;/font&gt;-ErrorVariable   ║
&lt;font color="#ff0000"&gt;+ bla-bla-bla &amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/font&gt; &lt;span style="background-color: #ff0000"&gt;&lt;font color="#000000"&gt;xclude         &lt;/font&gt;&lt;/span&gt;║
&lt;font color="#ff0000"&gt;    + CategoryInfo          : ObjectNotFound: (bla-bla-bla:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException&lt;/font&gt;
               ║ -Include         ║
[vPodans]      ║ -LiteralPath     ║
               ║ -Name            ║
               ║ -OutBuffer       ║
               ║ -OutVariable     ║
               ║ -Path            ║
               ║ -Recurse         ║
               ║ -UseTransaction  ║
               ║ -Verbose         ║
               ║ -WarningAction   ║
               ║ -WarningVariable ║
               ╚═[4] 1-17 [17]════╝&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;а учитывая, что я частенько промахиваюсь со стрелками, то вот такую картину видел тоже часто. И убрать это можно было только через &lt;strong&gt;Clear-Host&lt;/strong&gt;, он же &lt;strong&gt;CLS&lt;/strong&gt;. Сейчас установил новую версию PowerTab – проблема исчезла &lt;img alt="Rock" src="/smilies/blush.gif"&gt;&lt;/p&gt;

&lt;p&gt;Ну и поддержка новых систем тоже будет многим по душе.&lt;/p&gt;

&lt;p&gt;Собственно PowerTab взять можно тут (смотреть аттачменты&amp;#160; посте):&lt;/p&gt;

&lt;p&gt;&lt;a title="http://thepowershellguy.com/blogs/posh/archive/2009/05/15/powertab-0-99b2-ctp3-fix.aspx" href="http://thepowershellguy.com/blogs/posh/archive/2009/05/15/powertab-0-99b2-ctp3-fix.aspx"&gt;http://thepowershellguy.com/blogs/posh/archive/2009/05/15/powertab-0-99b2-ctp3-fix.aspx&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=21e35fc8-b739-45a9-8782-99d0aa9b8769"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,21e35fc8-b739-45a9-8782-99d0aa9b8769.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=e105376b-e19d-4e69-ad27-ae341c269e07</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,e105376b-e19d-4e69-ad27-ae341c269e07.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,e105376b-e19d-4e69-ad27-ae341c269e07.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=e105376b-e19d-4e69-ad27-ae341c269e07</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>Скрипты PowerShell в GPO</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,e105376b-e19d-4e69-ad27-ae341c269e07.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,e105376b-e19d-4e69-ad27-ae341c269e07.aspx</link>
      <pubDate>Wed, 06 May 2009 16:15:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;А знаете ли вы, что скрипты PowerShell можно очень легко и удобно использовать в качестве startup/shutdown и logon/logoff скриптов в GPO?&lt;/P&gt;
&lt;H1 align=center&gt;Сценарий для Windows Server 2003/2008&lt;/H1&gt;
&lt;P&gt;В обычной жизни при двойном клике на .ps1 файл – он откроется в редакторе, но не будет исполнен. Это было сделано в целях безопасности, что у PS1 файлов &lt;STRONG&gt;PerceivedType&lt;/STRONG&gt; выставлен как &lt;STRONG&gt;Text&lt;/STRONG&gt; и расширение PS1 отсутствует в переменной %pathext%. Но это совсем не значит, что мы не можем использовать эти скрипты в GPO или Task Sheduler. Ларчик открывается очень просто:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px auto; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Logon Settings" border=0 alt="Logon Settings" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellGPO_137A0/image_5.png" width=778 height=453&gt; &lt;/P&gt;
&lt;P&gt;Суть сводится к тому, что в Script Name указывается путь к исполняемому модулю PowerShell. А вот уже в Script Parameters уже указываете путь к скрипту. Причём тут следует обратить внимание, что если путь задаёте через переменные (например, если у вас несколько контроллеров домена, то целесообразно запускать скрипт из папки NetLogon того контроллера, который вас аутентифицирует), то переменные нужно указывать в формате CMD, т.е. %variable%. В результате вы получите вот такой вид настроенного логон-скрипта:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title=GPMC border=0 alt=GPMC src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellGPO_137A0/image4_1.png" width=513 height=169&gt; &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Т.е. реализуется это всё очень просто. Однако, здесь есть одно большое “НО” – для реализации логон-скриптов в среде Windows Server 2003/2008 у вас должна быть реализована политика подписанных скриптов. В противном случае скрипт просто не исполнится, даже если у вас политика запуска скриптов выставлена в Unrestricted. Это обусловлено тем, что скрипт исполняется не с локального диска, а с сетевого. Это можно очень легко проверить:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;&lt;P&gt;[vPodans] Set-ExecutionPolicy unrestricted
[vPodans] Get-ExecutionPolicy
Unrestricted
[vPodans] &amp;amp; $env:logonserver\netlogon\get.ps1

&lt;FONT color=#ffffff&gt;Security Warning&lt;/FONT&gt;
Run only scripts that you trust. While scripts from the Internet can be useful, this script can
potentially harm your computer. Do you want to run \\DC1\netlogon\get.ps1?
&lt;FONT color=#ffffff&gt;[D] Do not run&lt;/FONT&gt;  [R] Run once  [S] Suspend  [?] Help (default is "D"):&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;У вас каждый раз будет спрашиваться разрешение на запуск скрипта. Т.к. логонные скрипты выполняются в фоне и не взаимодействуют с пользователем, то вы просто не сможете никак нажать кнопку R. Тем более, как видно из снимка, у нас нету возможности сделать Run always. Именно по этой причине требуются только подписанные скрипты. Но это не проблема, учитывая, что я у себя в блоге написал 2 поста по практической реализации инфраструктуры подписанных скриптов, тем более, это наоборот повышает безопасность запуска скриптов PowerShell.&lt;/P&gt;
&lt;P&gt;Но если очень хочется выполнять логонные и стартапные скрипты без внедрения цифровых подписей, то есть один workaround - узел, на котором размещены скрипты в сети (обычно это сам контроллер домена) нужно добавить в интернет-зону &lt;STRONG&gt;Local Intranet&lt;/STRONG&gt;. Тогда скрипты из сети будут равноценны локальным и политика RemoteSigned спокойно разрешит такой запуск.&lt;/P&gt;
&lt;H1 align=center&gt;Сценарий для Windows Server 2008 R2/Windows 7&lt;/H1&gt;
&lt;P&gt;Пока что Windows Server 2008 R2 и Windows 7 не RTM, но уже известно, что в них уже нативно поддерживаются скрипты PowerShell в качестве логонных и стартапных, поскольку в этих системах PowerShell установлен и включен по умолчанию. И выглядит это вот так:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="MSH GPO" border=0 alt="MSH GPO" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellGPO_137A0/Untitled_3.jpg" width=797 height=452&gt; &lt;/P&gt;
&lt;P&gt;В табе &lt;STRONG&gt;Scripts&lt;/STRONG&gt; располагаются классические скрипты как .BAT, .CMD, .VBS, .JS и в комментарии не нуждаются. Но в новых системах добавлен ещё один таб &lt;STRONG&gt;PowerShell scripts&lt;/STRONG&gt;. Вы можете прямо указывать на .PS1 файлы без указания программы, которая будет их отрабатывать. Иными словами эти скрипты теперь ничем не отличаются от тех же скриптов CMD/WSH. Но в проводнике PS1 файлы всё равно не будут исполняться, а открываться в редакторе (ISE/Notepad/PowerGUI). Ну и ещё одна заметка:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="MSH GPO2" border=0 alt="MSH GPO2" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellGPO_137A0/MSH%20GPO2_3.jpg" width=369 height=121&gt; &lt;/P&gt;
&lt;P&gt;Вы можете выбирать в каком порядке эти скрипты будут исполняться – до или после классических скриптов в первом табе. На практике есть один небольшой недостаток – при логоне частенько проскакивает консоль PowerShell, что есть не очень хорошо. Правда, следует учитывать, что новые системы ещё только Release Candidate (скриншоты сделаны с беты), поэтому есть надежда, что это будет исправлено. В отличии от предыдущего варианта, когда скрипты PowerShell адаптируются под классические – здесь не обязательно подписывать скрипты, хотя для этого придётся выставить политику запуска в Unrestricted, что не есть безопасно. Поэтому я бы посоветовал везде, где это возможно – использовать цифровые подписи для скриптов. И ещё раз напомню, что данная вкладка в GPO доступна только в Windows Server 2008 R2/Windows 7 и, скорее всего, в последующих версиях и применяться будет тоже только к ним. Если у вас домен под управлением Windows Server 2008 R2, а клиенты – Windows Vista, то эти логонные скрипты работать не будут, даже если на последних всеми правдами и неправдами &lt;img alt=":)" src="/smilies/happy.gif"&gt; установлен PowerShell.&lt;/P&gt;
&lt;P&gt;As always enjoy the automation of tools within powershell.exe! © Flowering Weeds&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=e105376b-e19d-4e69-ad27-ae341c269e07"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,e105376b-e19d-4e69-ad27-ae341c269e07.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=2b0de569-2136-4d6c-846d-a492d65ef813</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,2b0de569-2136-4d6c-846d-a492d65ef813.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,2b0de569-2136-4d6c-846d-a492d65ef813.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=2b0de569-2136-4d6c-846d-a492d65ef813</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Создание объектов в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,2b0de569-2136-4d6c-846d-a492d65ef813.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,2b0de569-2136-4d6c-846d-a492d65ef813.aspx</link>
      <pubDate>Mon, 04 May 2009 14:06:08 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;А знаете ли вы, что объекты типа PsObject можно создавать очень легко?&lt;/p&gt;  &lt;p&gt;Очень часто в скриптах мы создаём свои кастомайзенные объекты, наделяем их необходимыми свойствами, в которые уже записываем данные, полученные в процессе работы скрипта. Как это делается в классическом случае:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Management.Automation.PSObject&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$Object&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-Member&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;NoteProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Computer&lt;/span&gt;&lt;span style="color: #000000"&gt;  ([&lt;/span&gt;&lt;span style="color: #008080"&gt;PSObject&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$null&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Object&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-Member&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;NoteProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;  ([&lt;/span&gt;&lt;span style="color: #008080"&gt;PSObject&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$null&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Object&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-Member&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;NoteProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Path&lt;/span&gt;&lt;span style="color: #000000"&gt;  ([&lt;/span&gt;&lt;span style="color: #008080"&gt;PSObject&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$null&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Object&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-Member&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;NoteProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Description&lt;/span&gt;&lt;span style="color: #000000"&gt;  ([&lt;/span&gt;&lt;span style="color: #008080"&gt;PSObject&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$null&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;&lt;font size="2" face="Verdana"&gt;)
...&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и так для добавления каждого свойства делать новую строчку. В итоге мы получим вот такой объект:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[vPodans] $Object = New-Object System.Management.Automation.PSObject
[vPodans] $Object | Add-Member NoteProperty Computer  ([PSObject]$null)
[vPodans] $Object | Add-Member NoteProperty Name  ([PSObject]$null)
[vPodans] $Object | Add-Member NoteProperty Path  ([PSObject]$null)
[vPodans] $Object | Add-Member NoteProperty Description  ([PSObject]$null)
[vPodans] $object | gm


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       System.Boolean Equals(Object obj)
GetHashCode Method       System.Int32 GetHashCode()
GetType     Method       System.Type GetType()
ToString    Method       System.String ToString()
Computer    NoteProperty  Computer=null
Description NoteProperty  Description=null
Name        NoteProperty  Name=null
Path        NoteProperty  Path=null


[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Но этот процесс можно сделать ещё более простым и коротким:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Computer&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Description&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Смотрим:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[vPodans] $Object = &amp;quot;&amp;quot; | Select Computer, Name, Path, Description
[vPodans] $object | gm


   TypeName: Selected.System.String

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       System.Boolean Equals(Object obj)
GetHashCode Method       System.Int32 GetHashCode()
GetType     Method       System.Type GetType()
ToString    Method       System.String ToString()
Computer    NoteProperty  Computer=null
Description NoteProperty  Description=null
Name        NoteProperty  Name=null
Path        NoteProperty  Path=null


[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Видите, в результате объект получился такой же, зато как эффективно! Но и это ещё не всё. Если с Add-Member мы могли сразу присваивать значения параметру через параметр &lt;strong&gt;–Value&lt;/strong&gt; командлета &lt;strong&gt;Add-Member&lt;/strong&gt;, то и здесь мы можем на стадии создания объекта ему что-то присвоить. Присвоение производится по схеме:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#009500"&gt;$var = &amp;quot;&amp;quot;&amp;#160; | Select @{n = &amp;quot;PropertyName&amp;quot;;e={&amp;quot;PropertyValue&amp;quot;}}&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Для примера сделаем простой объект с несколькими свойствами и сразу при создании запишем в них значения:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Computer&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;компик&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}},&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;@{n&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;имя&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}},@{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Path&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;;e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;вот тут путь какой-то&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;}}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;проверяем:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[vPodans] $Object = &amp;quot;&amp;quot; | Select @{n='Computer';e={&amp;quot;компик&amp;quot;}},`
&amp;gt;&amp;gt; @{n='Name';e={&amp;quot;имя&amp;quot;}},@{n=&amp;quot;Path&amp;quot;;e={&amp;quot;вот тут путь какой-то&amp;quot;}}
&amp;gt;&amp;gt;
[vPodans] $Object | gm


   TypeName: Selected.System.String

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       System.Boolean Equals(Object obj)
GetHashCode Method       System.Int32 GetHashCode()
GetType     Method       System.Type GetType()
ToString    Method       System.String ToString()
Computer    NoteProperty System.String Computer=компик
Name        NoteProperty System.String Name=имя
Path        NoteProperty System.String Path=вот тут путь какой-то


[vPodans] $Object | fl *


Computer : компик
Name     : имя
Path     : вот тут путь какой-то



[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Вот такими небольшими трюками мы позволяем делать PowerShell очень удобным и простым инструментом. &lt;/p&gt;

&lt;p&gt;Вобщем, как говорится - As always enjoy the automation of tools within powershell.exe! © Flowering Weeds &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;

&lt;p&gt;з.ы. По причине краха виртуальных машин, продолжение темы про OCSP откладывается на некоторое время.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=2b0de569-2136-4d6c-846d-a492d65ef813"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,2b0de569-2136-4d6c-846d-a492d65ef813.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=f216661c-be01-441b-927c-239352611bda</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,f216661c-be01-441b-927c-239352611bda.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,f216661c-be01-441b-927c-239352611bda.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=f216661c-be01-441b-927c-239352611bda</wfw:commentRss>
      <title>Лёгкая разминка</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,f216661c-be01-441b-927c-239352611bda.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,f216661c-be01-441b-927c-239352611bda.aspx</link>
      <pubDate>Wed, 08 Apr 2009 22:15:28 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;На ньюсгруппах недавно попросили скрипт с использованием PowerShell, который бы рекурсивно определённую папку на предмет содержания определённых файлов и копировал эти файлы в другую папку. Причём файлы копироваться должны вместе с деревом папок, относительно корня. Корень в данном случае является папка, откуда начинается рекурсивный поиск. Действительно, такие задачи встречаются, поэтому мой вариант кому-то может оказаться полезным.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;D:\Users\Shared Documents&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;E:\DestFolder&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt;.Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;\&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;\\&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Include&lt;/span&gt;&lt;span style="color: #000000"&gt; *.msi &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;{
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$suf&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.directory.tostring() &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Item&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-itemtype&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;d&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-path&lt;/span&gt;&lt;span style="color: #000000"&gt; $(&lt;/span&gt;&lt;span style="color: #800080"&gt;$dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$suf&lt;/span&gt;&lt;span style="color: #000000"&gt;) -force -ea &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;copy&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt; $(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;$dest&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;$suf&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;&lt;font size="2" face="Verdana"&gt;)
}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Этот скрипт будет искать все MSI файлы в папке D:\Users\Shared Documents и подпапках. Если файл будет найден, то он будет скопирован в E:\SomeFolder с повторением структуры папок. Для начала я заэскейпил слеши в исходной папке. И в цикле уже отрезаю путь до корня обычным оператором –replace. После чего хвост пристыковываю к пути назначения, чтобы получить новую структуру папок и создаю нужные папки в месте назначения. И последней строкой копирую сам файл в уже подготовленную папку.&lt;/p&gt;

&lt;p&gt;Решений для этой задачи на самом деле очень много и я постарался сделать наиболее простой вариант, для разминки мозгов, так сказать :)&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=f216661c-be01-441b-927c-239352611bda"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,f216661c-be01-441b-927c-239352611bda.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=c8b6b0f3-8cb6-42b3-b91d-e6b15d6ef161</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,c8b6b0f3-8cb6-42b3-b91d-e6b15d6ef161.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,c8b6b0f3-8cb6-42b3-b91d-e6b15d6ef161.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=c8b6b0f3-8cb6-42b3-b91d-e6b15d6ef161</wfw:commentRss>
      <title>Управление безопасностью общих папок (сетевых шар) в PowerShell (часть 5)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,c8b6b0f3-8cb6-42b3-b91d-e6b15d6ef161.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,c8b6b0f3-8cb6-42b3-b91d-e6b15d6ef161.aspx</link>
      <pubDate>Wed, 04 Mar 2009 14:22:45 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;По просьбе читателей, а так же с учётом востребованности (судя по сообщениям форумов и ньюсгрупп) я нашёл время переписать скрипт ShareUtils.ps1 с поддержкой работы с удалёнными машинами и попутно пофиксив недочёты, которые были найдены за время эксплуатации предыдущей версии скрипта. Предыдущая версия опубликована здесь: &lt;A title=http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!188.entry href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!188.entry"&gt;http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!188.entry&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Технический функционал изменился только возможностью работы с удалёнными компьютерами, но синтаксис был изменён (а так же удалены лишние функции) по аналогии с &lt;A href="http://www.sysadmins.lv/PermaLink,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx"&gt;PrinterUtils&lt;/A&gt; и имеет примерно следующий вид:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT color=#0000ff&gt;New-Share –Computer &amp;lt;Computer&amp;gt; –Name &amp;lt;Name&amp;gt; –Path &amp;lt;Path&amp;gt; –Description &amp;lt;Description&amp;gt;&lt;/FONT&gt; &lt;BR&gt;где &lt;STRONG&gt;Computer&lt;/STRONG&gt; – имя или IP адрес компьютера, на котором необходимо расшарить папку. (не обязательный параметр). Если не указан, используется текущий компьютер. &lt;BR&gt;&lt;STRONG&gt;Name&lt;/STRONG&gt; - сетевое имя для папки; &lt;BR&gt;&lt;STRONG&gt;Path&lt;/STRONG&gt; - путь к физической папке; &lt;BR&gt;&lt;STRONG&gt;Description&lt;/STRONG&gt; описание к сетевой папке. При наличии пробелов -&amp;nbsp; заключить в кавычки (не обязательный параметр); 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Remove-Share –Computer &amp;lt;Computer&amp;gt; –Name &amp;lt;Name&amp;gt;&lt;/FONT&gt; – отменяет расшаривание на папке. Сама папка не удаляется. &lt;BR&gt;где &lt;STRONG&gt;Computer&lt;/STRONG&gt; – имя или IP адрес компьютера, на котором нужно отменить расшаривание папки. (не обязательный параметр). Если не указан, используется текущий компьютер. &lt;BR&gt;&lt;STRONG&gt;Name&lt;/STRONG&gt; - сетевое имя папки; 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Get-Share –Computer &amp;lt;Computer&amp;gt; –Name &amp;lt;Name&amp;gt;&lt;/FONT&gt; – получает основные сведения и списки DACL Share Permissions с указанных или всех сетевых папок. &lt;BR&gt;где &lt;STRONG&gt;Computer&lt;/STRONG&gt; – имя или IP адрес компьютера, с которого нужно получить сведения о сетевых папках. (не обязательный параметр). Если не указан, используется текущий компьютер. &lt;BR&gt;&lt;STRONG&gt;Name&lt;/STRONG&gt; - имя сетевой папки (не обязательный параметр). Если не указан, то выбираются все сетевые папки с типом &lt;STRONG&gt;Disk Drive&lt;/STRONG&gt; (в которые системные шары не входят). 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-SharePermission –User &amp;lt;User&amp;gt; –AceType &amp;lt;AceType&amp;gt; –AccessMask &amp;lt;AccessMask&amp;gt;&lt;/FONT&gt; – устанавливает единственный Share Permission ACE для указанного в аргументах пользователя. &lt;BR&gt;&lt;STRONG&gt;User&lt;/STRONG&gt; - имя пользователя/группы, которой предоставляется доступ; &lt;BR&gt;&lt;STRONG&gt;AceType&lt;/STRONG&gt; - тип доступа. Этот параметр должен иметь одно из значений &lt;EM&gt;Allow/Deny; &lt;BR&gt;&lt;/EM&gt;&lt;STRONG&gt;AccessMask&lt;/STRONG&gt; - маска доступа. Этот параметр должен иметь одно из значений &lt;EM&gt;FullControl/Change/Read;&lt;/EM&gt; &lt;BR&gt;&lt;EM&gt;&lt;BR&gt;Функция не может быть вначале строки, а только после конвейера Get-Share или другого источника с подходящими данными (например, если данные были сохранены в CSV/XML файле, то их можно использовать в качестве источника: Import-Csv path.csv | Set-SharePermission Everyone Allow Change). При этом все текущие права на сетевую папку будут удалены и записан только указанный в аргументах пользователь/группа.&lt;/EM&gt; 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Add-SharePermission –User &amp;lt;User&amp;gt; –AceType &amp;lt;AceType&amp;gt; –AccessMask &amp;lt;AccessMask&amp;gt;&lt;/FONT&gt; – добавляет указанного в аргументах пользователя к Share Permissions выбранной сетевой папки (или папок) &lt;BR&gt;&lt;STRONG&gt;User&lt;/STRONG&gt; - имя пользователя/группы, которой предоставляется доступ; &lt;BR&gt;&lt;STRONG&gt;AceType&lt;/STRONG&gt; - тип доступа. Этот параметр должен иметь одно из значений &lt;EM&gt;Allow/Deny;&lt;/EM&gt; &lt;BR&gt;&lt;STRONG&gt;AccessMask&lt;/STRONG&gt; - маска доступа. Этот параметр должен иметь одно из значений &lt;EM&gt;FullControl/Change/Read; &lt;BR&gt;&lt;BR&gt;Функция не может быть вначале строки, а только после конвейера Get-Share или другого источника с подходящими данными (например, если данные были сохранены в CSV/XML файле, то их можно использовать в качестве источника: Import-Csv path.csv | Add-SharePermission Everyone Allow Change).&lt;/EM&gt; 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Remove-SharePermission –User &amp;lt;User&amp;gt;&lt;/FONT&gt; – удаляет указанного пользователя из DACL выбранной сетевой папки (папок). Не может быть вначале строки, а только на выходе конвейера, откуда поступают объекты сетевых папок. Например, Get-Share | Remove-SharePermission Everyone – удалит группу Everyone из всех SharePermissions всех расшаренных папок на локальном компьютере. Разрешения NTFS при этом не изменяются. &lt;BR&gt;где &lt;STRONG&gt;User&lt;/STRONG&gt; - имя пользователя/группы, которого следует удалить из ACL сетевой папки. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Примеры использования практически идентичные, как и в PrinterUtils: &lt;A title=http://www.sysadmins.lv/PermaLink,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx href="http://www.sysadmins.lv/PermaLink,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx"&gt;http://www.sysadmins.lv/PermaLink,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;И, собственно, сам код:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#######################################################&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; ShareUtils.ps1&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Version 0.9&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Functions for advanced share management&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Note:&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Previous version is published at my former blog:&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; &lt;/FONT&gt;&lt;A href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!188.entry" target=_blank&gt;&lt;FONT color=#009500 size=2 face=Verdana&gt;http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!188.entry&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Vadims Podans (c) 2009&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; &lt;/FONT&gt;&lt;A href="http://www.sysadmins.lv/"&gt;&lt;FONT color=#009500 size=2 face=Verdana&gt;http://www.sysadmins.lv/&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt;####################################################### &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; внутренняя функция, которая преобразовывает числовой код возврата операции записи DACL&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; в текстовое значение.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_ShareUtils_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$write&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$write&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.ReturnValue) {
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Success&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Access Denied&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unknown Failure&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;9&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Invalid Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;21&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Invalid Parameter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;22&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Duplicate Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;23&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Redirected Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;24&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unknown Device or Directory&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;25&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Net Name Not Found&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;default&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unknown error $write.ReturnValue&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   }
}

&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; функция для извлечения сведений и DACL с существующих сетевых папок.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; обязательна для использования функций Add-SharePermission и Set-SharePermission&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; если компьютер не указан, то используется текущий. Если имя сетевой паки не указано,&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; то возвращается список сведений и DACL всех сетевых папок на локальном или удалённом компьютере&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Get-Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$name&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$name&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shares&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ComputerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;name = '$name'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    } &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT size=2 face=Verdana&gt;else&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shares&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ComputerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;type = 0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    }
    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; @()
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shares&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareSec&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_LogicalShareSecuritySetting&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ComputerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;name='$($share.name)'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; 
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shareSec&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SD&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sharesec&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.GetSecurityDescriptor()
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SD&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Descriptor.DACL | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;select&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @{e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.ClassPath.Server};n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;},
                @{e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.name};n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;},
                @{e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Path};n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;},
                @{e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Description};n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Description&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;},
                AccessMask,
                AceFlags,
                AceType,
                @{e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.trustee.Name};n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;User&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;},
                @{e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.trustee.Domain};n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;},
                @{e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.trustee.SIDString};n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SID&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            }
        } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Specified share not exist or you may not have sufficient rights to access them!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        }
&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;&lt;FONT size=2 face=Verdana&gt;$ShareInfo&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    }
}

&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; функция записи обновлённых сведений в сетевые папки. Не может быть первой в строке, а только после&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; конвейера, откуда поступают данные для записи. Если папка не расшарена, то скрипт её расшарит&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; автоматически и запишет необходимые сведения о сетевой папке.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Set-Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$input&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;select&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-unique&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Description&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.name
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SD&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;WMIClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_SecurityDescriptor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;).CreateInstance()
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;WMIClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_Ace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;).CreateInstance()
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Trustee&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;WMIClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_Trustee&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;).CreateInstance()
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sd&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.DACL &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; @()
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-and&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;} | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SID&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;new-object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;security.principal.securityidentifier&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.SID)
            [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;byte&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[]] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SIDArray&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SID&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.BinaryLength
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SID&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.GetBinaryForm(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SIDArray&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Trustee&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.user
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Trustee&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.SID &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SIDArray&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$ace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.AccessMask &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.AccessMask
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.AceType &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.AceType
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.AceFlags &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.AceFlags
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.trustee &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Trustee&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$SD&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.DACL &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ace&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.psObject.baseobject
        }
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; проверяется наличие расшаренной папки. Если папка есть, то в неё записывается только SecurityDescriptor&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; в противном случае она расшаривается и в неё производится полная запись всех данных&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ComputerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;name = '$name'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.psbase.GetMethodParameters(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SetShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Access &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SD&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$write&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.psbase.invokemethod(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SetShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Setting DACL on current share: $name on server $computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ForegroundColor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;green&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_ShareUtils_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Write&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        } &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT size=2 face=Verdana&gt;else&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shareobject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;wmiClass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\$computer\root\cimv2:win32_Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shareobject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.psbase.GetMethodParameters(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Create&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.name
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.path &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.path
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Description &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.Description
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Type &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Access &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SD&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$write&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shareobject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.psbase.invokemethod(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Create&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$inParams&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Processing current share: $name on server $computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ForegroundColor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;green&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_ShareUtils_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Write&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        }
    }
}

&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_Create-SDObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AceType&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AccessMask&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; преобразование текстового вида прав в числовые значения&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$masks&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @{FullControl &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;2032127&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; Change &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1245631&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; Read &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1179817&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$types&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @{Allow &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; Deny &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; создание необходимых свойств для объекта. Для поддержки удалённого управления&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; было добавлено свойство Computer, которое будет принимать от Get-Share аналогичное&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; значение. Тем самым обеспечивается сквозная трансляция имени компьютера, где&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; находится сетевая папка, по конвейеру для последующей записи&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;New-Object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;System.Management.Automation.PSObject&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;PSObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;PSObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;PSObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Description&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;PSObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;AccessMask&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;uint32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;AceFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;uint32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;AceType&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;uint32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;User&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;PSObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Domain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;PSObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SID&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;  ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;PSObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; заполнение объекта данными, которые были указаны в качестве аргументов вызова функции и возврат&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; объекта в вызывающую функцию&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$name&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.User &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.SID &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;new-object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;security.principal.ntaccount&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).translate([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;security.principal.securityidentifier&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;])
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.AccessMask &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$masks&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AccessMask&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.AceType &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$types&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AceType&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;&lt;FONT size=2 face=Verdana&gt;$AddInfo&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;}

&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Set-SharePermission&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AceType&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AccessMask&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; принимаются данные с конвейера &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$input&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_Create-SDObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AceType&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AccessMask&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; в этом цикле перебираются по именам все имена расшаренных папок и для каждой из них&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; записывается указанный в аргументах пользователь с удалением текущих ACE из ACL шары&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; это видно по тому, что никакая часть $ShareInfo не передаётся по конвейеру на запись&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;select&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Unique&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Name&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)) {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.name
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Description &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.Description
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;SPAN style="COLOR: #5f9ea0"&gt;Set-Share&lt;/SPAN&gt;
    }
}

&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; просто добавляет нового участника безопасности к текущему DACL расшаренной папки.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; NTFS Acl не изменяется.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Add-SharePermission&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AceType&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AccessMask&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$input&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;); &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfoNew&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; @()
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_Create-SDObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AceType&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AccessMask&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;select&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Unique&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Name&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)) {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.name
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Description &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.Description
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; вот этой строкой мы из списка всех сетевых папок итеративно перебираем каждую шару&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfoNew&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.name})
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; в хвост списка ACL каждой сетевой шары добавляем новый ACE&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfoNew&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; и подаём на запись&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ShareInfoNew&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Set-Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    }
}

&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; основная функция для удаления единичного ACE из ACL сетевой папки. Процесс сводится к извлечению&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; текущего списка (или списков) ACL и фильтрации ACE в этом списке по методу Not Equal. Всё, что не подпадает под&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; это действие записываются обратно в переменную, а всё, что подпало (указанный пользователь) обратно&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; в переменную $ShareInfo не записывается.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Remove-SharePermission&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shares&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; @(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$input&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; просто берём списки ACL, которые пришли по конвейеру и выкидываем оттуда все ACE,&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; в которых фигурирует указанный в аргументах пользователь/группа и записывем ACE обратно в ACL&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$shares&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.user &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-ne&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;} | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Set-Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;}

&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; основная функция для создания новых сетевых папок на локальном компьютере. Здесь я использую упрощённый&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; вариант создания сетевой папки, но учитывая один большой нюанс я добавил одно действие. Суть проблемы&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; изложена тут: &lt;/FONT&gt;&lt;A href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!170.entry" target=_blank&gt;&lt;FONT color=#009500 size=2 face=Verdana&gt;http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!170.entry&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; поэтому при создании новой сетевой папки я вручную создаю с нуля список ACL, который содержит&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; только группу Everyone и с правом Allow Read.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;New-Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$env:COMPUTERNAME&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Description&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;new-object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;security.principal.securityidentifier&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;S-1-1-0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).translate([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;security.principal.ntaccount&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;])
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_Create-SDObject&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$user&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.Value Allow Read
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Computer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Path &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$path&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Description &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Description&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$AddInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Set-Share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;}

&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; отменяет расшаривание сетевой папки. Сама же физическая папка не изменяется.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Remove-Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$name&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_Share&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ComputerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;name = '$name'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Specified network share doesn't exist!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    } &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT size=2 face=Verdana&gt;else&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$write&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$share&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.delete()
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Deleting network share $name on computer $computer:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_ShareUtils_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$write&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    }
}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=c8b6b0f3-8cb6-42b3-b91d-e6b15d6ef161"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,c8b6b0f3-8cb6-42b3-b91d-e6b15d6ef161.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / ACL</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=bcf4e2a2-5706-432c-97e7-efb4c710277e</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,bcf4e2a2-5706-432c-97e7-efb4c710277e.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,bcf4e2a2-5706-432c-97e7-efb4c710277e.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=bcf4e2a2-5706-432c-97e7-efb4c710277e</wfw:commentRss>
      <slash:comments>14</slash:comments>
      <title>Странности Set-Acl</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,bcf4e2a2-5706-432c-97e7-efb4c710277e.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,bcf4e2a2-5706-432c-97e7-efb4c710277e.aspx</link>
      <pubDate>Sun, 01 Mar 2009 20:44:06 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Наткнулся на него когда готовил ответ для ньюсгрупп. Как известно, владелец объекта может спокойно изменять списки ACL объектов минуя все их ограничения пользуясь неоткланяемым правом владения объектом. Поэтому, если из ACL объекта удалить все ACE и сохранить, то мы из проводника можем в любой момент вызвать вкладку Security объекта и задать требуемые ACE. Однако, это возможно только из графического интерфейса проводника сделать. При использовании скрипта и командлета &lt;strong&gt;Set-Acl&lt;/strong&gt; мы этого сделать не сможем. Продемонстрирую проблему:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;&lt;p&gt;[C:\] whoami
contoso\administrator
[C:\] Get-Acl C:\Test | fl


Path   : Microsoft.PowerShell.Core\FileSystem::C:\Test
Owner  : CONTOSO\administrator
Group  : CONTOSO\Domain Users
Access :
Audit  :
Sddl   : O:LAG:DUD:PAI



[C:\] $acl = Get-Acl C:\Test
[C:\] $accessrule = New-Object System.Security.AccessControl.FileSystemAccessRule(&amp;quot;Administrator&amp;quot;,&amp;quot;FullControl&amp;quot;, &amp;quot;Allow&amp;quot;
)
[C:\] $acl.AddAccessRule($accessRule)
[C:\] $acl | Set-Acl C:\Test
&lt;font color="#ff0000"&gt;Set-Acl : Attempted to perform an unauthorized operation.
At line:1 char:15
+ $acl | Set-Acl &amp;lt;&amp;lt;&amp;lt;&amp;lt;  C:\Test
    + CategoryInfo          : PermissionDenied: (C:\Test:String) [Set-Acl], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetAclCommand&lt;/font&gt;

[C:\]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Как видите, текущий пользователь (администратор) является владельцем папки. Но все ACE в ACL пустые (секция Access). Пользуясь правами владельца, всё же, я не могу ничего сделать с этим списком. Как выяснилось в процессе исследования, пользователю-владельцу, который собирается менять ACL &lt;u&gt;необходимо иметь явно назначенное или унаследованное разрешение &lt;strong&gt;TakeOwnership&lt;/strong&gt;&lt;/u&gt;. Никаких Read/ChangePermissions и прочих не надо. Теперь я из проводника добавлю себе право TakeOwnership и попробую снова исполнить код:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;&lt;p&gt;[C:\] Get-Acl C:\Test | fl


Path   : Microsoft.PowerShell.Core\FileSystem::C:\Test
Owner  : CONTOSO\administrator
Group  : CONTOSO\Domain Users
Access : CONTOSO\administrator Allow  TakeOwnership, Synchronize
Audit  :
Sddl   : O:LAG:DUD:PAI(A;OICI;0x180000;;;LA)



[C:\] $acl = Get-Acl C:\Test
[C:\] $accessrule = New-Object System.Security.AccessControl.FileSystemAccessRule(&amp;quot;Administrator&amp;quot;,&amp;quot;FullControl&amp;quot;, &amp;quot;Allow&amp;quot;
)
[C:\] $acl.AddAccessRule($accessRule)
[C:\] $acl | Set-Acl C:\Test
[C:\] Get-Acl C:\Test | fl


Path   : Microsoft.PowerShell.Core\FileSystem::C:\Test
Owner  : CONTOSO\administrator
Group  : CONTOSO\Domain Users
Access : CONTOSO\Administrator Allow  TakeOwnership, Synchronize
         CONTOSO\Administrator Allow  FullControl
Audit  :
Sddl   : O:LAG:DUD:PAI(A;OICI;0x180000;;;LA)(A;;FA;;;LA)



[C:\]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Как видите, теперь всё получилось. Я не понимаю, зачем мне нужно иметь право TakeOwnership, чтобы изменить ACL, если я являюсь владельцем. В реальной среде это может вызвать определённые трудности, как неадекватное поведение скрипта, который будет сыпать ошибками (в связи с чем появился вопрос на ньюсгруппах).&lt;/p&gt;

&lt;p&gt;Зато мною не очень любимый WMI справился с задачей на ура, израсходовав кода при этом во много раз больше, чем с использованием командлетов. И в итоге получилось вот:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Test&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$user&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Administrator&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;.replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;\&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;\\&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;WMIClass&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_SecurityDescriptor&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;).CreateInstance()
&lt;/span&gt;&lt;span style="color: #800080"&gt;$ace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;WMIClass&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_ace&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;).CreateInstance()
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;WMIClass&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_Trustee&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;).CreateInstance()
&lt;/span&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;new-object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;security.principal.ntaccount&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$user&lt;/span&gt;&lt;span style="color: #000000"&gt;).translate([&lt;/span&gt;&lt;span style="color: #008080"&gt;security.principal.securityidentifier&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;])
[&lt;/span&gt;&lt;span style="color: #008080"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]] &lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.BinaryLength
&lt;/span&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;span style="color: #000000"&gt;.GetBinaryForm(&lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt;.Name &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$user&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt;.SID &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$ace&lt;/span&gt;&lt;span style="color: #000000"&gt;.AccessMask &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.AccessControl.FileSystemRights&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;FullControl&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$ace&lt;/span&gt;&lt;span style="color: #000000"&gt;.AceFlags &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;0x3&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$ace&lt;/span&gt;&lt;span style="color: #000000"&gt;.AceType &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$ace&lt;/span&gt;&lt;span style="color: #000000"&gt;.Trustee &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$trustee&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; читаем текущий ACL с объекта&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$oldDACL&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_LogicalFileSecuritySetting&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;path='$path'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;).GetSecurityDescriptor().Descriptor.DACL
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; добавляем его к пустому объекту DACL&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;.DACL &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$oldDACL&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и добавляем новый ACE&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;.DACL &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; @(&lt;/span&gt;&lt;span style="color: #800080"&gt;$ace&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.psobject.baseobject)
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; устанавливаем флаг SE_DACL_PRESENT&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;.ControlFlags &lt;/span&gt;&lt;span style="color: #ff0000"&gt;= &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;0x4&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$folder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_LogicalFileSecuritySetting&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;path='$path'&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$folder&lt;/span&gt;&lt;span style="color: #000000"&gt;.setsecuritydescriptor(&lt;/span&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Я больше склонен доверять WMI и констатировать факт, что он работает честно – даёт мне делать с объектом что угодно и как угодно признавая мои права владения.&lt;/p&gt;

&lt;p&gt;Я считаю, что Set-Acl был сильно не прав, отказав мне в изменении пустых ACE, поэтому отрепортил это дело на connect:&lt;/p&gt;

&lt;p&gt;&lt;a title="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=418906&amp;amp;SiteID=99" href="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=418906&amp;amp;SiteID=99"&gt;https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=418906&amp;amp;SiteID=99&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=bcf4e2a2-5706-432c-97e7-efb4c710277e"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,bcf4e2a2-5706-432c-97e7-efb4c710277e.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / ACL</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=a25d231f-3b0b-4de6-b799-1ef82007bb22</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,a25d231f-3b0b-4de6-b799-1ef82007bb22.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,a25d231f-3b0b-4de6-b799-1ef82007bb22.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=a25d231f-3b0b-4de6-b799-1ef82007bb22</wfw:commentRss>
      <title>Подписывание скриптов PowerShell – практическая реализация (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,a25d231f-3b0b-4de6-b799-1ef82007bb22.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,a25d231f-3b0b-4de6-b799-1ef82007bb22.aspx</link>
      <pubDate>Tue, 17 Feb 2009 06:36:22 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В предыдущем посте я показал, как можно легко и удобно подписывать скрипты и как усилить безопасность их исполнения, а так же предупредить несанкционированное изменение кода. Но, как я уже отметил, подписывать каждый раз скрипт из консоли не особо удобно. Например, если вы занимаетесь финальной отладкой скрипта в редакторе, как PowerGUI или PowerShell ISE, то в конце отладки вы просто сохраняете скрипт и закрываете редактор. Понятно, что ещё отдельно запускать консоль PowerShell будет неудобно. Поэтому я написал небольшой скрипт с установщиком, который позволит из проводника по правому нажатию на PS1 файл вы сможете подписывать скрипты.&lt;/p&gt;  &lt;p&gt;Чтобы поместить свой элемент в контекстное меню при нажатии на PS1 файлы (на других типах файлов его не будет) нам нужно добавить некоторые значения в реестр по пути:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;HKLM\Software\Classes\Microsoft.PowerShellScript.1\Shell&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;подключ с названием нашего элемента – &lt;strong&gt;Sign It&lt;/strong&gt; и в нём уже команду, которая будет отрабатываться при нажатии на него. Я решил не изобретать велосипед и воспользовался приёмами, которые использовал ещё в старом блоге: &lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!201.entry"&gt;Полезная безделушка Hash SHA1 на PowerShell&lt;/a&gt;. Шапка по сути осталась та же, только тело (исполняемый модуль) изменился. И вот, что получилось для PowerShell 1.0 (для V2 опубликую ниже):&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;####################################################################&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Sign PS1 Script.ps1&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Version 1.5&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Automatically sign PowerShell script from .PS1 file context menu&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Fully compatible with PowerShell 1.0&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Vadims Podans (c) 2009&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://www.sysadmins.lv/&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;####################################################################&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Read-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Specify path to hold SignIt.PS1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;\&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;SignIt.ps1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Registry::HKLM\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign It\command&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegValue&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -noninteractive -noprofile -command $FilePath '%1'&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Item&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ErrorAction&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;SilentlyContinue&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegPath&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;(Default)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegValue&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Item&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ItemType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;file&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$exefile&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;param ($file)
$cp = new-object Microsoft.CSharp.CSharpCodeProvider
$cpar = New-Object System.CodeDom.Compiler.CompilerParameters
$HideWindow = 0x0080
$ShowWindow = 0x0040
$Code = @"
using System;
using System.Runtime.InteropServices;
namespace Win32API
{
    public class Window
    {
        [DllImport("user32.dll")]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
    }
}
"@
$cp.CompileAssemblyFromSource($cpar, $code)
$PSHandle = (Get-Process –id $pid).MainWindowHandle
[Win32API.Window]::SetWindowPos($PSHandle, 0, 0, 0, 0, 0, $HideWindow)
function _msgbox_ ($title, $text, $type = "None") {
    [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
    $msg = [Windows.Forms.MessageBox]::Show($text, $title, [Windows.Forms.MessageBoxButtons]::ok, 
    [Windows.Forms.MessageBoxIcon]::$type)
}
$cert = @(dir cert:\currentuser\my -codesigning)[0]
if (!$cert) {
    _msgbox_ -title "Error" -text "Here is no valid signing certificate!" -type "Error"
    exit
}
$status = Set-AuthenticodeSignature "$file" $cert -TimestampServer "http://timestamp.verisign.com/scripts/timstamp.dll"
if ($status.status -eq "Valid") {
    _msgbox_ -title "Success" -text "Script is now signed! Enjoy!"
} else {
    _msgbox_ -title "Error" -text $status.StatusMessage -type "Error"
}
exit&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Set-Content&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$exefile&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &amp;&lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
            &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Unable to create file in: $FilePath. Path is incorrect or you haven't sufficient permissions&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
    }
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Unable to create registry key. May be you haven't sufficient permissions to HKLM hive&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Данный скрипт является установщиком. Для реализации всех функций достаточно запустить этот скрипт и по требованию указать путь, где будет находиться рабочий скрипт (содержимое переменной $exefile).&lt;/p&gt;

&lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;/font&gt; такой метод установки справедлив только для V2. При использовании PowerShell 1.0 установщик следует запускать непосредственно из консоли PowerShell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Заметка:&lt;/font&gt;&lt;/strong&gt; Здесь следует обратить внимание на блок кода, который идёт после PARAM в переменной $exefile. Данный блок кода скрывает саму консоль PowerShell и показывает только графическую часть, которая исполняется из скрипта. Функция скрытия консоли честно взята из блога Васи Гусева: &lt;a href="http://xaegr.wordpress.com/2009/02/11/powershell1-api/"&gt;Win32 API из PowerShell 1.0&lt;/a&gt;. &lt;u&gt;Данный метод работает как в PowerShell V2 CTP3, так и в PowerShell 1.0.&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;И вариант скрипта для PowerShell V2:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;####################################################################&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Sign PS1 Script.ps1&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Version 1.5&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Automatically sign PowerShell script from .PS1 file context menu&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Require PowerShell V2, not compatible with PowerShell 1.0&lt;/span&gt;&lt;span style="color: #008000"&gt;
#
#&lt;/span&gt;&lt;span style="color: #008000"&gt; Vadims Podans (c) 2009&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; http://www.sysadmins.lv/&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;####################################################################&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt;requires -Version 2.0&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Read-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Specify path to hold SignIt.PS1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;\&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;SignIt.ps1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Registry::HKLM\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign It\command&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegValue&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -noprofile -command $FilePath '%1'&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Item&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ErrorAction&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;SilentlyContinue&lt;/span&gt;&lt;span style="color: #000000"&gt;
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegPath&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;(Default)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RegValue&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Item&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ItemType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;file&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$exefile&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;param ($file)
function _msgbox_ ($title, $text, $type = "None") {
    [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
    $msg = [Windows.Forms.MessageBox]::Show($text, $title, [Windows.Forms.MessageBoxButtons]::ok,
    [Windows.Forms.MessageBoxIcon]::$type)
}
$cert = @(dir cert:\currentuser\my -codesigning)[0]
if (!$cert) {
    _msgbox_ -title "Error" -text "Here is no valid signing certificate!" -type "Error"
    exit
}
$status = Set-AuthenticodeSignature "$file" $cert -TimestampServer "http://timestamp.verisign.com/scripts/timstamp.dll"
if ($status.status -eq "Valid") {
    _msgbox_ -title "Success" -text "Script is now signed! Enjoy!"
} else {
    _msgbox_ -title "Error" -text $status.StatusMessage -type "Error"
}
exit&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Set-Content&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$FilePath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$exefile&lt;/span&gt;&lt;span style="color: #000000"&gt;
            &amp;&lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$filepath&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
            &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Unable to create file in: $FilePath. Path is incorrect or you haven't sufficient permissions&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
    }
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Unable to create registry key. May be you haven't sufficient permissions to HKLM hive&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Так же, после копирования файла установщик попытается сразу подписать рабочий скрипт, чтобы этого не пришлось делать потом вручную. После этого в контекстном меню PS1 файлов будет элемент Sign It:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Context menu" border="0" alt="Context menu" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell2_1383C/signing1_2.jpg" width="193" height="287" /&gt; &lt;/p&gt;

&lt;p&gt;И если у пользователя есть сертификат для подписи скриптов, то при нажатии на этот элемент получите сообщение:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Success signing message" border="0" alt="Success signing message" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell2_1383C/signing2_2.jpg" width="249" height="141" /&gt; &lt;/p&gt;

&lt;p&gt;В противном случае получите ошибку:&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Failed signing message" border="0" alt="Failed signing message" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell2_1383C/signing3_2.jpg" width="278" height="150" /&gt;&lt;/p&gt;

&lt;p&gt;Вот так можно значимо упростить процесс подписывания скриптов не открывая консоль PowerShell. Но если файлов будет много, то ничего не мешает основную часть кода засунуть в цикл Foreach. Например:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="consola"&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;cert&lt;/span&gt;&lt;span style="color: #000000"&gt;:\&lt;/span&gt;&lt;span style="color: #800000"&gt;currentuser\my&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="consola"&gt;&lt;span style="color: #000000"&gt; -codesigning)[0]
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Include&lt;/span&gt;&lt;span style="color: #000000"&gt; *.ps1 &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Set-AuthenticodeSignature&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;$_&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;На этом пока о подписывании скриптов всё, что я хотел рассказать.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Update 30.08.2009:&lt;/font&gt;&lt;/strong&gt; немного переделал скрипты с учётом следующих поправок:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Добавлена возможность подписывания скриптов с использованием сервера времени VeriSign, который в подписи ставит подписанную VeriSign' ом цифровую метку времени. &lt;/li&gt;

  &lt;li&gt;Исправлены ошибки с выводом сообщений о результате операции. Например, если пользователь отменял операцию подписи, либо происходила другая ошибка в процессе подписывания, то появлялось сообщение о том, что файл подписан (хотя это было не так). Сейчас сделана проверка поля &lt;strong&gt;Status&lt;/strong&gt;. &lt;/li&gt;

  &lt;li&gt;в связи с этим изменил код в посте на обновлённый. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;И, собственно, кнопки для скачивания скриптов:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;для PowerShell 1.0 &lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/signit_ps1.0.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/signit_ps1.0.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/signit_ps1.0.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;8,42 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/signit_ps1.0.ps1" target="_self" alt="Download File"&gt;SignIt_ps1.0.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;для PowerShell 2.0 &lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/signit_ps2.0.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/signit_ps2.0.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/signit_ps2.0.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;7,85 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/signit_ps2.0.ps1" target="_self" alt="Download File"&gt;SignIt_ps2.0.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=a25d231f-3b0b-4de6-b799-1ef82007bb22"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,a25d231f-3b0b-4de6-b799-1ef82007bb22.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Digital Signatures</category>
      <category>Security</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=329e374b-27b4-42b5-8bf5-a167717372c6</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,329e374b-27b4-42b5-8bf5-a167717372c6.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,329e374b-27b4-42b5-8bf5-a167717372c6.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=329e374b-27b4-42b5-8bf5-a167717372c6</wfw:commentRss>
      <title>Подписывание скриптов PowerShell – практическое руководство (часть 1)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,329e374b-27b4-42b5-8bf5-a167717372c6.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,329e374b-27b4-42b5-8bf5-a167717372c6.aspx</link>
      <pubDate>Mon, 16 Feb 2009 06:56:08 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Как известно практически всем пользователям PowerShell, в целях безопасности была введена политика запуска скриптов. Которая имеет 4 режима:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Restricted&lt;/strong&gt; – запрещено исполнять любые скрипты, возможна работа только в интерактивной консоли &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;AllSigned&lt;/strong&gt; – все скрипты должны быть криптографически подписаны &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;RemoteSigned&lt;/strong&gt; – только полученные из недоверенных источников (например, интернет) скрипты должны быть подписаны &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Unrestricted&lt;/strong&gt; – наименее безопасный уровень, допускается исполнение любых скриптов &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;В версии V2 (пока ещё CTP3) скрипты PowerShell приравняли к исполняемым файлам и эти файлы стали неотключаемо мониториться политикой &lt;strong&gt;Software Restriction Policies&lt;/strong&gt;. Я об этом уже писал ранее: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,b0e82900-ae06-4f83-90cf-ee893271cdfa.aspx"&gt;PowerShell V2 и Software Restriction Policies&lt;/a&gt;. Поначалу меня это сильно напрягало, но после пришёл к мнению, что это правильно. Неправильно только то, что мы этого не видим (&lt;strong&gt;ps1&lt;/strong&gt; расширение нигде не фигурирует). С этим бороться можно двумя методами – явно указывать пути, откуда разрешён запуск &lt;strong&gt;.ps1&lt;/strong&gt; файлов или подписать их все.&lt;/p&gt;  &lt;p&gt;Если компьютеров в сети больше одного, то самое идеальное для решения задачи будет наличие домена &lt;strong&gt;Active Directory&lt;/strong&gt; и, по возможности, &lt;strong&gt;Enterprise Certification Authity&lt;/strong&gt; &lt;em&gt;(CA)&lt;/em&gt;. Наличие домена решит массу задач, как распространение политики SRP в пределах домена, распространение сертификата в пределах домена, контроль версии сертификата, которым подписаны скрипты.&lt;/p&gt;  &lt;p&gt;Итак, для начала нам нужно получить сертификат, которым будут подписываться скрипты. В целях безопасности следует создать ограниченную учётную запись пользователя из под которой администратор (в большинстве случаев) будет подписывать скрипты. В книге PowerShell In Action для генерации сертификата предлагается использовать &lt;strong&gt;makecert.exe&lt;/strong&gt;, который входит в состав Visual Studio SDK, но как мне кажется более правильным будет использование CA. В Windows Server CA для этих целей есть уже готовый шаблон, который называется &lt;strong&gt;Code Signing&lt;/strong&gt;. Но принципиальной разницы нету, каким инструментом вы будете генерировать сертификат и я опишу процесс получения сертификата с использованием доменного CA.&lt;/p&gt;  &lt;p&gt;Если CA у нас уже установлен, то открываем оснастку &lt;strong&gt;Certification Authority&lt;/strong&gt; и переходим в раздел &lt;strong&gt;Certificate Templates&lt;/strong&gt;. Нажимаем правой кнопкой и выбираем &lt;strong&gt;Manage&lt;/strong&gt;. Откроется редактор шаблонов. Если у вас Enterprise или Datacenter редакции Windows Server, то вы можете создать свой настроенный шаблон. Но я не вижу в этом необходимости. На данном этапе нам необходимо разрешить ограниченному пользователю запрашивать сертификаты этого шаблона. Для этого в закладке &lt;strong&gt;Security&lt;/strong&gt; шаблона &lt;strong&gt;Code Signing&lt;/strong&gt; нужно разрешить чтение и запрос сертификата ограниченному пользователю. Когда эта процедура проделана, редактор шаблонов можно закрыть. После чего в оснастке Certification Authority снова нажать правой кнопкой на разделе &lt;font color="#0000ff"&gt;Certificate Templates –&gt; New –&gt; Certificate Template to Issue&lt;/font&gt; и в списке выбрать шаблон &lt;strong&gt;Code Signing&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;После чего нужно залогиниться этим пользователем, запустить оснастку Certificate Manager (&lt;font color="#0000ff"&gt;Start –&gt; Run… –&gt; certmgr.msc&lt;/font&gt;) и выполнить запрос сертификата. В списке шаблонов должен быть и добавленный нами Code Signing. Когда сертификат будет запрошен не надо закрывать оснастку сертификатов. Далее нам потребуется экспортировать открытую часть сертификата в x509 файл (с расширением &lt;strong&gt;.cer&lt;/strong&gt;). Экспорт открытой части нам потребуется для проверки подписи и организации доверия подписи в пределах домена. Экспортированный сертификат необходимо теперь доставить администратору(-ам), который отвечает за групповую политику.&lt;/p&gt;  &lt;p&gt;В групповых политиках (чаще всего в доменной политике) необходимо создать новую политику &lt;strong&gt;Software Restriction Policies&lt;/strong&gt; и в &lt;strong&gt;Additiona Rules&lt;/strong&gt; добавить правило сертификата (&lt;strong&gt;Certificate Rule&lt;/strong&gt;) и указать экспортированный сертификат. Это необходимо затем, что PowerShell для проверки доверия сертификата ищет его в контейнере &lt;strong&gt;Trusted Publishers&lt;/strong&gt; и только Software Restriction Policies позволяет централизовано распространять сертификаты в этот контейнер.&lt;/p&gt;  &lt;p&gt;Теперь можно приступать к подписыванию скриптов. Для этих целей используется командлет Set-AuthenticodeSignature и синтаксис его такой:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Set-AuthenticodeSignature&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Где $file – путь к скрипту и $cert – объект сертификата, который получается следующим образом:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$cert&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;cert&lt;/span&gt;&lt;span style="color: #000000"&gt;:\&lt;/span&gt;&lt;span style="color: #800000"&gt;CurrentUser\My&lt;/span&gt;&lt;span style="color: #000000"&gt; -codesigning)[0]&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;здесь мы явно указываем, что нам нужен сертификат, у которого в &lt;strong&gt;EKU&lt;/strong&gt; (&lt;em&gt;Enchanced Key Usage)&lt;/em&gt; указан &lt;strong&gt;Code Sgining&lt;/strong&gt;. В нашем случае он будет всего 1. Но если их окажется несколько, то мы выберем самый первый. Вот как это будет выглядеть на практике:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Desktop] Set-ExecutionPolicy allsigned
[Desktop] Get-ExecutionPolicy
AllSigned
[Desktop] .\uptime.ps1
&lt;font color="#ff0000"&gt;File C:\Documents and Settings\Signer\Desktop\uptime.ps1 cannot be loaded. The file C:\Documents and Settings\Signer
\Desktop\uptime.ps1 is not digitally signed. The script will not execute on the system. Please see "get-help
 about_signing" for more details..
At line:1 char:13
+ .\uptime.ps1 &lt;&lt;&lt;&lt;
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException&lt;/font&gt;

[Desktop] $cert = @(dir cert:\currentuser\my -codesigning)[0]
[Desktop] $cert


    Directory: Microsoft.PowerShell.Security\Certificate::currentuser\my


Thumbprint                                Subject
----------                                -------
42E5B32A19885C6ADCF9683BDA1C871E0FE5E0DB  CN=Signer, CN=Users, DC=contoso, DC=com


[Desktop] Set-AuthenticodeSignature uptime.ps1 $cert


    Directory: C:\Documents and Settings\Signer\Desktop


SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
42E5B32A19885C6ADCF9683BDA1C871E0FE5E0DB  Valid                                  uptime.ps1


[Desktop] .\uptime.ps1
System Uptime for DC1 is:  1 days 4 hours 19 minutes 20 seconds
[Desktop]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Я наглядно показал, как это работает. Мы сначала перевели политику исполнения скриптов в &lt;strong&gt;AllSigned&lt;/strong&gt; и убедились, что неподписанный скрипт не исполняется. После чего я подписал этот скрипт и попробовал снова. Как видите, скрипт теперь исполнился.&lt;/p&gt;

&lt;p&gt;Если не будет выполнено условие распространения сертификата посредством политики SRP в контейнер &lt;strong&gt;Trusted Publishers&lt;/strong&gt;, то вы получите вот такое сообщение:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Desktop] .\uptime.ps1

&lt;font color="#ffffff"&gt;Do you want to run software from this untrusted publisher?&lt;/font&gt;
File C:\Documents and Settings\Signer\Desktop\uptime.ps1 is
published by CN=Signer, CN=Users, DC=contoso, DC=com and is not trusted
on your system. Only run scripts from trusted publishers.
[V] Never run  &lt;font color="#ffffff"&gt;[D] Do not run&lt;/font&gt;  [R] Run once  [A] Always run  [?] Help
(default is "D"):d
&lt;font color="#ff0000"&gt;File C:\Documents and Settings\Signer\Desktop\uptime.ps1 cannot be loaded because you have elected to no
t run this software now.
At line:1 char:12
+ .\uptime.ps1 &lt;&lt;&lt;&lt;&lt;/font&gt;
[Desktop]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Вот таким образом мы решаем задачу исполнения только проверенного набора скриптов. В этом смысле PowerShell 1.0 менее безопасный и удобный, поскольку мы не можем политикой SRP блокировать исполнение PS1 файлов как класс и имеем только один выход – принудительное подписывание скриптов. В версии V2 политика исполнения скриптов удобно интегрируется с SRP. Удобство интегрирования в том, что SRP помимо распространения сертификата в пределах домена так же на основе этого правила разрешает исполнять эти скрипты в обход общего ограничения на PS1 файлы.&lt;/p&gt;

&lt;p&gt;В следующем посте я расскажу, как можно упростить процесс подписывания скриптов. Так что не отключаемся &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=329e374b-27b4-42b5-8bf5-a167717372c6"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,329e374b-27b4-42b5-8bf5-a167717372c6.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Digital Signatures</category>
      <category>Security</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=86f52f41-e341-459c-a781-dbd5e0861113</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,86f52f41-e341-459c-a781-dbd5e0861113.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,86f52f41-e341-459c-a781-dbd5e0861113.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=86f52f41-e341-459c-a781-dbd5e0861113</wfw:commentRss>
      <title>Get-SystemUptime</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,86f52f41-e341-459c-a781-dbd5e0861113.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,86f52f41-e341-459c-a781-dbd5e0861113.aspx</link>
      <pubDate>Sun, 15 Feb 2009 18:07:38 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Этот скрипт написал скорее для себя, но весьма полезный. В Windows XP/Windows Server 2003 аптайм можно было легко посмотреть в свойствах сетевого подключения, которое как правило работает постоянно. Но в Windows Vista/Windows Server 2008 до него добираться далеко. Смотреть в Task Manager не удобно, поскольку он показывает аптайм в часах, а в уме высчитывать дни как-то неудобно. Вот и набросал функцию, которую положил себе в профиль:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Get-SystemUptime&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$computer&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;$env:computername&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$lastboot&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Management.ManagementDateTimeconverter&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ToDateTime&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;(
    &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;$((gwmi  Win32_OperatingSystem -computername $computer).LastBootUpTime)&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$uptime&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-Date&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$lastboot&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;System Uptime for $computer is: &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$uptime&lt;/span&gt;&lt;span style="color: #000000"&gt;.days &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;days&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$uptime&lt;/span&gt;&lt;span style="color: #000000"&gt;.hours &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;`&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;hours&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$uptime&lt;/span&gt;&lt;span style="color: #000000"&gt;.minutes &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;minutes&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$uptime&lt;/span&gt;&lt;span style="color: #000000"&gt;.seconds &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;seconds&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Концепция очень простая – берётся дата и время последней загрузки системы и вычитается из текущей даты и времени. Здесь важно отметить, что WMI возвращает нам дату в своём формате, который нужно преобразовать в тип &lt;strong&gt;DateTime&lt;/strong&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=86f52f41-e341-459c-a781-dbd5e0861113"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,86f52f41-e341-459c-a781-dbd5e0861113.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=39a7b7e0-8474-4790-81b0-156b3964a8ac</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=39a7b7e0-8474-4790-81b0-156b3964a8ac</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>ConvertFrom-StringData</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</link>
      <pubDate>Tue, 10 Feb 2009 08:43:49 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Тут обнаружился один интересный командлет – &lt;STRONG&gt;ConvertFrom-StringData&lt;/STRONG&gt;, который позволяет преобразовывать строку в хэш-таблицы. Скажем, есть файл вида:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;ключ1 = значение1 &lt;BR&gt;ключ2 = значение2 &lt;BR&gt;ключ3 = значение3 &lt;BR&gt;ключ4 = значение4&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;при этом иногда очень хочется работать с этими строками как с объектами. Т.е. при указании объекта и его ключа, например, &lt;STRONG&gt;$a.key1&lt;/STRONG&gt; получить его значение. Как это делается в хэш-таблицах. Вот пример:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = @{"key1"="value1";"key2"="value2"}
[vPodans] $a

Name                           Value
----                           -----
key2                           value2
key1                           value1


[vPodans] $a.key1
value1
[vPodans] $a.key2
value2
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;здесь я создал простую хэш-таблицу. Но если у нас есть файл общего вида, &lt;STRONG&gt;ключ = значение&lt;/STRONG&gt;, то его можно легко привести в вид хэш-таблиц:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = "key1 = value1"
[vPodans] $a
key1 = value1
[vPodans] $a.GetType().FullName
System.String
[vPodans] $b = ConvertFrom-StringData -StringData $a
[vPodans] $b

Name                           Value
----                           -----
key1                           value1


[vPodans] $b.GetType().FullName
System.Collections.Hashtable
[vPodans] $b.key1
value1
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;сперва я создал строку, которая состоит из пары ключ = значение, в чём мы можем убедиться в типе данных. Вторым этапом я сконвертировал эту строку в хэш-таблицу. Однако, следует учесть, что такое возможно только для строки, но не массива строк. Вот так легко попасть в засаду:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = gc keys.txt
[vPodans] $a
key1 = value1
key2 = value2
key3 = value3
key4 = value4
[vPodans] $a[0]
key1 = value1
[vPodans] ConvertFrom-StringData -StringData $a
&lt;FONT color=#ff0000&gt;ConvertFrom-StringData : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'StringData
'. Specified method is not supported.
At line:1 char:35
+ ConvertFrom-StringData -StringData &amp;lt;&amp;lt;&amp;lt;&amp;lt;  $a
    + CategoryInfo          : InvalidArgument: (:) [ConvertFrom-StringData], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.ConvertFromStringDataCommand&lt;/FONT&gt;

[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;командлет &lt;STRONG&gt;Get-Content&lt;/STRONG&gt; (или его алиас &lt;STRONG&gt;GC&lt;/STRONG&gt;, не путать с глобальным каталогом) читает файл построчно в виде массива. Следовательно каждая строка является отдельным элементом массива. Как быть в такой ситуации? На первый взгляд может показаться, что можно Get-Content разобрать через &lt;STRONG&gt;Foreach-Object&lt;/STRONG&gt; и уже отдельные элементы массива подавать конвертеру в качестве строк. Смотрим:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = gc keys.txt | %{ConvertFrom-StringData -StringData $_}
[vPodans] $a

Name                           Value
----                           -----
key1                           value1
key2                           value2
key3                           value3
key4                           value4


[vPodans] $a.key1
[vPodans] $a.GetType().FullName
System.Object[]
[vPodans] $a[0].key1
value1
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Как видите, мы на выходе получили не одну хэш-таблицу, а массив одиночных хэш-таблиц и для доступа к его ключам и значениям нужно ещё указывать номер элемента в массиве. Чтобы решить данную проблему нужно каким-то образом прочитать файл не построчно, а в виде целой строки. Для чтения файла целиком можно воспользоваться методом &lt;A href="http://msdn.microsoft.com/en-us/library/system.io.file.readalltext.aspx" target=_blank&gt;ReadAllText&lt;/A&gt; класса &lt;A title="File Class" href="http://msdn.microsoft.com/en-us/library/system.io.file.aspx" target=_blank&gt;File Class&lt;/A&gt;. Как видно из описания метода, он читает текст в единую строку. Давайте посмотрим, что у нас получится:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = [io.file]::ReadAllText("keys.txt")
[vPodans] $a
key1 = value1
key2 = value2
key3 = value3
key4 = value4


[vPodans] $a.GetType().FullName
System.String
[vPodans] $b = ConvertFrom-StringData -StringData $a
[vPodans] $b

Name                           Value
----                           -----
key2                           value2
key4                           value4
key1                           value1
key3                           value3


[vPodans] $b.key1
value1
[vPodans] $b.key2
value2
[vPodans] $b.key3
value3
[vPodans] $b.key4
value4
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;или просто в одну строчку:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;ConvertFrom-StringData&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-StringData&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;io.file&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ReadAllText&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;keys.txt&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;))&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Вот так просто в стиле The PowerShell Way (в одну строчку) можно текстовые файлы сконвертировать в хэш-таблицы и работать с ними как с объектами, что есть удобно и полезно.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=39a7b7e0-8474-4790-81b0-156b3964a8ac"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=69d09a83-3b32-4a67-a9eb-2fc5dc517b74</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,69d09a83-3b32-4a67-a9eb-2fc5dc517b74.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,69d09a83-3b32-4a67-a9eb-2fc5dc517b74.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=69d09a83-3b32-4a67-a9eb-2fc5dc517b74</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Получение установочного ключа Windows из PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,69d09a83-3b32-4a67-a9eb-2fc5dc517b74.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,69d09a83-3b32-4a67-a9eb-2fc5dc517b74.aspx</link>
      <pubDate>Thu, 05 Feb 2009 17:31:53 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Давненько я ничего не постил в блог. Причины разные, это и проблема отыскать интересный материал для блога и лень. Но сегодня нашёл что написать. Это портированный скрипт с VBS для извлечения установочного ключа Windows и других продуктов, как Microsoft Office.&lt;/P&gt;
&lt;P&gt;итак, исходный вариант на VBS, который был найден на просторах интернета:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Set WshShell = WScript.CreateObject("WScript.Shell") &lt;BR&gt;strDigitalProductId="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId" &lt;BR&gt;strXPKey=GetKey(WshShell.RegRead(strDigitalProductId)) &lt;BR&gt;MsgBox "Key:"&amp;amp;strXPKey &lt;BR&gt;Function GetKey(rpk) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Const rpkOffset=52:i=28 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; szPossibleChars="BCDFGHJKMPQRTVWXY2346789" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do 'Rep1 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwAccumulator=0 : j=14 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwAccumulator=dwAccumulator*256&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwAccumulator=rpk(j+rpkOffset)+dwAccumulator &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rpk(j+rpkOffset)=(dwAccumulator\24) and 255 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwAccumulator=dwAccumulator Mod 24 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j=j-1 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loop While j&amp;gt;=0 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i=i-1 : szProductKey=mid(szPossibleChars,dwAccumulator+1,1)&amp;amp;szProductKey &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((29-i) Mod 6)=0) and (i&amp;lt;&amp;gt;-1) then&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i=i-1 : szProductKey="-"&amp;amp;szProductKey &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Loop While i&amp;gt;=0 'Goto Rep1 &lt;BR&gt;GetKey=szProductKey &lt;BR&gt;End Function&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Учитывая мои почти нулевые познания в VBS пришлось сильно повозиться, чтобы понять его работу в VBS и активно сотрудничать с гуглом.&lt;/P&gt;
&lt;P&gt;И столкнулся с некоторыми трудностями:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;rpk(j+rpkOffset)=(dwAccumulator\24) and 255&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;вот здесь происходит деление. Но не простое деление, а деление с получением целого числа от частного с отрезанием десятичной части без округления. Возможно в VBS правила округления стандартные, но в PowerShell округление происходит несколько иначе, если у нас число с половинкой, например: 1,5; 5,5; 67,5. В таких случаях PowerShell округляет число до ближайшего чётного числа. Примеры:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] [math]::Round(0.5)
0
[vPodans] [math]::Round(1.5)
2
[vPodans] [math]::Round(2.5)
2
[vPodans] [math]::Round(3.5)
4
[vPodans] [math]::Round(4.5)
4
[vPodans] [math]::Round(5.5)
6
[vPodans] [math]::Round(6.5)
6
[vPodans] [math]::Round(7.5)
8
[vPodans] [math]::Round(8.5)
8
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Как видите с использованием математической функции округления вы никогда не получите нечётное число, если округлять такие числа. Есть ещё вариант форматирования строки. Но он при отбрасывании дробной части округляет половинки до бОльшего целого числа (&lt;EM&gt;хотя нужно до меньшего&lt;/EM&gt;, что и делает VBS в данном случае):&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] (0.5).tostring("F00")
1
[vPodans] (1.5).tostring("F00")
2
[vPodans] (2.5).tostring("F00")
3
[vPodans] (3.5).tostring("F00")
4
[vPodans] (4.5).tostring("F00")
5
[vPodans] (5.5).tostring("F00")
6
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;ну и я не нашёл ничего лучше, как написать простенький регексп и им отрезать ненужный хвостик. Суть регекспа будет заключаться в извлечении из строки только цифр начиная от начала строки до первого нечислового символа. Как я уже писал в предыдущем блоге в регулярных выражениях начало строки обозначается знаком возведения в степень – &lt;STRONG&gt;^&lt;/STRONG&gt;. Только числа - &lt;STRONG&gt;\d&lt;/STRONG&gt;. Т.к. число может состоять из множества цифр, то я добавил символ умножения – &lt;STRONG&gt;*&lt;/STRONG&gt;, чтобы сказать: от нуля и более символов. Получилось вот так:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] 3456.356345 -match "^\d*"
True
[vPodans] $matches

Name                           Value
----                           -----
0                              3456


[vPodans] $matches[0]
3456
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;я применил свой шаблон к произвольному дробному числу и оно попало под шаблон. Используя особую переменную &lt;STRONG&gt;$matches&lt;/STRONG&gt;, которая в виде массива хранит все совпадения оператора &lt;STRONG&gt;–match&lt;/STRONG&gt;, я могу извлекать ту часть сроки, которая попала под шаблон. Т.к. &lt;STRONG&gt;$matches&lt;/STRONG&gt; у нас массив, то для вставки совпавшей части в код я буду обращаться к нужному элементу этого массива. В моём случае совпадение только одно, поэтому &lt;STRONG&gt;$matches&lt;/STRONG&gt; будет массивом из единственного элемента и обращаться к его значению нужно по первому индексу, т.е. &lt;STRONG&gt;$matches[0]&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Далее, мы видим оператор &lt;STRONG&gt;And&lt;/STRONG&gt;. Здесь я тоже попал в засаду, поскольку подумал, что это аналог &lt;STRONG&gt;–AND&lt;/STRONG&gt; в PowerShell. Однако после чтения документации выяснилось, что это &lt;STRONG&gt;&lt;EM&gt;Bitwise AND&lt;/EM&gt;&lt;/STRONG&gt;, т.е. побитовый “&lt;STRONG&gt;И&lt;/STRONG&gt;”. Следовательно при портировании необходимо использовать не –AND, а &lt;STRONG&gt;–BAND&lt;/STRONG&gt;. Разница у них в том, что оба числа преобразовываются в двоичный формат и побитово выполняется операция логического умножения. Подробности здесь: &lt;A title=http://msdn.microsoft.com/en-us/library/z0zec0b2(VS.71).aspx href="http://msdn.microsoft.com/en-us/library/z0zec0b2(VS.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/z0zec0b2(VS.71).aspx&lt;/A&gt;.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;szProductKey=mid(szPossibleChars,dwAccumulator+1,1)&amp;amp;szProductKey&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;оператор &lt;STRONG&gt;MID&lt;/STRONG&gt; в VBS (как и в древнем досовском бейсике) вырезает часть строки и является аналогом метода &lt;STRONG&gt;Substring()&lt;/STRONG&gt;, который есть в PowerShell. Однако тут я жестоко попался на следующее: в PowerShell любая нумерация индексов и символов начиная с нуля. Т.е. чтобы извлечь только первый символ из строки мне нужно указать стартовый индекс ноль - &lt;STRONG&gt;0&lt;/STRONG&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] "here string".substring(0,1)
h
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;но в VBS символы в строках нумеруются начиная с единицы – &lt;STRONG&gt;1&lt;/STRONG&gt;. Те. для моего примера чтобы вырезать первый символ строки в качестве стартовой позиции нужно было указывать не &lt;STRONG&gt;0&lt;/STRONG&gt;, а &lt;STRONG&gt;1&lt;/STRONG&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;string = "here string" &lt;BR&gt;msgbox mid(string,1,1)&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Следовательно при портировании скрипта из вышеупомянутой строки убираем&amp;nbsp; “&lt;STRONG&gt;+1&lt;/STRONG&gt;”, который, видимо, был добавлен ввиду особенности нумерации символов строки в VBS. Для кого-то это может показаться пустяком, но для меня это всё было открытием, поскольку я на VBS не написал ни одного скрипта (даже который просто мапит шару при логоне) и его синтаксис для меня достаточно сложен и не всегда понятен.&lt;/P&gt;
&lt;P&gt;В остальном же я ограничился построчной трансляцией кода без каких-либо изменений с использованием аналогов PowerShell, поскольку я до конца и не разобрал алгоритм шифрования ключа. На выходе у меня получился вот такой скрипт:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#######################################################&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Get-ProductKey.ps1&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Version 1.0&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Retrieve Windows XP/2003/Vista/2008 setup key&lt;BR&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Note: not works on Windows Vista/2008 activated by KMS Server&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;# Note: translated from VBS script&lt;BR&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Vadims Podans (c) 2009&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; &lt;A href="http://www.sysadmins.lv/"&gt;&lt;FONT color=#009500&gt;http://www.sysadmins.lv/&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt;#######################################################&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Get-ProductKey&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$rpk&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Get-ItemProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;DigitalProductId&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;).DigitalProductId
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;28&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$rpkOffset&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;52&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$PossibleChars&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BCDFGHJKMPQRTVWXY2346789&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT size=2 face=Verdana&gt;do&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$j&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;14&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT size=2 face=Verdana&gt;do&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;256&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$rpk&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$j&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$rpkOffset&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;24&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-match&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;^\d*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Out-Null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$rpk&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$j&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$rpkOffset&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$matches&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-band&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;255&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;24&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$j&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;--&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            } &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;while&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$j&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-ge&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;--&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$ProductKey&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$PossibleChars&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Substring(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Accumulator&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ProductKey&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ((&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;29&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;% &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;6&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-and&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-ne&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;--&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$ProductKey&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ProductKey&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        }
    } &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;while&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$i&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-ge&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$ProductKey&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; &lt;U&gt;Данный скрипт не будет возвращать установочный ключ для VLK систем Windows Vista и Windows Server 2008, которые были активированы через KMS сервер&lt;/U&gt;. Здесь ключ будет показан только для OEM и коробочных версий. На сколько я знаю в данном случае (как у меня на нотебуке с Vista Business) при активации через KMS ключ не хранится в системе и скрипт будет возвращать буквы B:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] Get-ProductKey
BBBBB-BBBBB-BBBBB-BBBBB-BBBBB
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;объяснение этому здесь: &lt;A title=http://www.rjlsoftware.com/support/faq/sa.cfm?q=289&amp;amp;n=81 href="http://www.rjlsoftware.com/support/faq/sa.cfm?q=289&amp;amp;n=81"&gt;http://www.rjlsoftware.com/support/faq/sa.cfm?q=289&amp;amp;n=81&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;з.ы. ссылка не показывается в IE8 RC1, только верхний баннер &lt;img alt=":'(" src="/smilies/unhappy.gif"&gt; Поэтому пришлось совершить грех и воспользоваться мозиллой &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/P&gt;
&lt;P&gt;Так же можно получать установочные ключи не только для самой ОС, но и для приложений тоже (разработки Microsoft, разумеется), как Microsoft Office. Для этого достаточно изменить ветку реестра на:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;HKLM\Software\Microsoft\Office\11.0\Registration\{GUID}\DigitalProductID&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Этот путь будет справедлив для Office 2003. Где хранит этот ProductID Office 2007 я не нашёл у себя. Но вообще мысль понятна, в каком направлении искать &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/P&gt;
&lt;P&gt;Удачи!&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=69d09a83-3b32-4a67-a9eb-2fc5dc517b74"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,69d09a83-3b32-4a67-a9eb-2fc5dc517b74.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=d8c49e62-cc9b-4b7b-892c-207bfc8a82e4</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,d8c49e62-cc9b-4b7b-892c-207bfc8a82e4.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,d8c49e62-cc9b-4b7b-892c-207bfc8a82e4.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=d8c49e62-cc9b-4b7b-892c-207bfc8a82e4</wfw:commentRss>
      <title>Функции и фильтры в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,d8c49e62-cc9b-4b7b-892c-207bfc8a82e4.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,d8c49e62-cc9b-4b7b-892c-207bfc8a82e4.aspx</link>
      <pubDate>Mon, 12 Jan 2009 19:04:29 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Пока не буду больше ничего писать про новые командлеты в PowerShell V2 CTP3, а вернусь к истории - 1.0. Как показала практика, функции в скриптах администраторов завоевали очень высокую популярность и этому есть причина - функции позволяют однажды написать блок кода и потом его использовать много раз. Но не все знают всех возможностей функций и их разновидностей в PowerShell. Сегодня мы поговорим о том, на чём чаще всего спотыкаются начинающие пользователи PowerShell.&lt;/p&gt; &lt;h3&gt;&lt;/h3&gt; &lt;h1 align="center"&gt;Аргументы в функциях&lt;/h1&gt; &lt;p&gt;В общем смысле функции строятся по такому принципу:&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;FunctionName&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$arg1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$arg2&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$argN&lt;/span&gt;&lt;span style="color: #000000"&gt;) { scriptoblock }&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;сначала мы говорим, что это будет функция и даём ей имя. В скобках указываем список принимаемых аргументов и после, в фигурных скобках указываем блок кода, который будет исполняться при вызове функций. Но функция сама по себе малоинтересна. Как правило в неё передаются какие-то данные и мы их должны как-то получать внутри функции. Данные в функции мы можем передавать двумя методами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;используя список аргументов (как в указанном примере) 
&lt;li&gt;по конвейеру&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;в первом случае всё просто. Если при объявлении функции мы указываем список аргументов, то при вызове функции эти переменные будут принимать значения. Возьмём простой пример:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;abc&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$a&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$b&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$c&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$a = &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$a&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$b = &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$b&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$c = &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$c&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;}&lt;/font&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] function abc ($a, $b, $c) {
&amp;gt;&amp;gt; Write-Host '$a = ' $a
&amp;gt;&amp;gt; Write-Host '$b = ' $b
&amp;gt;&amp;gt; Write-Host '$c = ' $c
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
[vPodans] abc arg1 arg2 arg3
$a =  arg1
$b =  arg2
$c =  arg3
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Чтобы вызвать функцию - достаточно написать её название и разделяя проблелом передавать ей значения. Вот здесь кроется первая частая ошибка начинающих при работе с PowerShell. Дело в том, что в некоторых языках программирования функции вызываются иначе: &lt;em&gt;functionname (arg1, arg2, argN)&lt;/em&gt;. В PowerShell же формат вызова функций вот такой: &lt;em&gt;&lt;font color="#0000ff"&gt;functionname arg1 arg2 argN&lt;/font&gt;&lt;/em&gt;. При объявлении функции указывать список принимаемых аргументов не обязательно (но рекомендуется для читаемости скрипта). В таком случае все аргументы будут помещены в специальную переменную &lt;strong&gt;$args&lt;/strong&gt;, которая будет являться массивом аргументов. Но кроме аргументов в функции можно передавать параметры-ключи, как в командлетах (например, &lt;strong&gt;-Verbose&lt;/strong&gt;, &lt;strong&gt;-WhatIf&lt;/strong&gt; и т.д.). Это делается при помощи указания типа аргумента. Данный тип называется &lt;strong&gt;[switch]&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;abc&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$a&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$b&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$parameter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$a = &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$a&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$b = &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$b&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;parameter switch status = &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$parameter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] function abc ($a, $b, [switch]$parameter) {
&amp;gt;&amp;gt; Write-Host '$a = ' $a
&amp;gt;&amp;gt; Write-Host '$b = ' $b
&amp;gt;&amp;gt; Write-Host 'parameter switch status = ' $parameter
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
[vPodans] abc 1 5 -parameter
$a =  1
$b =  5
parameter switch status =  True
[vPodans] abc 1 5
$a =  1
$b =  5
parameter status =  False
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;это очень удобно, когда одним ключом по аналогии с командлетом можно выбирать режим работы функции. Просто в фнукции проверяете статус ключа &lt;strong&gt;True&lt;/strong&gt; или &lt;strong&gt;False&lt;/strong&gt; и в зависимости от этого выбираете режим.&lt;/p&gt;
&lt;h1 align="center"&gt;Конвейер и функции&lt;/h1&gt;
&lt;p&gt;Но часто нам удобней передавать данные в функцию для обработки по конвейеру. И мы безусловно можем так делать. Но тут есть свои тонкости. &lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] function sum {$_ * 2}
[vPodans] 1..5 | sum
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Мы захотели просто умножить каждое число на 2. Но результата нету. Это вторая частая ошибка начинающих пользователей, которые путают функцию с конвейерным циклом &lt;strong&gt;Foreach-Object&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] function sum {$_ * 2}
[vPodans] 1..5 | %{sum}
2
4
6
8
10
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;а вот теперь получили ожидаемый результат. Дело в том, что в функцию данные поступают не по мере появления их на входе конвейера, а только когда конвейер будет заполнен. Пока конвейер наполняется данными, они помещаются в специальную переменную &lt;strong&gt;$input&lt;/strong&gt; в виде массива. И только после этого начинает исполняться само тело функции. Смотрим:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] function input {$input}
[vPodans] 1..5 | input
1
2
3
4
5
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Однако, данный метод очень непроизводителен, когда требуется произвести некоторую операцию над каждым элементом конвейера. Поскольку мы должны сначала ждать, пока по конвейеру будут собраны все данные в переменную &lt;strong&gt;$input&lt;/strong&gt; и только потом начнётся сама обработка. Т.к. переменная &lt;strong&gt;$input&lt;/strong&gt; является массивом, то мы не можем прямо к ней использовать переменную текущего элемента &lt;strong&gt;$_&lt;/strong&gt;. Как вариант, можно в самой функции разобрать переменную &lt;strong&gt;$input&lt;/strong&gt; циклом и получить требуемый результат:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] function sum {$input | %{$_ * 2}}
[vPodans] 1..5 | sum
2
4
6
8
10
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Задача хоть и решена, но кроме потери производительности у нас ещё вырос объём кода. Что тоже не есть хорошо. Чтобы избавиться от переменной $input можно использовать этап функции - Process. Что это такое и с чем его едят можно узнать из замечательного поста &lt;a target="_blank" href="http://dmitrysotnikov.wordpress.com"&gt;Дмитрия Сотникова&lt;/a&gt; - &lt;a target="_blank" href="http://dmitrysotnikov.wordpress.com/2008/11/26/input-gotchas/"&gt;$input Gotchas&lt;/a&gt;. Материал по ссылке изложен достаточно подробно и он будет понятен даже тем, у кого есть хотя бы базовые навыки английского языка. Итак:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] function sum {process {$_ * 2}}
[vPodans] 1..5 | sum
2
4
6
8
10
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;на этапе Process мы отказываемся в дополнительном разборе переменной &lt;strong&gt;$input&lt;/strong&gt;, поскольку этап Process уже начинает исполняться при поступлении первого элемента на вход конвейера. Следовательно мы получаем выигрыш в скорости работы. Но для таких вещей, как обработка каждого элемента в функции в PowerShell есть одна разновидность функции и называется &lt;strong&gt;фильтр&lt;/strong&gt;! По сути фильтр является той же функцией, которая помещена в цикл &lt;strong&gt;Foreach-Object&lt;/strong&gt;. Фильтры в PowerShell используются так же, как и функции:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;FilterName&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$arg1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$arg2&lt;/span&gt;&lt;span style="color: #000000"&gt;) {scriptoblock}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] filter sum {$_ * 2}
[vPodans] 1..5 | sum
2
4
6
8
10
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;это то же самое, что и:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;[vPodans] function sum {$_ * 2}
[vPodans] 1..5 | %{sum}
2
4
6
8
10
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Как видите, вариантов решений задачи в функциях существует много и каждый может использовать тот, что ему по душе. Можно сказать, что это мелочи? Да, можно. Но именно вот такие мелочи будут влиять на эстетическую красоту, &lt;u&gt;производительность и ресурсопотребление&lt;/u&gt; ваших скриптов в работе. Причём &lt;strong&gt;&lt;u&gt;разница в производительности и ресурсопотреблении может доходить до 100(!) раз&lt;/u&gt;&lt;/strong&gt;, в зависимости от выбранного метода. Об этом я уже говорил в своём предыдущем блоге на примере циклов: &lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!273.entry"&gt;Foreach, Foreach-Object и оптимизация циклов в PowerShell&lt;/a&gt;.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=d8c49e62-cc9b-4b7b-892c-207bfc8a82e4"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,d8c49e62-cc9b-4b7b-892c-207bfc8a82e4.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b0e82900-ae06-4f83-90cf-ee893271cdfa</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b0e82900-ae06-4f83-90cf-ee893271cdfa.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b0e82900-ae06-4f83-90cf-ee893271cdfa.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b0e82900-ae06-4f83-90cf-ee893271cdfa</wfw:commentRss>
      <title>PowerShell V2 и Software Restriction Policies</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b0e82900-ae06-4f83-90cf-ee893271cdfa.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b0e82900-ae06-4f83-90cf-ee893271cdfa.aspx</link>
      <pubDate>Tue, 06 Jan 2009 07:19:18 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Как моим читателям известно я недавно репортил баг на connect (подробности здесь - &lt;A href="http://www.sysadmins.lv/PermaLink,guid,9c8bf74b-9535-49af-ba92-fa727fc7c67c.aspx"&gt;Первые впечатления от PowerShell V2 CTP3&lt;/A&gt;) и сегодня получил ответ следующего содержания (если кто-то не может туда попасть):&lt;/P&gt;
&lt;BLOCKQUOTE style="MARGIN-RIGHT: 0px" dir=ltr&gt;
&lt;P&gt;&lt;EM&gt;Software restriction policies intentionally apply to PowerShell scripts now in V2&lt;BR&gt;Posted by &lt;STRONG&gt;Microsoft&lt;/STRONG&gt; on 2009.01.05. at 10:49&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;следовательно это теперь не баг, а фича. Фича by design. Ещё раз ссылка на connect:&lt;/P&gt;
&lt;P&gt;&lt;A title=https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=389878&amp;amp;SiteID=99 href="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=389878&amp;amp;SiteID=99"&gt;https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=389878&amp;amp;SiteID=99&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;И в моём предыдущем посте по этой проблеме временный workaround следует считать постоянным. Я сильно надеюсь, что к релизу подготовят документацию по этому вопросу. И мне до сих пор не ясно, будут ли сделаны какие-то изменения в самой политике SRP (ведь блокируемого расширения &lt;STRONG&gt;.ps1&lt;/STRONG&gt; в списке политики SRP нету). Я считаю, что они должны произведены, чтобы не было никаких неизвестностей при настройке политики. Как это будет реализовано - время покажет. Но для тех, кто планирует использовать PowerShell V2 и Software Restriction Policies будет полезно это знать. Неприятно, конечно же, но что поделать.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b0e82900-ae06-4f83-90cf-ee893271cdfa"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b0e82900-ae06-4f83-90cf-ee893271cdfa.aspx</comments>
      <category>PowerShell</category>
      <category>Security</category>
      <category>Security / SRP</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=d56a1d9c-6474-4f4e-8a2b-9b16334ec503</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=d56a1d9c-6474-4f4e-8a2b-9b16334ec503</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Обзор новых командлетов PowerShell V2 CTP3 - Active Directory/Workgroup</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</link>
      <pubDate>Mon, 05 Jan 2009 13:35:10 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Продолжая цикл постов о новых командлетах в PowerShell V2 CTP3 хочу рассказать про несколько командлетов для управлением компьютера как клиента в домене Active Directory или рабочей группе. Отмечу сразу, что эти командлеты не управляют доменом Active Directory, а только компьютером-клиентом домена (не знаю, как по-русски правильно сформулировать мысль). По сути эти командлеты повторяют аналог утилиты netdom.exe и вот их список:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Add-Computer&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Remove-Computer&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Rename-Computer&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Reset-ComputerMachinePassword&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Test-ComputerSecureChannel&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;и ещё 2 на закуску:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Restart-Computer&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Stop-Computer&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ну и как обычно - рассмотрим каждый из них:&lt;/p&gt; &lt;p&gt;1) &lt;strong&gt;Add-Computer&lt;/strong&gt; - добавляет компьютер к домену Active Directory или перемещает компьютер между рабочими группами (Workgroup). Данный командлет содержит следующие параметры и ключи:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-ComputerName&lt;/strong&gt; - параметр. Имя компьютера, который нужно включить в домен или рабочую группу. Можно указывать как NetBIOS имена, так и FQDN (Fully Qualified Domain Name) и IP адреса компьютеров. Для локального компьютера можно использовать точку ( &lt;strong&gt;.&lt;/strong&gt; ) или &lt;strong&gt;localhost&lt;/strong&gt; или не указывать этот параметр совсем, поскольку по умолчанию будет использовать именно локальная машина. Так же можно указывать несколько компьютеров перечисляя их через запятую. Имена можно передавать в командлет по конвейеру по свойству ComputerName.  &lt;li&gt;&lt;strong&gt;-Credential&lt;/strong&gt; - параметр. Учётные данные для аутентификации в домене или на удалённых компьютерах рабочей группы. Формат учётных данных такой же, как и в подключениях WMI. Для этого можно использовать командлет &lt;strong&gt;Get-Credential&lt;/strong&gt;. Данный параметр следует использовать только при необходимости использования альтернативных учётных данных. Если не указан, то будут использоваться учётные данные текущего пользователя.  &lt;li&gt;&lt;strong&gt;-DomainName&lt;/strong&gt; - параметр. DNS имя домена, куда будет подключаться компьютер. Этот параметр является обязательным при подключении к домену.  &lt;li&gt;&lt;strong&gt;-WorkgroupName&lt;/strong&gt; - параметр. Название рабочей группы, в которую перемещается компьютер. Обязателен при переводе компьютера из одной рабочей группы в другую.  &lt;li&gt;&lt;strong&gt;-OUPath&lt;/strong&gt; - параметр. Если заранее учётная запись компьютера заранее не создана в AD, то указание этого параметра позволяет добавить компьютер в нужный OU с созданием учётной записи в нём. Если этот параметр не указан, то компьютер будет помещён в контейнер по умолчанию - &lt;strong&gt;CN Computers&lt;/strong&gt;. Так же этот параметр не нужно указывать при перемещении компьютера между рабочими группами.  &lt;li&gt;&lt;strong&gt;-Server&lt;/strong&gt; - параметр. Используется только при подключении к домену. Позволяет выбирать контроллер домена, который будет производить ввод компьютера в домен и установку пароля компьютера в домене. Параметр опциональный и может иметь смысл при добавлении машин в домен в удалённых сайтах. Указывается в формате &lt;strong&gt;DomainName\DCName&lt;/strong&gt;.  &lt;li&gt;&lt;strong&gt;-Unsecure&lt;/strong&gt; - ключ. Операция по вводу компьютера в домен или рабочую группу будет производиться без установки защищённого канала между клиентом и сервером (контроллером домена). В домене с жёсткими политиками безопасности данный ключ может дать сбой.  &lt;li&gt;&lt;strong&gt;-Reboot&lt;/strong&gt; - ключ. Как известно любое изменение местоположения компьютера в сети (ввод в домен, вывод из домена, смена рабочей группы) требуют перезагрузки машины.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; может показаться, что ключ &lt;strong&gt;-Reboot&lt;/strong&gt; очень полезный, но мне так не кажется. И вот почему. Если командлет сам не перезагружает машину после завершения операции, то это нужно сделать вручную. Но перезагружать машину можно только в случае если всё прошло успешно. Но если по каким-то причинам ожидаемый результат не был достигнут, то компьютер будет перезагружен в пустую. Я на этом не настаиваю, но мне это видится именно так.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Hint:&lt;/font&gt;&lt;/strong&gt; не забывайте, что если указываются позиционные параметры, то их имена указывать не обязательно. Например, ComputerName позиционно является первым параметром и если указывать за командлетом сразу имена компьютеров, то название параметра -ComputerName можно и не указывать.&lt;/p&gt; &lt;p&gt;По умолчанию данный командлет не выводит результат на экран, поэтому для вывода результата исполнения можно использовать ключи &lt;strong&gt;-PassThru&lt;/strong&gt; или &lt;strong&gt;-Verbose&lt;/strong&gt;. Так же командлет имеет такие полезные ключи как &lt;strong&gt;-Confirm&lt;/strong&gt; для ручного подтверждения выполнения операции и &lt;strong&gt;-WhatIf&lt;/strong&gt; для моделирования работы командлета. И несколько примеров использования командлета:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Add-Computer -DomainName contoso.com -Credential (Get-Credential) -OUPath OU=Test,OU="3th floor",DC=Contoso,DC=com -Reboot&lt;br&gt;Add-Computer -ComputerName (Get-Content Comps.txt) -WorkgroupName MSHome -PassThru&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;2) &lt;strong&gt;Remove-Computer&lt;/strong&gt; - удаляет компьютер из домена или рабочей группы. Содержит параметры &lt;strong&gt;-ComputerName&lt;/strong&gt;, &lt;strong&gt;-Credential&lt;/strong&gt; (учётные данные пользователя, который имеет право на вывод машины из домена или локального администратора, если компьютер перемещается в рабочих группах), &lt;strong&gt;-Reboot&lt;/strong&gt;, &lt;strong&gt;-Confirm&lt;/strong&gt;, &lt;strong&gt;-PassThru&lt;/strong&gt; и &lt;strong&gt;-WhatIf&lt;/strong&gt;. Правила использования этих параметров и ключей такие же, что и для Add-Computer, но только в контексте удаления, а не ввода машины во что-то. Пример:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Remove-Computer -ComputerName computer1, computer2 -Credential contoso.com\Administrator -PassThru -Reboot&lt;font color="#000000"&gt; - выводит компьютер из домена. Следует учесть, что при выполнении команды будет запрошен пароль учётной записи, указанной в Credential.&lt;/font&gt;&lt;br&gt;Remove-Computer MyComputer&lt;/font&gt; - просто удаляет компьютер из рабочей группы (интересно, куда? &lt;img alt=":-D" src="/smilies/openmouth.gif"&gt; )&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;/font&gt; ни в коем случае не удаляйте так контроллеры домена. Их сначала нужно понизить до роли рядового сервера командой dcpromo и только потом с помощью UI, netdom или командлета Remove-Computer выводить из домена.&lt;/p&gt; &lt;p&gt;3) &lt;strong&gt;Rename-Computer&lt;/strong&gt; - переименовывает компьютер или компьютеры в рабочей группе или домене Active Directory. Обычно использует следующие параметры: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-ComputerName&lt;/strong&gt; - имя компьютера, которые нужно переименовать. Можно не указывать, если переименовывается локальный компьютер. Если компьютер находится в домене, то следует указывать его полное FQDN имя. Не поддерживает указание нескольких компьютеров, только одного.  &lt;li&gt;&lt;strong&gt;-NewComputerName&lt;/strong&gt; - новое имя компьютера. Если машина находится в домене, то переименовывается и её учётная запись.  &lt;li&gt;&lt;strong&gt;-Credential&lt;/strong&gt; - учётные данные. &lt;u&gt;&lt;font color="#ff0000"&gt;Данный параметр является обязательным при переименовании удалённых компьютеров-членов домена&lt;/font&gt;&lt;/u&gt; (кроме переименовывания локального компьютера).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;так же командлет содержит такие ключи как &lt;strong&gt;-Confirm&lt;/strong&gt;, &lt;strong&gt;-Reboot&lt;/strong&gt; и &lt;strong&gt;-WhatIf&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;/font&gt; ни в коем случае не пытайтесь этим командлетом переименовать контроллер домена!&lt;/p&gt; &lt;p&gt;4) &lt;strong&gt;Reset-ComputerMachinePassword&lt;/strong&gt; - сбрасывает пароль учётной записи компьютера в базе Active Directory. Используется только для доменных компьютеров. Данный командлет можно использовать при трудностях аутентификации компьютера в домене или при устаревании пароля. Несколько типичных случаев, когда требуется сброс пароля компьютера - компьютер не аутентифицировался в домене более 30 или 60 дней, в зависимости от настроек домена; компьютер был восстановлен из бэкапа (SystemState), срок которого старше 30 или 60 дней или компьютер был восстановлен из образа без дополнительного восстановления актуального SystemState и другие случаи.. Подробности этой темы выходят за рамки этого поста.&lt;/p&gt; &lt;p&gt;Из актуальных параметров содержит &lt;strong&gt;-ComputerName&lt;/strong&gt; (можно указывать несколько компьютеров. Допускаются FQDN, NetBIOS имена или IP адреса), &lt;strong&gt;-Server&lt;/strong&gt; - имя контроллера домена, который будет производить сброс пароля (не обязательный параметр) и &lt;strong&gt;-Credental&lt;/strong&gt; - имя пользователя, который имеет права сброса паролей указанных компьютеров. Из ключей можно выделить такие как &lt;strong&gt;-Confirm&lt;/strong&gt; и &lt;strong&gt;-WhatIf&lt;/strong&gt;. Общий синтаксис такой:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Reset-ComputerMachinePassword (get-content comp.txt) &lt;/font&gt;- переустановит пароль всех компьютеров из списка comp.txt&lt;br&gt;&lt;font color="#0000ff"&gt;Reset-ComputerMachinePassword&lt;/font&gt; - переустановит пароль текущего компьютера&lt;br&gt;&lt;font color="#0000ff"&gt;Reset-ComputerMachinePassword -Server dc1.contoso.com -Credential (Get-Credential) -Confirm&lt;/font&gt; - переустановит пароль локального компьютера на контроллере домена с именем DC1 и с вводом альтернативных учётных записей. После запуска потребует подтверждения операции.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;5) &lt;strong&gt;Test-ComputerSecureChannel&lt;/strong&gt; - проверяет возможность установки безопасного канала между клиентом и сервером. Работает только в домене и возвращает &lt;strong&gt;True&lt;/strong&gt; или &lt;strong&gt;False&lt;/strong&gt;. Имеет один параметр и ключ:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-Server&lt;/strong&gt; - параметр. Имя компьютера в домене (допускается использовать FQDN, NetBIOS имена или IP адрес). Допускается указание только одного компьютера, с которым хотите проверить работоспособность безопасного канала. Параметр обязательный, поскольку нету смысла проверять защищённый канал с самим собой &lt;img alt=":)" src="/smilies/happy.gif"&gt;  &lt;li&gt;&lt;strong&gt;-Repair&lt;/strong&gt; - ключ. Если команда выводит False, то при указании этого ключа команда будет пытаться восстановить его.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;И содержит дополнительные ключи как -&lt;strong&gt;Confirm&lt;/strong&gt; и &lt;strong&gt;-WhatIf&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Я не придумал к какой категории присвоить эти 2 командлета и решил их описать здесь. Кстати, очень удобные командлеты:&lt;/p&gt; &lt;p&gt;6) &lt;strong&gt;Restart-Computer&lt;/strong&gt; и &lt;strong&gt;Stop-Computer&lt;/strong&gt;. Первый командлет перезагружает локальный или удалённый компьютер (или несколько), а второй выключает их совсем. Это очень полезно, поскольку я видел как минимум 5 различных решений перезагрузки/выключения компьютеров в скриптах PowerShell. Как правило это либо WMI, либо использование штатного shutdown.exe (кстати говоря, я им пользуюсь всегда) либо ещё что-нибудь. Теперь можно будет этот момент стандартизировать. Много говорить про них не буду, а скажу только, что эти командлеты используют метод &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394058(VS.85).aspx"&gt;Win32Shutdown&lt;/a&gt; WMI класса &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394239.aspx"&gt;Win32_OperatingSystem&lt;/a&gt;. Следовательно эти командлеты обладают всеми новыми возможностями, которые описаны в предыдущей статье: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx"&gt;Обзор новых командлетов PowerShell V2 CTP3 - WMI&lt;/a&gt;. Одно из преимуществ - можно использовать фоновую работу. Скажем, отправить в ребут сотню компьютеров и пока это всё происходит спокойно работать в консоли (шутка &lt;img alt=":)" src="/smilies/happy.gif"&gt; ). Поэтому в этих командлетах можно использовать такие параметры и ключи как -AsJob, Impersonate, Authentication, ComputerName и другие. Из уникальных отмечу один параметр:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-ThrottleLimit&lt;/strong&gt; - указывает количество одновременных удалённых подключений для конкретно этой команды. Если компьютеров будет много в этой команде, то чтобы не загружать сеть можно ограничить, скажем, по 10-20 одновременных подключений. По умолчанию максимум одновременно установлено 32 подключения.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;и ключ:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-Force&lt;/strong&gt; - без комментариев. Точнее перезагружает или выключает компьютер без спроса, форсирует закрытие всех приложений, что может быть риском потери данных, если они в этот момент не были сохранены.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;На сегодня вроде всё. Вроде ничего не пропустил.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=d56a1d9c-6474-4f4e-8a2b-9b16334ec503"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=2a531ba4-0af2-47f7-9d17-e310eb527f2e</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=2a531ba4-0af2-47f7-9d17-e310eb527f2e</wfw:commentRss>
      <title>Обзор новых командлетов PowerShell V2 CTP3 - WMI</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</link>
      <pubDate>Sun, 04 Jan 2009 18:37:15 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Windows Management Instrumentarion или просто WMI в PowerShell V2 так же претерпел изменения, а точнее дополнения по сравнению с версией 1.0. Я планирую более подробно описать новые и обновлённые параметры командлета &lt;strong&gt;Get-WMIObject&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;1) &lt;strong&gt;-List&lt;/strong&gt; - ключ. Позволяет получать список классов для системы или список свойств и методов для конкретного класса:&lt;/p&gt; &lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] Get-WmiObject -List


   NameSpace: ROOT\cimv2

Name                                Methods              Properties
----                                -------              ----------
__NotifyStatus                      {}                   {StatusCode}
__ExtendedStatus                    {}                   {Description, Operation, ParameterInfo, ProviderName...}
Win32_PrivilegesStatus              {}                   {Description, Operation, ParameterInfo, PrivilegesNotHeld...}
Win32_JobObjectStatus               {}                   {AdditionalDescription, Description, Operation, ParameterIn...
__SecurityRelatedClass              {}                   {}
__Trustee                           {}                   {Domain, Name, SID, SidLength...}
Win32_Trustee                       {}                   {Domain, Name, SID, SidLength...}
__NTLMUser9X                        {}                   {Authority, Flags, Mask, Name...}
....&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;По умолчанию, без указания других параметров, параметр &lt;strong&gt;-List&lt;/strong&gt; выводит список классов, которые расположены в контейнере по умолчанию &lt;strong&gt;Root\CimV2&lt;/strong&gt;. Но можно указывать и другие контейнеры при помощи параметра &lt;strong&gt;-NameSpace&lt;/strong&gt;. Например:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;Get-WmiObject -Namespace root\default -List&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Или для конкретного класса:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] Get-WmiObject Win32_share -List | select * | fl


Name             : Win32_Share
__GENUS          : 1
__CLASS          : Win32_Share
__SUPERCLASS     : CIM_LogicalElement
__DYNASTY        : CIM_ManagedSystemElement
__RELPATH        : Win32_Share
__PROPERTY_COUNT : 10
__DERIVATION     : {CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER         : THOR
__NAMESPACE      : ROOT\cimv2
__PATH           : \\THOR\ROOT\cimv2:Win32_Share
Path             : \\THOR\ROOT\cimv2:Win32_Share
Derivation       : {CIM_LogicalElement, CIM_ManagedSystemElement}
Methods          : {Create, SetShareInfo, GetAccessMask, Delete}
Scope            : System.Management.ManagementScope
Options          : System.Management.ObjectGetOptions
ClassPath        : \\THOR\ROOT\cimv2:Win32_Share
Properties       : {AccessMask, AllowMaximum, Caption, Description...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers       : {CreateBy, DeleteBy, dynamic, Locale...}
Site             :
Container        :



[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;здесь мы видим доступные методы (Create, SetShareInfo и другие), а так же свойства объекта класса (AccessMask, AllowMaximum, Caption и другие). Можно и более подробно посмотреть методы или свойства объекта:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;Get-WmiObject Win32_share -List | %{$_.methods}&lt;/font&gt; - получение подробных сведений о методах объекта класса&lt;br&gt;&lt;font color="#0000ff"&gt;Get-WmiObject Win32_share -List | %{$_.properties}&lt;/font&gt; - получение подробных сведений о свойствах объекта класаа&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Кстати говоря, в PowerShell 1.0 параметр &lt;strong&gt;-List&lt;/strong&gt; не работал для конкретных классов, а только для перечисления самих классов. Т.е. приведённые выше 2 команды в 1.0 не работают. Теперь этот недостаток исправлен.&lt;/p&gt;
&lt;p&gt;2) &lt;strong&gt;-AsJob&lt;/strong&gt; - ключ. Позволяет выполнять команду в фоновом режиме. Это новая возможность в PowerShell V2, которая позволяет запускать некоторые команды в фоновом режиме не блокируя при этом саму консоль. Коллега, &lt;a target="_blank" href="http://xaegr.wordpress.com/"&gt;Вася Гусев&lt;/a&gt;, уже делал скринкаст по фоновым работам в PowerShell (и не только о них) на &lt;a target="_blank" href="http://www.techdays.ru/Lecture.aspx?LID=28c60ac7-f774-45ca-9ff9-2f774d2fd70b"&gt;TechDays.ru&lt;/a&gt; (потребуется авторизация с помощью LiveID или OpenID). И я так же планирую обсудить в своём блоге этот вопрос в обозримом будущем.&lt;/p&gt;
&lt;p&gt;3) &lt;strong&gt;-Authentication&lt;/strong&gt; - параметр. Позволяет задавать уровень аутентификации к удалённой машине. Возможные уровни аутентификации могут быть:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-1&lt;/strong&gt; &lt;em&gt;(Unchanged)&lt;/em&gt; - я не смог найти описание этому уровню, но он в Windows XP/Windows Server 2003 используется для локальных подключений на себя. 
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; &lt;em&gt;(Default)&lt;/em&gt; - необходимый уровень будет согласовываться между сервером и клиентом в зависимости от настроек Windows Authentication. 
&lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; &lt;em&gt;(None)&lt;/em&gt; - не использует аутентификацию. Все уровни безопасности будут проигнорированы. Не следует использовать этот уровень, поскольку с ним аутентифицироваться не удастся (разве что в случае разрешённых анонимных подключений на сервере).
&lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; &lt;em&gt;(Connect)&lt;/em&gt; - клиент аутентифицируется только при установке подключения. После установки подключения аутентификационные данные не проверяются. 
&lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; &lt;em&gt;(Call)&lt;/em&gt; - пересылаемые учётные данные проверяются при каждом запросе клиента. Учётные данные криптографически подписываются, но не шифруются. Пересылаемые данные во время сессии не подписываются и не шифруются. Гарантируется, что во время пересылки аутентификационных данных они не были никоим образом изменены.
&lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; &lt;em&gt;(Packet)&lt;/em&gt; - похож на уровень &lt;strong&gt;Call&lt;/strong&gt; с учётом того, что сервер проверяет что данные пришли от ожидаемого клиента. Так же учётные данные подписываются и не шифруются. Данные не подписываются и не шифруются (используется по умолчанию при сетевых подключениях). 
&lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; &lt;em&gt;(PacketIntegrity)&lt;/em&gt; - подписываются как учётные данные, так и сами пересылаемые данные. Данный уровень гарантирует, что с момента отправки от клиента до получения данных сервером любые данные не были изменены. Но данные (в том числе учётные) по прежнему не шифруются. 
&lt;li&gt;&lt;strong&gt;6&lt;/strong&gt; &lt;em&gt;(PacketPrivacy)&lt;/em&gt; - все передаваемые данные между клиентом и сервером подписываются и шифруются.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;В версии 1.0 можно было изменять уровни аутентификации, но там были свои сложности. Например, при первом подключении нельзя было указывать свой уровень аутентификации, а только при последующих обращениях к серверу. Например так:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;$a = Get-WmiObject Win32_share -filter "Name = 'sharename'"&lt;br&gt;$a.PSBase.Scope.Options.Authentication = 6&lt;/font&gt;&lt;font color="#000000"&gt; или &lt;/font&gt;&lt;font color="#0000ff"&gt;PacketPrivacy&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;4) &lt;strong&gt;-Authority&lt;/strong&gt; - параметр. Позволяет клиенту выбирать, кто будет его аутентифицировать (например, LSA удалённой машины или сервер Active Directory) при указании параметра &lt;strong&gt;-Credentials&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;5) &lt;strong&gt;-DirectRead&lt;/strong&gt; - ключ. Если указывается, то производится прямой доступ к классу без привязки к нему более высших или производных классов. Реальной пользы я тут пока что не вижу.&lt;/p&gt;
&lt;p&gt;6) &lt;strong&gt;-Impersonation&lt;/strong&gt; - параметр. В этом параметре можно указывать уровень имперсонализации при удалённых подключениях. Может иметь следующие значения:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; &lt;em&gt;(Default)&lt;/em&gt; - так же не смог найти описания для него. Во всяком случае в самом WMI такой уровень нигде не определён и скорее всего это какой-то производный уровень из нескольких внутри самого PowerShell. 
&lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; &lt;em&gt;(Anonymous)&lt;/em&gt; - При указании этого уровня учётные данные клиента скрываются. По факту WMI в современных версиях ОС скорее всего не поддерживает этот уровень, а переводит его в уровень &lt;strong&gt;Identify&lt;/strong&gt; и использует его для имперсонализации клиента. В Windows 2000 было так, во всяком случае. Да и особого смысла в нём нету, поскольку с таким уровнем ничего сделать не удастся в общем смысле. 
&lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; &lt;em&gt;(Identify)&lt;/em&gt; - позволяет объектам запрашивать учётные данные вызывающего пользователя, но не использовать их. Следовательно удалённый объект не сможет установить вас в контексте безопасности (т.е. подтвердить, что вы именно тот за кого себя выдаёте). С таким уровнем обычно можно только прочитать ACL списки объектов (и то не всегда), но не более. 
&lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; &lt;em&gt;(Impersonate)&lt;/em&gt; - позволяет объектам использовать учётные данные вызывающего пользователя. Это в свою очередь позволяет пользователю использовать свои учётные данные для произведения любых операций над объектами в пределах прав пользователя на этот объект (обычно эти права задаются ACL списками). Данный уровень используется в PowerShell по умолчанию. Поэтому для использования уровня &lt;strong&gt;Impersonate&lt;/strong&gt; данный параметр указывать не обязательно. 
&lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; &lt;em&gt;(Delegate)&lt;/em&gt; - это уровень транзитивной делегации учётных данных. Это позволяет удалённым объектам передавать ваши учётные данные другим объектам на других машинах. Иными словами, когда пользователь с машины &lt;strong&gt;A&lt;/strong&gt; подключается к машине &lt;strong&gt;B&lt;/strong&gt;, то в этом случае используется уровень &lt;strong&gt;Impersonate&lt;/strong&gt; между &lt;strong&gt;A&lt;/strong&gt; и &lt;strong&gt;B&lt;/strong&gt;. Но если для завершения операции объекту с машины &lt;strong&gt;B&lt;/strong&gt; нужно получить ещё объект с машины &lt;strong&gt;C&lt;/strong&gt;, то &lt;strong&gt;Delegate&lt;/strong&gt; позволит машине &lt;strong&gt;B&lt;/strong&gt; аутентифицироваться на машине &lt;strong&gt;C&lt;/strong&gt; с учётными данными, которые были получены от машины &lt;strong&gt;A&lt;/strong&gt;. Если совсем грубо, то пользователь просто разрешает запрашиваемым объектам использовать его учётные записи для своих нужд. Безусловно, это большой риск, когда объект может распоряжаться полученными учётными данными как хочет, поэтому все пользователи и компьютеры, которые будут участвовать в транзакции (например, пользователь и компьютеры &lt;strong&gt;A&lt;/strong&gt;, &lt;strong&gt;B&lt;/strong&gt; и &lt;strong&gt;C&lt;/strong&gt;) должны быть помечены как &lt;strong&gt;Trusted For Delegation&lt;/strong&gt; в &lt;strong&gt;Active Directory&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;В версии 1.0 так же можно было изменять уровень имперсонализации с теми же сложностями, которые были и у параметра &lt;strong&gt;Authentication&lt;/strong&gt;. А именно - нельзя было изменять этот уровень при первом подключении к WMI. Делалось это так:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;$a = Get-WmiObject Win32_share -filter "Name = 'sharename'"&lt;br&gt;$a.PSBase.Scope.Options.Impersonation = 4&lt;/font&gt; или &lt;font color="#0000ff"&gt;Delegate&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;7) &lt;strong&gt;-EnableAllPrivileges&lt;/strong&gt; - ключ. Данный ключ включает все привилегии безопасности (семейство &lt;strong&gt;SeSecurity Privilege&lt;/strong&gt;), которыми обладает пользователь. Я уже не раз отмечал, что при работе в системе из графической оболочки Explorer, &lt;strong&gt;LSA&lt;/strong&gt; &lt;em&gt;(Local Security Authority)&lt;/em&gt; прозрачно для пользователя включает привилегии при необходимости. Однако, в целях безопасности для скриптов LSA по умолчанию не включает их. Привилегии безопасности нужны для многих операций, как смена владельца объектов, редактирования списков ACL множества объектов, выполнение критических для системы операции как удаление журналов событий, восстановления системы из точек восстановления и т.д. И только WMI нам предлагает интерфейс для их использования. Причём теперь это делается простым указанием ключа при использовании командлета &lt;strong&gt;Get-WmiObject&lt;/strong&gt;. В общем смысле в версии 1.0 нельзя было из скриптов включать привилегии, хотя по факту данный функционал был заложен и активно использовался:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;$a = Get-WmiObject Win32_share -filter "Name = 'sharename'"&lt;br&gt;$a.PSBase.Scope.Options.EnablePrivileges = $true&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;В этом отношении PowerShell является менее безопасным, чем, к примеру, VBS, который позволяет включать только необходимые привилегии безопасности (например для смены владельца объекта только &lt;strong&gt;SeRestorePrivilege&lt;/strong&gt; и &lt;strong&gt;SeTakeOwnershipPrivilege&lt;/strong&gt;). Причём VBS может очень гибко работать с подключаемыми привилегиями, что делает код более безопасным. В PowerShell они включаются все сразу и отдельные привилегии включать нельзя.&lt;/p&gt;
&lt;p&gt;Вот, в принципе и рассмотрели основые полезные и интересные нововведения в командлет &lt;strong&gt;Get-WmiObject&lt;/strong&gt; для работы с WMI в PowerShell V2 CTP3. Я допускаю, что эти параметры к релизу вряд ли претерпят существенные изменения и будут справедливы и в финальной версии V2.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=2a531ba4-0af2-47f7-9d17-e310eb527f2e"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb</wfw:commentRss>
      <title>Обзор новых командлетов PowerShell V2 CTP3 - SystemRestore</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</link>
      <pubDate>Sat, 03 Jan 2009 11:45:20 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;В версии 2.0 появились командлеты, которые позволяют в однострочном режиме управлять параметрами восстановления системы. В них входят:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Get-ComputerRestorePoint&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;Checkpoint-Computer&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;Restore-Computer&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;Enabe-ComputerRestore&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;Disable-ComputerRestore&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Мой вариант костылей для версии 1.0 описан здесь: &lt;A href="http://www.sysadmins.lv/PermaLink,guid,6b653dd4-47f2-41b2-b13e-284c1270acd8.aspx"&gt;SystemRestore и PowerShell&lt;/A&gt;. По сути в версии 1.0 доступно большинство функционала V2, но только в виде самописных функций, в V2 уже есть всё (или почти всё) в коробке. Для работы этих командлетов так же потребуются клиентские версии ОС Windows XP/Windows Vista. Посмотрим их попорядку:&lt;/P&gt;
&lt;P&gt;1) &lt;STRONG&gt;Get-ComputerRestorePoint&lt;/STRONG&gt; - получает список доступных точек восстановления.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Get-ComputerRestorePoint &lt;EM&gt;490&lt;/EM&gt;&lt;/FONT&gt; - 490 - опциональный параметр, который позволяет получить сведения о конкретной точке восстановления.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-ComputerRestorePoint

CreationTime           Description                    SequenceNumber    EventType         RestorePointType
------------           -----------                    --------------    ---------         ----------------
2008.12.29. 21:14:04   Windows Installer installed... 490               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2008.12.29. 21:56:01   Windows Update                 491               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2008.12.29. 21:58:55   Windows Update                 492               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2008.12.31. 1:38:08    Windows Update                 493               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2009.01.01. 21:53:49   Windows Installer installed... 494               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2009.01.01. 22:03:01   Windows Installer installed... 495               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2009.01.02. 1:38:06    Windows Update                 496               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2009.01.02. 19:45:27   Windows Installer installed... 497               BEGIN_SYSTEM_C... APPLICATION_INSTALL


[System32] Get-ComputerRestorePoint 490 | select *


__GENUS          : 2
__CLASS          : SystemRestore
__SUPERCLASS     :
__DYNASTY        : SystemRestore
__RELPATH        : SystemRestore.SequenceNumber=490
__PROPERTY_COUNT : 5
__DERIVATION     : {}
__SERVER         : THOR
__NAMESPACE      : root\default
__PATH           : \\THOR\root\default:SystemRestore.SequenceNumber=490
CreationTime     : 20081229191404.400068-000
Description      : Windows Installer installed Quest PowerGUI 1.5.3.
EventType        : 100
RestorePointType : 0
SequenceNumber   : 490
Scope            : System.Management.ManagementScope
Path             : \\THOR\root\default:SystemRestore.SequenceNumber=490
Options          : System.Management.ObjectGetOptions
ClassPath        : \\THOR\root\default:SystemRestore
Properties       : {CreationTime, Description, EventType, RestorePointType...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers       : {dynamic}
Site             :
Container        :



[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Если посмотреть внимательней, то можно легко заметить, что данный командлет (как и все остальные, которые относятся к SystemRestore) реализован через тот же WMI класс &lt;A target=_blank href="http://msdn.microsoft.com/en-us/library/aa378951.aspx"&gt;SystemRestore&lt;/A&gt;. Поэтому на эти командлеты будут накладываться ограничения, которые накладывает этот класс. Это и версия ОС и права доступа. В данном случае для работы с командлетами восстановления системы нужны права администратора и для Windows Vista - проход запроса UAC.&lt;/P&gt;
&lt;P&gt;2) &lt;STRONG&gt;Checkpoint-Computer&lt;/STRONG&gt; - создаёт новую точку восстановления. Синтаксис командлета может быть такой:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Checkpoint-Computer -RestorePointType Application_Install -Description CustomDescription&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;-RestorePointType&lt;/STRONG&gt; может иметь следующие значения:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;APPLICATION_INSTALL 
&lt;LI&gt;APPLICATION_UNINSTALL 
&lt;LI&gt;DEVICE_DRIVER_INSTALL 
&lt;LI&gt;MODIFY_SETTINGS 
&lt;LI&gt;CANCELLED_OPERATION&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;-Description&lt;/STRONG&gt; может иметь любое значение, поскольку это будет всего лишь описание. Но лучше использовать рекомендованные значения для описаний, которые документированы в статье MSDN: &lt;A target=_blank href="http://msdn.microsoft.com/en-us/library/aa378916(VS.85).aspx"&gt;Restore Point Description Text&lt;/A&gt;. Стандартизация в наше время - это очень важно. Время создания точки восстановления на моём нотебуке составило чуть больше минуты и на экране консоли будет такой псевдографический прогресс-бар:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellV2CTP3SystemRestore_B2EC/systemrestore_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=systemrestore src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellV2CTP3SystemRestore_B2EC/systemrestore_thumb.jpg" width=909 height=205&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;я вот тоже хочу как-нибудь научиться делать такие прогресс-бары.&lt;/P&gt;
&lt;P&gt;3) &lt;STRONG&gt;Restore-Computer&lt;/STRONG&gt; - восстанавливает компьютер до указанной точки восстановления:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Restore-Computer -RestorePoint 490 &lt;EM&gt;-Confirm -WhatIf&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;в параметре &lt;STRONG&gt;-RestorePoint&lt;/STRONG&gt; указывается номер точки восстановления, который можно получить командой &lt;STRONG&gt;Get-ComputerRestorePoint&lt;/STRONG&gt;. Данный командлет обладает ещё опциональными параметрами &lt;STRONG&gt;-Confirm&lt;/STRONG&gt;, который будет требовать подтверждения пользователя и &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt;, который будет полезен в отладочных целях.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; после успешного выполнения данной команды компьютер будет перезагружен в обязательном порядке для завершения восстановления.&lt;/P&gt;
&lt;P&gt;4) &lt;STRONG&gt;Enable-ComputerRestore&lt;/STRONG&gt; - включает режим восстановления системы для всех дисков или для определённых.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Enable-ComputerRestore &lt;EM&gt;-Drive "C:\" -WhatIf&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Параметры &lt;STRONG&gt;-Drive&lt;/STRONG&gt; и &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt; являются не обязательными. Если не указан &lt;STRONG&gt;-Drive&lt;/STRONG&gt;, то восстановление системы будет включено для всех допустимых дисков в системе.&lt;/P&gt;
&lt;P&gt;5) &lt;STRONG&gt;Disable-ComputerRestore&lt;/STRONG&gt; - отключает режим восстановления системы для всех дисков или определеённых:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Disable-ComputerRestore &lt;EM&gt;-Drive "C:\" -WhatIf&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Параметры &lt;STRONG&gt;-Drive&lt;/STRONG&gt; и &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt; являются не обязательными. Если не указан &lt;STRONG&gt;-Drive&lt;/STRONG&gt;, то восстановление системы будет отключено для всех дисков в системе.&lt;/P&gt;
&lt;P&gt;К сожалению функционал изменения настроек SystemRestore, как резервирование места для точек восстановления, время хранения, периодичность создания точек не реализован в командлетах. А ведь лишним это не будет однозначно. Поэтому в отношении CTP3 эти вещи придётся реализовывать с помощью WMI самостоятельно.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=cd4be53d-581c-4280-97f9-24ab21388325</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=cd4be53d-581c-4280-97f9-24ab21388325</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Обзор новых командлетов PowerShell V2 CTP3 - Eventlog</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</link>
      <pubDate>Fri, 02 Jan 2009 20:11:19 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;PowerShell V2 CTP3 вышел уже давно (23 декабря прошлого года), но всё никак не доходили руки осветить новые командлеты. Сегодня постараюсь рассказать о новых возможностях работы с журналами событий готовыми командлетами. Функционал этих командлетов я уже реализовывал немного раньше:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx"&gt;Управление EventLog в PowerShell с использованием .NET&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,8684b90f-8e8a-43fe-89e8-cf8194c21c3d.aspx"&gt;Управление EventLog в PowerShell с использованием WMI&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Но плюс новых командлетов в том, что это уже готовые командлеты, а не костыли в виде отдельных функций. Безусловно, ещё не всё работает как положено, но обзор уже делать можно. Итак, список командлетов:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Get-WinEvent &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;New-EventLog &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Write-EventLog &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Clear-Eventlog &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Limit-EventLog &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Remove-EventLog&lt;/STRONG&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;начнём попорядку: &lt;/P&gt;
&lt;P&gt;1) &lt;STRONG&gt;Get-WinEvent&lt;/STRONG&gt;. Данный командлет призван заменить ранее использовавшийся командлет Get-Eventlog. Синтаксис команды может быть следующий:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-WinEvent -ListLog * | ft -a

LogName                                                                   MaximumSizeInBytes RecordCount  LogMode
-------                                                                   ------------------ -----------  -------
Application                                                                         20971520       17003 Circular
DFS Replication                                                                     15532032           6 Circular
HardwareEvents                                                                      20971520           0 Circular
Internet Explorer                                                                    1052672           0 Circular
Key Management Service                                                              20971520           0 Circular
ODiag                                                                               16777216         267 Circular
OSession                                                                            16777216         544 Circular
Security                                                                            33554432       16904 Circular
System                                                                              20971520       43146 Circular
Windows PowerShell                                                                  15728640       16803 Circular
ForwardedEvents                                                                     20971520             Circular
Microsoft-Windows-Backup                                                             1052672           6 Circular
Microsoft-Windows-Bits-Client/Analytic                                               1052672             Circular
Microsoft-Windows-Bits-Client/Operational                                            1052672        2226 Circular
....&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Показ всех журналов событий в системе, включая журналы в &lt;STRONG&gt;Application and Services Logs&lt;/STRONG&gt; (для Vista/2008). Вместо звёздочки можно указать конкретный журнал событий.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; некоторые журналы, как &lt;STRONG&gt;Security&lt;/STRONG&gt; будут генерировать ошибку, если вы исполняете эту команду под обычным пользователем.&lt;/P&gt;
&lt;P&gt;Последняя колонка показывает режим очистки журнала. &lt;STRONG&gt;Circular&lt;/STRONG&gt; означает перезапись более старых событий по мере необходимости. Так же можно посмотреть список провайдеров, которые регистрируют события в журнале:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-WinEvent -ListProvider *

Name                                                        LogLinks
----                                                        --------
.NET Runtime                                                {Application}
.NET Runtime Optimization Service                           {Application}
Active Server Pages                                         {Application}
Application                                                 {Application}
Application Error                                           {Application}
Application Hang                                            {Application}
Application Management                                      {Application}
ASP.NET 1.1.4322.0                                          {Application}
ASP.NET 2.0.50727.0                                         {Application}
CardSpace 3.0.0.0                                           {Application}
Chkdsk                                                      {Application}
Crystal Reports                                             {Application}
DataDynamics ActiveBar 1.0                                  {Application}
Desktop Window Manager                                      {Application}
devenv                                                      {Application}
....&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Вот образец провайдеров. Это может быть очень удобным, когда вам нужна выборка именно логов конкретного провайдера. Делается это следующей командой:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Get-WinEvent -ProviderName "Application Hang"&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;В кавычках просто указываете поставщика событий. Сами события можно посмотреть следующим образом:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-WinEvent -ProviderName "Application Hang" -MaxEvents 1 | select *


Message              :
Id                   : 1002
Version              :
Qualifiers           : 0
Level                : 2
Task                 : 101
Opcode               :
Keywords             : 36028797018963968
RecordId             : 16431
ProviderName         : Application Hang
ProviderId           :
LogName              : Application
ProcessId            :
ThreadId             :
MachineName          : Thor
UserId               :
TimeCreated          : 2008.12.21. 17:19:47
ActivityId           :
RelatedActivityId    :
ContainerLog         : application
MatchedQueryIds      : {}
Bookmark             : System.Diagnostics.Eventing.Reader.EventBookmark
LevelDisplayName     :
OpcodeDisplayName    :
TaskDisplayName      :
KeywordsDisplayNames : {}
Properties           : {System.Diagnostics.Eventing.Reader.EventProperty, System.Diagnostics.Eventing.Reader.EventPrope
                       rty, System.Diagnostics.Eventing.Reader.EventProperty, System.Diagnostics.Eventing.Reader.EventP
                       roperty...}



[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;вот так выглядят внутренности события. Однако, свойство &lt;STRONG&gt;Message&lt;/STRONG&gt; ничего не содержит, хотя предполагается, что там должен быть текст самого эвента. Пустое оно потому что:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-WinEvent -ProviderName "Application Hang" -MaxEvents 1 | gm -MemberType noteproperty


   TypeName: System.Diagnostics.Eventing.Reader.EventLogRecord

Name    MemberType   Definition
----    ----------   ----------
Message NoteProperty  Message=null


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;в членах объекта мы видим, что свойство &lt;STRONG&gt;Message&lt;/STRONG&gt; заткнуто заглушкой (&lt;STRONG&gt;Message=null&lt;/STRONG&gt;) и оно ничего не возвращает. Но текст события можно извлечь из свойства &lt;STRONG&gt;Properties&lt;/STRONG&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] (Get-WinEvent -ProviderName "Application Hang" -MaxEvents 1).properties

Value
-----
mstsc.exe
6.0.6002.18000
ac0
01c9637bc8453f5e
8
{67, 0, 114, 0...}


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;текст тут невнятный совсем. Для некоторых событий он возвращает такой же текст, что и в графическом журнале событий (и которые корректно отображаются командлетом Get-EventLog). Те события, которые не показывает корректно Get-EventLog в новом командлете уже не показывают ничего.&amp;nbsp; Тут вся надежда на разработчиков, что они наконец-то сделают возможность полностью видеть тексты всех эвентов журнала событий, в противном случае придётся снова забивать костыли с помощью адского WMI. Но тут следует обратить внимание на параметр MaxEvents. Без его указания поиск только нескольких событий (например, первых 10 с использованием &lt;STRONG&gt;Select -First 10&lt;/STRONG&gt;) займёт значительное время, поскольку команда будет работать пока весь журнал не будет прочёсан. Этот параметр является аналогом параметра -&lt;STRONG&gt;Newest&lt;/STRONG&gt; для &lt;STRONG&gt;Get-EventLog&lt;/STRONG&gt;. Поэтому если вы хотите посмотреть только часть событий, то используйте этот параметр. В общем смысле это выглядит так:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;старая нотация: &lt;FONT color=#0000ff&gt;Get-EventLog application -Source "Application Hang" -Newest 5&lt;/FONT&gt; 
&lt;LI&gt;новая нотация: &lt;FONT color=#0000ff&gt;Get-WineVent -ProviderName "Application Hang" -MaxEvents 5&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;И ещё одно хорошее отличие нового командлета - теперь не обязательно указывать журнал для поиска. Вы можете указать только поставщика событий и количество событий для вывода. Это очень удобно.&lt;/P&gt;
&lt;P&gt;Следовательно можно судить, что новый командлет Get-WinEvent является значимо более лучшим, чем прежний Get-EventLog. Хотя его применимость в настоящее время весьма сомнительна, поскольку работу с текстом событий так никто и не сделал.&lt;/P&gt;
&lt;P&gt;2) &lt;STRONG&gt;New-EventLog&lt;/STRONG&gt;. Нетрудно догадаться, что этот командлет создаёт новый журнал событий:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;New-EventLog -LogName "Custom EventLog" -Source "Custom Source"&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] New-EventLog -LogName "Custom EventLog" -Source "Custom Source"
[System32] Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  20 480      0 OverwriteAsNeeded      17 011 Application
     512      7 OverwriteOlder              0 Custom EventLog
  15 168      0 OverwriteAsNeeded           6 DFS Replication
  20 480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder              0 Internet Explorer
  20 480      0 OverwriteAsNeeded           0 Key Management Service
  16 384      0 OverwriteAsNeeded         267 ODiag
  16 384      0 OverwriteAsNeeded         544 OSession
  32 768      0 OverwriteAsNeeded      16 908 Security
  20 480      0 OverwriteAsNeeded      43 162 System
  15 360      0 OverwriteAsNeeded      16 920 Windows PowerShell


[System32] Get-WinEvent -ListProvider "custom Source"

Name                                                        LogLinks
----                                                        --------
Custom Source                                               {Custom EventLog}


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Всё очень просто. Внизу я сделал проверку, что наш провайдер событий успешно зарегистрировался и он будет писать только в журнал &lt;STRONG&gt;Custom EventLog&lt;/STRONG&gt;. Так же можно и добавлять события (поставщиков) к существующим журналам. Для этого в параметре &lt;STRONG&gt;-LogName&lt;/STRONG&gt; нужно указать существующий журнал.&lt;/P&gt;
&lt;P&gt;3) &lt;STRONG&gt;Write-Eventlog&lt;/STRONG&gt;. Так же по смыслу можно догадаться, что данный командлет добавляет записи в журнал событий. Общий синтаксис его такой:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Write-EventLog -LogName "Custom EventLog" -Source "Custom Source" -EntryType Information -EventID 1 -Message "Привет мир!"&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;EntryType может иметь следующие значения: &lt;STRONG&gt;Error, Warning, Information, SuccessAudit, FailureAudit&lt;/STRONG&gt;. Об этом я уже говорил ранее &lt;A target=_blank href="http://www.sysadmins.lv/PermaLink,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx"&gt;здесь&lt;/A&gt;. Смотрим:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[[System32] Write-EventLog -LogName "Custom EventLog" -Source "Custom Source" -EntryType Information -EventID 1 -Message
"Привет мир!"
[System32] Get-WinEvent -ProviderName "Custom source"

TimeCreated                   ProviderName                                             Id Message
-----------                   ------------                                             -- -------
2009.01.02. 21:05:06          Custom Source                                             1


[System32] Get-WinEvent -ProviderName "Custom source" | select *


Message              :
Id                   : 1
Version              :
Qualifiers           : 0
Level                : 4
Task                 : 1
Opcode               :
Keywords             : 36028797018963968
RecordId             : 1
ProviderName         : Custom Source
ProviderId           :
LogName              : Custom EventLog
ProcessId            :
ThreadId             :
MachineName          : Thor
UserId               :
TimeCreated          : 2009.01.02. 21:05:06
ActivityId           :
RelatedActivityId    :
ContainerLog         : custom eventlog
MatchedQueryIds      : {}
Bookmark             : System.Diagnostics.Eventing.Reader.EventBookmark
LevelDisplayName     :
OpcodeDisplayName    :
TaskDisplayName      :
KeywordsDisplayNames : {}
Properties           : {System.Diagnostics.Eventing.Reader.EventProperty}



[System32] (Get-WinEvent -ProviderName "custom source").Properties

Value
-----
Привет мир!


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Первой строкой мы создали новое событие в журнале, второй посмотрели общую сводку по провайдеру &lt;STRONG&gt;Custom Source&lt;/STRONG&gt;, которого мы создали ранее. В нём уже зарегистрировано одно событие, которое мы посмотрели в расширенном виде. И последней строкой посмотрели текст созданного события.&lt;/P&gt;
&lt;P&gt;Спросите вы, какая польза от этого, ведь кроме программистов это мало кому нужно? А польза есть от него. Для примера можно взять резервное копирование. Например, у администратор регулярно выполняются скрипты, которые делают резервное копирование данных. И создав нового провайдера или новый журнал администратор может в скрипт добавить код, который будет лог копирования помещать в журнал событий помимо стандартной процедуры отправки лога к себе на почту. Это может оказаться очень удобным! Так же данный командлет содержит параметр &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt;, который следует использовать в отладочных целях.&lt;/P&gt;
&lt;P&gt;4) &lt;STRONG&gt;Clear-EventLog&lt;/STRONG&gt;. Очистка журнала:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Clear-EventLog -LogName "Custom EventLog"&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;тут всё проще постого. Указываете имя журнала и очищаем его:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Clear-EventLog "Custom EventLog"
[System32] Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  20 480      0 OverwriteAsNeeded      17 011 Application
     512      7 OverwriteOlder              0 Custom EventLog
  15 168      0 OverwriteAsNeeded           6 DFS Replication
  20 480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder              0 Internet Explorer
  20 480      0 OverwriteAsNeeded           0 Key Management Service
  16 384      0 OverwriteAsNeeded         267 ODiag
  16 384      0 OverwriteAsNeeded         544 OSession
  32 768      0 OverwriteAsNeeded      16 908 Security
  20 480      0 OverwriteAsNeeded      43 165 System
  15 360      0 OverwriteAsNeeded      16 920 Windows PowerShell


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Во второй строчке мы уже видим, что нами созданный журнал очистился от тестового сообщения. Данный командлет содержит параметр -&lt;STRONG&gt;WhatIf&lt;/STRONG&gt;, который следует использовать в отладочных целях.&lt;/P&gt;
&lt;P&gt;5) &lt;STRONG&gt;Limit-EventLog&lt;/STRONG&gt;. Позволяет изменять размер журнала и политику перезаписи журнала. Общий синтаксис такой:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Limit-EventLog -LogName "Custom EventLog" -MaximumSize 64mb -OverflowAction OverWriteOlder -RetentionDays 10&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Limit-EventLog -LogName "Custom EventLog" -MaximumSize 64mb -OverflowAction OverWriteOlder -RetentionDays 10
[System32] Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  20 480      0 OverwriteAsNeeded      17 011 Application
  65 536     10 OverwriteOlder              0 Custom EventLog
  15 168      0 OverwriteAsNeeded           6 DFS Replication
  20 480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder              0 Internet Explorer
  20 480      0 OverwriteAsNeeded           0 Key Management Service
  16 384      0 OverwriteAsNeeded         267 ODiag
  16 384      0 OverwriteAsNeeded         544 OSession
  32 768      0 OverwriteAsNeeded      16 908 Security
  20 480      0 OverwriteAsNeeded      43 165 System
  15 360      0 OverwriteAsNeeded      16 920 Windows PowerShell


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Здесь мы задали размер журнала в 64 мегабайта и политику перезаписи старых логов старше 10 дней.&lt;/P&gt;
&lt;P&gt;6) &lt;STRONG&gt;Remove-EventLog&lt;/STRONG&gt;. Удаляет журнал событий или провайдера событий:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Remove-EventLog -Source "Custom Source"&lt;/FONT&gt; - удаляет провайдера событий из системы&lt;BR&gt;&lt;FONT color=#0000ff&gt;Remove-EventLog -LogName "Custom EventLog"&lt;/FONT&gt; - удаляет указанный журнал из системы&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;И этот командлет содержит параметр &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;В принципе, есть ещё командлет &lt;STRONG&gt;Remove-Event&lt;/STRONG&gt;, который должен позволять удалять события из журналов событий, но мне пока что не удалось заставить его работать. Но вообще удаление эвентов из журналов событий - плохая и порочная практика, которая ни к чему хорошему не приведёт.&lt;/P&gt;
&lt;P&gt;Вот мы и рассмотрели все новые командлеты в PowerShell V2 CTP3, которые относятся к работе с журналами событий (эвентлогами). В самом начале поста я привёл ссылки, на альтернативные решения, которые повторяют функционал этих командлетов для версии 1.0, но и даже умеют немножко больше (например, архивация и ротация архивов эвентлогов). В целом можно оценить позитив от новых командлетов, которые позволяют нам более удобным способом работать с журналами событий. Но всё равно нужно ждать рабочего решения, который смог бы получать тексты сообщений из журналов Windows Vista/Windows Server 2008, поскольку без него все эти нововведения мало кому будут нужны. Вобщем, как-то так.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=cd4be53d-581c-4280-97f9-24ab21388325"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=9c8bf74b-9535-49af-ba92-fa727fc7c67c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,9c8bf74b-9535-49af-ba92-fa727fc7c67c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,9c8bf74b-9535-49af-ba92-fa727fc7c67c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=9c8bf74b-9535-49af-ba92-fa727fc7c67c</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>Первые впечатления от PowerShell V2 CTP3</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,9c8bf74b-9535-49af-ba92-fa727fc7c67c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,9c8bf74b-9535-49af-ba92-fa727fc7c67c.aspx</link>
      <pubDate>Mon, 29 Dec 2008 20:38:01 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Как и ожидалось - негативные. Я не знаю почему, но я настолько привык к версии 1.0, что V2 уже стал отвергать на подсознательном уровне, отрицая все потенциальные преимущества V2. Да, в 1.0 много чего не было сделано, приходилось конструировать собственные костыли, чтобы получить нужный результат, но 1.0 казался как-то роднее и приятней. Я тянул до последнего и вчера совершил героическое обновление PowerShell 1.0 до V2 CTP3. При этом следовал чётким инструкциям ReleaseNotes - корректно деинсталлировал версию 1.0 и потом установил V2 CTP3. Баг был обнаружен мною уже при втором запуске консоли или через 1 минуту после установки.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Суть проблемы:&lt;/STRONG&gt; на своём ноутбуке с Windows Vista SP1 я использую Software Restriction Policies и действие по умолчанию Disallowed. Для необходимых путей добавлены исключения с действием Unrestricted и из стандартного набора удалёно расширение .chm и всё. А к чему я это всё? Вот мой второй запуск консоли PowerShell V2 CTP3 (после возвращения политики SRP в исходное состояние):&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;Windows PowerShell V2 (Community Technology Preview - Features Subject to Change)
Copyright (C) 2008 Microsoft Corporation. All rights reserved.

&lt;FONT color=#ff0000&gt;File D:\Users\vpodans\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 cannot be loaded because its executi
on is blocked by software restriction policies. For more information, contact your system administrator.
At line:1 char:2
+ . &amp;lt;&amp;lt;&amp;lt;&amp;lt;  'D:\Users\vpodans\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1'
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException&lt;/FONT&gt;

PS C:\Users\vPodans&amp;gt; Get-ExecutionPolicy
RemoteSigned
PS C:\Users\vPodans&amp;gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;С dot sourced скриптами дела обстояли так же:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;PS C:\Users\vPodans&amp;gt; "Get-Date" | Set-Content -Path .\date.ps1
PS C:\Users\vPodans&amp;gt; Get-Content .\date.ps1
Get-Date
PS C:\Users\vPodans&amp;gt; . .\date.ps1
&lt;FONT color=#ff0000&gt;File C:\Users\vPodans\date.ps1 cannot be loaded because its execution is blocked by software restriction policies. For
more information, contact your system administrator.
At line:1 char:2
+ . &amp;lt;&amp;lt;&amp;lt;&amp;lt;  .\date.ps1
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException
&lt;/FONT&gt;
PS C:\Users\vPodans&amp;gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Любые попытки исполнения файлов скриптов завершились ничем. Первым делом я проверил настройки политик SRP и убедился, что расширения PS1 нету. Причём все файлы скриптов замечательно открываются по двойному клику в PowerGUI и в системном журнале Application никаких записей об этом не зарегистрировано. Далее я попробовал включить расширенное логирование работы Software Restriction Policies:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;reg.exe add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers" /v LogFileName /d saferlog.txt&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;и попробовал снова запустить консоль PowerShell. В итоге я получил файл примерно такого содержания:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;svchost.exe (PID = 1152) identified C:\Windows\system32\consent.exe as Unrestricted using path rule, Guid = {191cd7fa-f240-4a17-8986-94d480a6c8ca}&lt;BR&gt;svchost.exe (PID = 856) identified C:\Windows\system32\DllHost.exe as Unrestricted using path rule, Guid = {191cd7fa-f240-4a17-8986-94d480a6c8ca}&lt;BR&gt;svchost.exe (PID = 856) identified C:\Windows\system32\DllHost.exe as Unrestricted using path rule, Guid = {191cd7fa-f240-4a17-8986-94d480a6c8ca}&lt;BR&gt;svchost.exe (PID = 1152) identified C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe as Unrestricted using path rule, Guid = {191cd7fa-f240-4a17-8986-94d480a6c8ca}&lt;BR&gt;powershell.exe (PID = 2688) identified D:\Users\Administrator\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 as Disallowed using default rule, Guid = {11015445-d282-4f86-96a2-9e485f593302}&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Первой строчкой отображена попытка запуска запуска приложения с повышенными привилегиями. Далее (самая последняя строчка) видно, что файл профиля (&lt;EM&gt;Microsoft.PowerShell_profile.ps1&lt;/EM&gt;) был действительно блокирован политикой. Но на каком основании блокирован и почему нету соответствующей записи в журнале Application мне до сих пор неизвестно. Я так же произвёл аудит доступа к файлу профиля, но там ничего подозрительного не увидел. Вобщем вот такие дела, господа. 
&lt;P&gt;&lt;STRONG&gt;Решение:&lt;/STRONG&gt; в качестве временного решения в политику SRP было добавлено 2 исключения: 
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#0000ff&gt;%HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Personal%WindowsPowerShell/*.ps1&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;%HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Personal%WindowsPowerShell/PowerTab/*.ps1&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Для этих двух правил уровень нужно выставить &lt;STRONG&gt;Unrestricted&lt;/STRONG&gt;. Ради интереса я попробовал выставить уровень Basic User и что интересно - PS1 файлы так же блокируются, как и при отсутствии этих дополнительных исключений!&lt;/P&gt;
&lt;P&gt;Я не знаю, что такого там натворили разработчики PowerShell в CTP3 (я не знаю, была ли такая проблема в более ранних CTP версиях или нет), но мне кажется тут попахивает не просто какой-то ошибкой в коде, а нечто более глобальным, что загрузка PS1 файлов каким-то образом ловится и отшивается политиками Software Restriction Policies. Заодно можно посетовать на практически отсутствующие инструменты отслеживания работы политик SRP &lt;img alt=":'(" src="/smilies/unhappy.gif"&gt; (расширенное логирование не сильно помогает в этом деле). Если у кого-то есть возможность повторить ситуацию (работа PowerShell V2 CTP3 с работающей политикой SRP), то отпишитесь в комментах о результатах. Если данный баг подтвердится, то не забудьте подтвердить его здесь:&lt;/P&gt;
&lt;P&gt;&lt;A title=https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=389878&amp;amp;SiteID=99 href="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=389878&amp;amp;SiteID=99"&gt;https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=389878&amp;amp;SiteID=99&lt;/A&gt;&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=9c8bf74b-9535-49af-ba92-fa727fc7c67c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,9c8bf74b-9535-49af-ba92-fa727fc7c67c.aspx</comments>
      <category>PowerShell</category>
      <category>Security</category>
      <category>Security / SRP</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=19807b07-c178-4bfd-ab85-1201c5639ebe</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,19807b07-c178-4bfd-ab85-1201c5639ebe.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,19807b07-c178-4bfd-ab85-1201c5639ebe.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=19807b07-c178-4bfd-ab85-1201c5639ebe</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Байты, килобайты, мегабайты и гигабайты</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,19807b07-c178-4bfd-ab85-1201c5639ebe.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,19807b07-c178-4bfd-ab85-1201c5639ebe.aspx</link>
      <pubDate>Tue, 23 Dec 2008 22:00:36 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В PowerShell есть замечательная возможность нативно оперировать с этими префиксами. Достаточно написать размер в килобайтах или мегабайтах, PowerShell автоматически переведёт его в байты:&lt;/p&gt; &lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] 5kb
5120
[vPodans] 10mb
10485760
[vPodans] 40gb
42949672960
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Видите, все значения сами переводятся в байты. Особо не перестарайтесь, потому что &lt;strong&gt;TB&lt;/strong&gt; не является константой и автоматически не преобразовывается. Но когда мы собираем информацию о системе, например, объём физической памяти или жёстких дисков средствами WMI, то данные обычно указываются в байтах и приходится вручную их как-то переводить в килобайты, мегабайты или гигабайты. Штатного функционала для решения данной задачи нету, поэтому приходится использовать примерно такой ход:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;2048&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;/&lt;/span&gt;&lt;span style="color: #000000"&gt; 1kb).tostring(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;F00&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;и в результате мы получим число 2. Мы 2048 байт разделили на килобайты, чтобы получить значение в килобайтах (если делим на 1MB, то значение получим в мегабайтах соответственно) с округлением до целого числа. Для округления до определённого знака после запятой, то в скобках нужно указать точность, например:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] (20000 / 1kb).tostring("F00")
20
[vPodans] (20000 / 1kb).tostring("F01")
19,5
[vPodans] (20000 / 1kb).tostring("F02")
19,53
[vPodans] (20000 / 1kb).tostring("F03")
19,531
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;используя эти данные можно написать простенькую функцию, которая будет делать обратное преобразование. Причём она это будет делать автоматически, т.е. сама выбирать в чём отображать значение, в байтах, килобайтах, мегабайтах или гигабайтах. Критерии выбора префикса очень простые - числа от 1 до 1000. Если число выше, то увеличиваем префикс до тех пор, пока не получим число от 1 до 1000. Например, 10485760 делим на 1kb и получаем 10240 килобайт. Такое представление не очень понятное. Поэтому мы ещё раз разделим на 1kb и получим цифру 10, но префикс уже будет - мегабайты. Вот такую функцию предложил Rob Campbell на ньюсгруппах (я её немного подрихтовал, чтобы выглядела более элегантно):&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;to_kmg&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$precision&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Bytes&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;KB&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;MB&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;GB&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;TB&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)) {
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; ((&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1024&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-or&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$i&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;TB&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)){
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt;).tostring(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;F0&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;$precision&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt; $i&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;        } &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;font size="2" face="Verdana"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$bytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;/=&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;&lt;font size="2" face="Verdana"&gt; 1KB
        }
    }
}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;функция просто по очереди перебирает префиксы и проверяет, чтобы число было в пределах от 0 до 1024 (для двоичной системы мне кажется, что лучше использовать именно 1024, а не 1000). Если нет (а оно значит больше, чем 1024), то добавляем следующий префикс и уменьшаем число снова на 1024. Вот так просто это делается. Попробуем проверить функцию на примерах, которые были показаны в самом начале поста:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] function to_kmg ($bytes, [int]$precision = 0) {
&amp;gt;&amp;gt; foreach ($i in ("Bytes","KB","MB","GB","TB")) {
&amp;gt;&amp;gt;     if (($bytes -lt 1000) -or ($i -eq "TB")){
&amp;gt;&amp;gt;         $bytes = ($bytes).tostring("F0" + "$precision")
&amp;gt;&amp;gt;         return $bytes + " $i"
&amp;gt;&amp;gt;         } else {
&amp;gt;&amp;gt;             $bytes /= 1KB
&amp;gt;&amp;gt;         }
&amp;gt;&amp;gt;     }
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
[vPodans] to_kmg 5120
5 KB
[vPodans] to_kmg 10485760
10 MB
[vPodans] to_kmg 42949672960
40 GB
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Второй аргумент (&lt;strong&gt;$precision&lt;/strong&gt;) позволяет указывать точность значения в знаках после запятой. Вот почти и всё. Однако, есть одно "но". &lt;u&gt;WMI некоторые размеры отдаёт не в байтах (как для дисков), а в килобайтах (как для физической памяти)&lt;/u&gt;. Поэтому для работы этой функции аргумент $bytes должен быть либо точного размера в байтах, либо с явным указанием префикса (например, 100kb).&lt;/p&gt;
&lt;p&gt;Кстати говоря, тут будет полезным почитать по двоичным и десятичным префиксом. Порядок применения префиксов описан в документе IEC-60027-2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SI_prefix"&gt;http://en.wikipedia.org/wiki/SI_prefix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Binary_prefix"&gt;http://en.wikipedia.org/wiki/Binary_prefix&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;По этим ссылкам достаточно понятно объясняется что такое десятичный префикс и двоичный, а так же и проблемы их использования в компьютерной технике.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=19807b07-c178-4bfd-ab85-1201c5639ebe"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,19807b07-c178-4bfd-ab85-1201c5639ebe.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=6b653dd4-47f2-41b2-b13e-284c1270acd8</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,6b653dd4-47f2-41b2-b13e-284c1270acd8.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,6b653dd4-47f2-41b2-b13e-284c1270acd8.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=6b653dd4-47f2-41b2-b13e-284c1270acd8</wfw:commentRss>
      <title>SystemRestore и PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,6b653dd4-47f2-41b2-b13e-284c1270acd8.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,6b653dd4-47f2-41b2-b13e-284c1270acd8.aspx</link>
      <pubDate>Mon, 22 Dec 2008 13:40:46 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;По мотивам темы на форуме - &lt;A title=http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=4255895&amp;amp;SiteID=40 href="http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=4255895&amp;amp;SiteID=40"&gt;http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=4255895&amp;amp;SiteID=40&lt;/A&gt;. PowerShell без проблем может управлять восстановлением системы - &lt;STRONG&gt;SystemRestore&lt;/STRONG&gt; средствами WMI. За это отвечает классы&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa378951.aspx" target=_blank&gt;SystemRestore&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa378955(VS.85).aspx" target=_blank&gt;SystemRestoreConfig&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; SystemRestore доступно только на клиентских версиях - Windows XP/Windows Vista. В серверных редакицях Windows Server нереализовано никак.&lt;/P&gt;
&lt;P&gt;вот так выглядит GUI окно системы восстановления в Windows Vista:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/SystemRestorePowerShell_112E2/systemrestore_2.jpg"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=475 alt=systemrestore src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/SystemRestorePowerShell_112E2/systemrestore_thumb.jpg" width=423 border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;Следует так же учесть, что эти классы не находятся в пространстве имён по умолчанию &lt;STRONG&gt;Root\Cimv2&lt;/STRONG&gt;, а в &lt;STRONG&gt;Root\Default&lt;/STRONG&gt;. Для просмотра всех точек восстановления нужно просто получить объект данного класса (&lt;U&gt;если вы работаете под управлением Windows Vista, то потребуется запустить консоль с повышенными привилегиями!&lt;/U&gt;). При получении объекта класса не забудьте указать правильный путь размещения класса в пространстве имён:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="FONT: 9pt courier new; COLOR: #fff; BACKGROUND-COLOR: black"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[System32] gwmi -Namespace "root\default" -class systemrestore


__GENUS          : 2
__CLASS          : SystemRestore
__SUPERCLASS     :
__DYNASTY        : SystemRestore
__RELPATH        : SystemRestore.SequenceNumber=473
__PROPERTY_COUNT : 5
__DERIVATION     : {}
__SERVER         : THOR
__NAMESPACE      : root\default
__PATH           : \\THOR\root\default:SystemRestore.SequenceNumber=473
CreationTime     : 20081220184403.157460-000
Description      : Scheduled Checkpoint
EventType        : 100
RestorePointType : 7
SequenceNumber   : 473
......&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;у меня этих точек восстановления несколько, поэтому я показал только первую точку. Здесь нам будут интересны следующие свойства - &lt;STRONG&gt;Description&lt;/STRONG&gt; (название точки восстановления), &lt;STRONG&gt;EventType&lt;/STRONG&gt; (тип точки восстановления) и &lt;STRONG&gt;SequenceNumber&lt;/STRONG&gt; (порядковый номер точки восстановления). Эти значения нам пригодятся для создания новых точек восстановления и отката системы до определённой точки. Если посмотреть методы класса, то получим:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="FONT: 9pt courier new; COLOR: #fff; BACKGROUND-COLOR: black"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;[System32] gwmi -Namespace "root\default" -class systemrestore | gm


   TypeName: System.Management.ManagementObject#root\default\SystemRestore

Name                MemberType   Definition
----                ----------   ----------
CreationTime        Property     System.String CreationTime {get;set;}
Description         Property     System.String Description {get;set;}
EventType           Property     System.UInt32 EventType {get;set;}
RestorePointType    Property     System.UInt32 RestorePointType {get;set
SequenceNumber      Property     System.UInt32 SequenceNumber {get;set;}
__CLASS             Property     System.String __CLASS {get;set;}
__DERIVATION        Property     System.String[] __DERIVATION {get;set;}
__DYNASTY           Property     System.String __DYNASTY {get;set;}
__GENUS             Property     System.Int32 __GENUS {get;set;}
__NAMESPACE         Property     System.String __NAMESPACE {get;set;}
__PATH              Property     System.String __PATH {get;set;}
__PROPERTY_COUNT    Property     System.Int32 __PROPERTY_COUNT {get;set;
__RELPATH           Property     System.String __RELPATH {get;set;}
__SERVER            Property     System.String __SERVER {get;set;}
__SUPERCLASS        Property     System.String __SUPERCLASS {get;set;}
ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime   ScriptMethod System.Object ConvertToDateTime();
Delete              ScriptMethod System.Object Delete();
GetType             ScriptMethod System.Object GetType();
Put                 ScriptMethod System.Object Put();


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Мы здесь не видим никаких методов, которые бы позволяли создавать и откатываться. Получив объект мы можем его только удалить. Сами методы хранятся в самом классе:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="FONT: 9pt courier new; COLOR: #fff; BACKGROUND-COLOR: black"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;[System32] [wmiclass]'\\.\root\default:systemrestore' | gm -MemberType method


   TypeName: System.Management.ManagementClass#ROOT\default\SystemRestore

Name                 MemberType Definition
----                 ---------- ----------
CreateRestorePoint   Method     System.Management.ManagementBaseObject CreateRestorePoint(System.String Description,...
Disable              Method     System.Management.ManagementBaseObject Disable(System.String Drive)
Enable               Method     System.Management.ManagementBaseObject Enable(System.String Drive, System.Boolean Wa...
GetLastRestoreStatus Method     System.Management.ManagementBaseObject GetLastRestoreStatus()
Restore              Method     System.Management.ManagementBaseObject Restore(System.UInt32 SequenceNumber)


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;вот тут и хранятся наши методы. Методы &lt;STRONG&gt;Enable&lt;/STRONG&gt; и &lt;STRONG&gt;Disable&lt;/STRONG&gt; позволяют глобально включать режим восстановления системы или отключать для определённого диска. Чтобы включить мониторинг для всей системы в целом или для конкретного диска нужно выполнить:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; объявляем класс:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;wmiclass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\.\root\default:systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; выбираем одно из нужных действий. Обратите внимание, что для изменения состояния&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; мониторинга всей системы скобки не должны быть пустые, а содержать пустые двойные кавычки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Enable(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;""&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Enable(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;c:\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Disable(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;""&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Disable(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;c:\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Для создания новой точки воспользуемся методом &lt;A href="http://msdn.microsoft.com/en-us/library/aa378847(VS.85).aspx"&gt;CreateRestorePoint&lt;/A&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;wmiclass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\.\root\default:systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.CreateRestorePoint(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;MyRestorePoint&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;100&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #000000"&gt;где &lt;STRONG&gt;MyRestorePoint&lt;/STRONG&gt; - название точки восстановления, &lt;STRONG&gt;0&lt;/STRONG&gt; - тип точки восстановления (возможные значения можно посмотреть по ссылке на MSDN) и &lt;STRONG&gt;100&lt;/STRONG&gt; - тип события. Давайте создадим новую точку восстановления:&lt;/SPAN&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="FONT: 9pt courier new; COLOR: #fff; BACKGROUND-COLOR: black"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;[System32] $sysrestore = [wmiclass]"\\.\root\default:systemrestore"
[System32] $sysrestore.CreateRestorePoint("MyRestorePoint", 0, 100)


__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ReturnValue      : 0



[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Значение &lt;STRONG&gt;RetrunValue = 0&lt;/STRONG&gt; говорит, что точка восстановления создана. Убедимся в этом:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="FONT: 9pt courier new; COLOR: #fff; BACKGROUND-COLOR: black"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;[System32] gwmi -Namespace "root\default" -class systemrestore | select -Last 1


__GENUS          : 2
__CLASS          : SystemRestore
__SUPERCLASS     :
__DYNASTY        : SystemRestore
__RELPATH        : SystemRestore.SequenceNumber=475
__PROPERTY_COUNT : 5
__DERIVATION     : {}
__SERVER         : THOR
__NAMESPACE      : root\default
__PATH           : \\THOR\root\default:SystemRestore.SequenceNumber=475
CreationTime     : 20081221183404.006675-000
Description      : MyRestorePoint
EventType        : 100
RestorePointType : 0
SequenceNumber   : 475



[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Вот теперь мы видим нашу точку восстановления с названием MyRestorePoint и её SequenceNumber стал на 1 больше. Чтобы откатиться на эту точку восстановления нужно выполнить метод Restore с указанием SequenceNumber:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;wmiclass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\.\root\default:systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sysrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Restore(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;475&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;(&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;win32_operatingsystem&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).reboot()&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Для успешного завершения восстановления точки восстановления потребуется перезагрузка системы, которую мы проводим последней строчкой. Вот так просто можно включать, отключать создавать точки восстановления и откатывать систему до их состояния. Чтобы управлять дополнительными параметрами восстановления системы, как выделение места для них, время жизни и т.д. воспользуемся соседним классом:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="FONT: 9pt courier new; COLOR: #fff; BACKGROUND-COLOR: black"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;[System32] gwmi -Namespace "root\default" -class systemrestoreconfig


__GENUS           : 2
__CLASS           : SystemRestoreConfig
__SUPERCLASS      :
__DYNASTY         : SystemRestoreConfig
__RELPATH         : SystemRestoreConfig.MyKey="SR"
__PROPERTY_COUNT  : 5
__DERIVATION      : {}
__SERVER          : THOR
__NAMESPACE       : ROOT\default
__PATH            : \\THOR\ROOT\default:SystemRestoreConfig.MyKey="SR"
DiskPercent       : 15
MyKey             : SR
RPGlobalInterval  : 86400
RPLifeInterval    : 4294967295
RPSessionInterval : 1



[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;тут всё просто. &lt;STRONG&gt;DiskPercent&lt;/STRONG&gt; показывает процент дискового пространства, которое выделяется под восстановление системы. &lt;STRONG&gt;RPGlobalInterval&lt;/STRONG&gt; показывает периодичность создания точек восстановления (&lt;U&gt;а для Windows Vista создание теневых копий&lt;/U&gt;) в секундах. &lt;STRONG&gt;RPLifeInterval&lt;/STRONG&gt; - время жизни точек восстановления (&lt;U&gt;и теневых копий для Windows Vista&lt;/U&gt;) в секундах (по умолчанию 90 дней). Эти параметры можно изменять простым переприсвоением и применением новых значений скриптметодом &lt;STRONG&gt;Put()&lt;/STRONG&gt;. К сожалению, провайдер SystemRestore не позволяет удалять точки восстановления (вообще это можно с использованием функции &lt;A href="http://msdn.microsoft.com/en-us/library/aa378934(VS.85).aspx"&gt;SRRemoveRestorePoint&lt;/A&gt;, но это уже совсем другая история программирования).&lt;/P&gt;
&lt;P&gt;Вот теперь мы готовы написать скрипт, который позволит в однострочном режиме управлять восстановлением системы.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#######################################################&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; SystemRestore.ps1&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; Version 1.0&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; Functions for System Restore management&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; Note: available for Windows XP and Windows Vista only!&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; Vadims Podans (c) 2008&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; http://www.sysadmins.lv/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt;#######################################################&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; функция для преобразования кода возврата в текстовое значение&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_SysRestore_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Action&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Action&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.ReturnValue) {
   &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Success&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   default {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unknown error $Action.ReturnValue&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
   }
}

&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; простая функция получения списка всех доступных точек восстановления в табличном виде&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Get-SystemRestore&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-STYLE: italic"&gt;-Namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;root\default&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-STYLE: italic"&gt;-class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;Select&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Description&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, @{n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Date/Time&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;;
e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;System.Management.ManagementDateTimeconverter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ToDateTime&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.CreationTime)).tostring()}},
@{n&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Point number&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; e&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.SequenceNumber}} | &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;ft&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-STYLE: italic"&gt;-AutoSize&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;}

&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; функция включения или отключения System Restore для указанного диска или, если диск не указан&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; то действие будет принято для всей системы в целом. А так же позволяет откатывать систему&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; в более раннее состояние.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Set-SystemRestoreStatus&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$arg&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; собственно, само действие включения или отключения System Restore&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Enable&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$action&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;wmiclass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\.\root\default:systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).Enable(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;$arg&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)}
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Disable&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$action&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;wmiclass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\.\root\default:systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).Disable(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;$arg&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)}
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; процесс отката системы в более раннюю точку восстановления&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Restore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$RP&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-STYLE: italic"&gt;-Namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;root\default&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-STYLE: italic"&gt;-class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.SequenceNumber &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$arg&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; проверяем, что указанная точка восстановления существует.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$RP&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если существует, то проводим процесс восстановления в указанную точку&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$action&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;wmiclass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\.\root\default:systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).Restore(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;$arg&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
        &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Performing system restore to earlier status ...&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; получаем код возврата операции&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_SysRestore_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$action&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если восстановление системы прошло успешно, то принудительно перезагружаем систему &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ($(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_SysRestore_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$action&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Success&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;To complete System Restore system will reboot in 15 sec&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;            shutdown.exe -r -t &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;15&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-f&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;            }
        }&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT face=Verdana size=2&gt;else&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Specified restore point does not found!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;        }
    }
    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Create&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$action&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;wmiclass&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\.\root\default:systemrestore&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).CreateRestorePoint(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;$arg&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;100&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)}
}
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; здесь происходит только генерация сообщения о ходе выполнения операций&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$arg&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-and&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Enable&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Disable&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-contains&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)) {
    &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Setting SystemRestore status to $status on&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$arg&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_SysRestore_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$action&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;    } &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT face=Verdana size=2&gt;else&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
    &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Setting SystemRestore status to $status on all drives: &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_SysRestore_Get-Code&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$action&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;    }
}

&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; функция для изменения настроек System Restore&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Set-SystemRestoreSetting&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$setting&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; получаем текущие настройки&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$SRSetting&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-STYLE: italic"&gt;-Namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;root\default&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-STYLE: italic"&gt;-class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;systemrestoreconfig&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; проверяем выбранный параметр, который будет изменяться&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$setting&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;DiskSpace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; т.к. дисковое место указывается в процентах, то проверяем, что указано число от 1% до 99%&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-lt&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;99&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-and&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-gt&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SRSetting&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.DiskPercent &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;        } &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT face=Verdana size=2&gt;else&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Disk space percentage must be integer and vlaue must be between 1-99&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
    }
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; установка глубины точек восстановлений. Указывается в днях. По истечении этого времени&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; точки восстановления удаляются, высвобождая место для более новых точек восстановления&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;HistoryDepth&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SRSetting&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.RPLifeInterval &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;86400&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT face=Verdana size=2&gt;    }
&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; частота автоматического создания точек восстановлений&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Frequency&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; извлекаем из заданного параметра периодичности последние 4 символа, которые образуют префикс&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; в днях или часах и выставляем множитель для получения секунд. Если это часы, то множитель будет&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; 3600, а если в днях, то множитель будет 86400 секунд&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$time&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.substring(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.length &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;4&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;4&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$time&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;hour&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sec&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;3600&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;days&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sec&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;86400&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
        }
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; извлекаем из заданного параметра периодичности все символы, чтобы получить целочисленное значение&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT face=Verdana size=2&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT face=Verdana size=2&gt; кроме последних 4, которые являются текстовыми и обозначают лишь префикс&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$SRSetting&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.RPGlobalInterval &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$sec&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.substring(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.length &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;4&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
        }
    default {&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #5f9ea0"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Parameter must be DiskSpace or HistoryDepth or Frequency&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;}
    }
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; применение новых параметров&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;&lt;FONT face=Verdana size=2&gt;$SRSetting&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;FONT face=Verdana size=2&gt;.Put()
}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Синтаксис функций может быть следующий:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Get-SystemRestore&lt;/FONT&gt; - показывает в табличном виде все существующие точки восстановления. Аргументов не принимает. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-SystemRestoreStatus Enable c:\&lt;/FONT&gt; - включает режим SystemRestore.&lt;BR&gt;где &lt;STRONG&gt;c:\&lt;/STRONG&gt; - диск, для которого включается мониторинг SystemRestore. Параметр опциональный. Если не указан, то включается для всех дисков. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-SystemRestoreStatus Disable c:\&lt;/FONT&gt; - отключает режим systemRestore.&lt;BR&gt;где &lt;STRONG&gt;c:\&lt;/STRONG&gt; - диск, для которого выключается мониторинг SystemRestore. Параметр опциональный. Если не указан, то выключается для всех дисков. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-SystemRestoreStatus Restore 5&lt;/FONT&gt; - производит откат системы до указанной точки восстановления. После отката произойдёт принудительная перезагрузка системы.&lt;BR&gt;где &lt;STRONG&gt;5&lt;/STRONG&gt; - номер точки восстановления. Номер можно получить выполнив функцию &lt;STRONG&gt;Get-SystemRestore&lt;/STRONG&gt;. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-SystemRestoreStatus Create "MyNewRestorePoint"&lt;/FONT&gt; - создаёт новую точку восстановления&lt;BR&gt;где &lt;STRONG&gt;MyNewRestorePoint&lt;/STRONG&gt; - название точки восстановления. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-SystemRestoreSetting DiskSpace 10&lt;/FONT&gt; - задаёт резервируемое место для точек восстановления в процентах от ёмкости диска.&lt;BR&gt;где &lt;STRONG&gt;10&lt;/STRONG&gt; - процент диска, которое отводится под SystemRestore. Может иметь значение от &lt;STRONG&gt;1&lt;/STRONG&gt; до &lt;STRONG&gt;99&lt;/STRONG&gt; 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-SystemRestoreSetting HistoryDepth 10&lt;/FONT&gt; - задаёт время хранения точек восстановления&lt;BR&gt;где &lt;STRONG&gt;10&lt;/STRONG&gt; - количество дней, в течении которого будут храниться точки восстановления. Более старые будут автоматически удаляться. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-SystemRestoreSetting Frequence 5days&lt;/FONT&gt; - задаёт частоту автоматического создания точек восстановления.&lt;BR&gt;где &lt;STRONG&gt;5days&lt;/STRONG&gt; - периодичность создания точек восстановления в днях. Можно указывать и в часах, например, &lt;STRONG&gt;10hour&lt;/STRONG&gt; (будет делать автоматические точки восстановления каждые 10 часов). В общем смысле сначала идёт число и потом без пробелов суффикс &lt;STRONG&gt;days&lt;/STRONG&gt; или &lt;STRONG&gt;hour&lt;/STRONG&gt;.&lt;/LI&gt;&lt;/UL&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=6b653dd4-47f2-41b2-b13e-284c1270acd8"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,6b653dd4-47f2-41b2-b13e-284c1270acd8.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=8684b90f-8e8a-43fe-89e8-cf8194c21c3d</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,8684b90f-8e8a-43fe-89e8-cf8194c21c3d.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,8684b90f-8e8a-43fe-89e8-cf8194c21c3d.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=8684b90f-8e8a-43fe-89e8-cf8194c21c3d</wfw:commentRss>
      <title>Управление EventLog в PowerShell с использованием WMI</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,8684b90f-8e8a-43fe-89e8-cf8194c21c3d.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,8684b90f-8e8a-43fe-89e8-cf8194c21c3d.aspx</link>
      <pubDate>Tue, 09 Dec 2008 20:00:42 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В &lt;a href="http://www.sysadmins.lv/PermaLink,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx"&gt;предыдущей&lt;/a&gt; части мы рассмотрели возможности управления журналами событий средствами .NET Framework, а так же рассмотрели проблематику использования .NET (из моего предыдущего блога) - &lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!212.entry"&gt;Странности Get-Eventlog&lt;/a&gt; и не совсем богатый функционал. В этом посте мы разберём данный вопрос, но с использованием WMI и все примеры будут выполняться системе под управлением Windows Vista.&lt;/p&gt; &lt;p&gt;В WMI за журнал событий отвечают следующие классы:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394225(VS.85).aspx"&gt;Win32_NTEventlogFile&lt;/a&gt;  &lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394226(VS.85).aspx"&gt;Win32_NTLogEvent&lt;/a&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif"&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394227(VS.85).aspx"&gt;Win32_NTLogEventComputer&lt;/a&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif"&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394228(VS.85).aspx"&gt;Win32_NTLogEventLog&lt;/a&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif"&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394229(VS.85).aspx"&gt;Win32_NTLogEventUser&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;WMI, как и .NET поддерживает удалённую работу с использованием ключа &lt;em&gt;-ComputerName&lt;/em&gt;, поэтому на этом заострять внимание не будем. За публикацию списка журналов в системе отвечает класс &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394225(VS.85).aspx"&gt;Win32_NTEventlogFile&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;&lt;p&gt;[vPodans] gwmi Win32_NTEventlogFile

                     FileSize LogfileName                   Name                                        NumberOfRecords
                     -------- -----------                   ----                                        ---------------
                      8458240 Application                   C:\Windows\System32\Winevt...                         16154
                        69632 DFS Replication               C:\Windows\System32\Winevt...                             6
                        69632 HardwareEvents                C:\Windows\System32\Winevt...                             0
                        69632 Internet Explorer             C:\Windows\System32\Winevt...                             0
                        69632 Key Management Service        C:\Windows\System32\Winevt...                             0
                        69632 ODiag                         C:\Windows\System32\Winevt...                           267
                      1118208 OSession                      C:\Windows\System32\Winevt...                           524
                     20975616 System                        C:\Windows\System32\Winevt...                         42472
                     12652544 Windows PowerShell            C:\Windows\System32\Winevt...                         14208


[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Стандартная процедура вывода списка журналов в системе. А теперь и сами эвенты:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;&lt;p&gt;[vPodans] gwmi win32_ntlogevent -filter "logfile='application'" | select -first 1


Category          : 0
Category String   :
Event Code        :
Event Identifier  :
Type Event        :
Insertion Strings :
Log File          :
Message           : The User Profile Service has started successfully.


Record Number     :
Source Name       :
Time Generated    :
Time Written      :
Type              : Information
User Name         :



[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;как бы информации не сильно много. Давайте немного приведём вид в более оперативный:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;&lt;p&gt;[vPodans] gwmi win32_ntlogevent -filter "logfile='application'" | select recordnumber, timegenerated, sourcename, eventc
ode, message -first 1 | ft -a

recordnumber timegenerated             sourcename                              eventcode message
------------ -------------             ----------                              --------- -------
           1 20070710111520.000000-000 Microsoft-Windows-User Profiles Service      1531 The User Profile Service ha...


[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;уже более читабельно, кроме вывода даты. Чтобы подвести вывод даты и времени в формат &lt;strong&gt;[datetime]&lt;/strong&gt; нужно воспользоваться конвертером времени:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Management.ManagementDateTimeconverter&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ToDateTime&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;20070710111520.000000-000&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="color: #000000"&gt;Чтобы привести итоговый вывод времени в укороченный формат даты и времени к данному выражению достаточно применить метод &lt;strong&gt;ToString()&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #000000"&gt;([&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Management.ManagementDateTimeconverter&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ToDateTime&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;20070710111520.000000-000&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)).ToString()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] [System.Management.ManagementDateTimeconverter]::ToDateTime("20070710111520.000000-000")

otrdiena, 2007. gada 10. julija 14:15:20


[vPodans] ([System.Management.ManagementDateTimeconverter]::ToDateTime("20070710111520.000000-000")).ToString()
10.07.07. 14:15:20
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;А теперь всё сделаем так (с использованием хэш-таблиц), чтобы это всё на лету преобразовывалось и мы получили сразу готовый и более опрятный вывод:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;font size="2"&gt;&lt;span style="color: #800080"&gt;$a&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;win32_ntlogevent&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;logfile='application'&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-first&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;span style="color: #800080"&gt;$a&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;recordnumber&lt;/span&gt;&lt;span style="color: #000000"&gt;, @{n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;timegenerated&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color: #000000"&gt;;
e&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;{([&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Management.ManagementDateTimeconverter&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;ToDateTime&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color: #000000"&gt;.timegenerated)).tostring()}},
sourcename, eventcode, message | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ft&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AutoSize&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] $a =  gwmi win32_ntlogevent -filter "logfile='application'" | select -first 1
[vPodans] $a | Select recordnumber, @{n="timegenerated";
&amp;gt;&amp;gt; e={([System.Management.ManagementDateTimeconverter]::ToDateTime($_.timegenerated)).tostring()}},
&amp;gt;&amp;gt; sourcename, eventcode, message | ft -AutoSize
&amp;gt;&amp;gt;

recordnumber timegenerated      sourcename                              eventcode message
------------ -------------      ----------                              --------- -------
           1 10.07.07. 14:15:20 Microsoft-Windows-User Profiles Service      1531 The User Profile Service has start...


[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;вот так при помощи костылей мы привели вывод в нечто более божеское. В остальном WMI не представляет ничего интересного, что могло бы представиться полезным (за исключением возможности бэкапа журналов, которую я разобрал в предыдущем посте). Разобрать работу &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394229(VS.85).aspx"&gt;Win32_NTLogEventUser&lt;/a&gt; и &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394227(VS.85).aspx"&gt;Win32_NTLogEventComputer&lt;/a&gt; в принципе можно уже и самостоятельно.&lt;/p&gt;
&lt;p&gt;Исходя из вышеизложенного можно понять, что WMI вариант управления эвентлогом не самый удобный и практичный. Но позволяет извлекать события из журналов Windows Vista/Windows Server 2008 в читабельном виде. При этом можно изменять различные параметры журналов событий которые описаны здесь: &lt;a title="http://msdn.microsoft.com/en-us/library/aa394225(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa394225(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa394225(VS.85).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Изменения делаются по одной общей схеме:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;font size="2"&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_NTEventlogFile&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;logfilename = '$logfilename'&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt;.Property &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;New Property Value&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt;.Put()&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;И в качестве последнего штриха приведу замеры скорости работы с эвентлогом с использованием .NET и WMI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows Server 2003&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[user name] (measure-command {gwmi win32_ntlogevent -filter "logfile='application' and eventcode=8194"}).totalseconds
13.0865344
[user name] (measure-command {(new-object diagnostics.eventlog("application")).Entries | ? {$_.EventID -eq 8194}}).totalseconds
20.7334336
[user name]&lt;/span&gt;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Windows Vista:&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] (measure-command {gwmi win32_ntlogevent -filter "logfile='application' and eventcode=8194"}).totalseconds
18,0120719
[vPodans] (measure-command {(new-object diagnostics.eventlog("application")).Entries | ? {$_.EventID -eq 8194}}).totalseconds
13,3134996
[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Как видим, для Windows Server 2003 более предпочтительным по скорости является WMI (от которого там толку не сильно много), а в Windows Vista - наоборот, .NET работает шустрее. Но из-за проблем с отображением событий журнала Security его польза в Windows Vista весьма сомнительна.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=8684b90f-8e8a-43fe-89e8-cf8194c21c3d"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,8684b90f-8e8a-43fe-89e8-cf8194c21c3d.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=093ff83e-d892-4f04-b21c-a7fa234eaccd</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=093ff83e-d892-4f04-b21c-a7fa234eaccd</wfw:commentRss>
      <title>Управление EventLog в PowerShell с использованием .NET</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx</link>
      <pubDate>Mon, 08 Dec 2008 21:58:03 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В продолжении темы работы с журналом собитый (EventLog) хочу немного рассказать об удалённой работе с EventLog и основными задачами управления. При этом хочу отметить, что у нас есть 2 различных механизма управления:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;.NET Framework&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;WMI&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Но в зависимости от архитектуры ОС оба метода обладают различными характеристиками по времени работы, отображению событий и нагрузке системы. Забегая вперёд скажу, что использование чистого .NET в Windows Server 2003 занимает хоть и немного больше времени, но загрузка процессора ниже, чем у WMI. А вот в Windows Vista .NET работает быстрее по времени и с меньшей нагрузкой на процессор. Однако, учитывая нюансы, которые изложены здесь: &lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!212.entry"&gt;Странности Get-Eventlog&lt;/a&gt; и тот факт, что командлет Get-Eventlog основан на .NET, то его применимость в условиях Windows Vista/2008 весьма сомнительна. Поэтому вариант с использованием .NET я буду писать применимо для Windows XP/2003.&lt;/p&gt; &lt;p&gt;Начнём с простого: управление журналом событий реализовано в классе &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog(VS.80).aspx"&gt;System.Diagnostics.Eventlog&lt;/a&gt;. Для перечисления списка журналов можно воспользоваться статическим методом &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/74e2ybbs(VS.80).aspx"&gt;GetEventLogs&lt;/a&gt;. Как известно, в PowerShell статические методы указываются после двойного знака двоеточия - &lt;strong&gt;::&lt;/strong&gt;&lt;/p&gt; &lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Administrator] [System.Diagnostics.EventLog]::GetEventLogs("dc1")

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16 384      0 OverwriteAsNeeded         289 Application
     512      0 OverwriteAsNeeded          45 Directory Service
     512      7 OverwriteOlder             10 DNS Server
     512      0 OverwriteAsNeeded          52 File Replication Service
 131 072      0 OverwriteAsNeeded      12 369 Security
  16 384      0 OverwriteAsNeeded         498 System
  15 360      0 OverwriteAsNeeded         625 Windows PowerShell


[Administrator]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;При этом обратите внимание на аргумент в скобках - в них можно указывать имена удалённых компьютеров для получения списка журналов с них. В данном случае я посмотрел список журналов на контроллере домена.&amp;nbsp; Чтобы получить события из журнала нужно создать объект класса System.Diagnostics.Eventlog:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Diagnostics.Eventlog&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Application&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;dc1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;В скобках первым аргументом указывается имя жрунала, а вторым аргументом - имя компьютера. Если имя не будет указано, то будет использоваться локальный компьютер:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Administrator] $EventLog = new-Object System.Diagnostics.Eventlog("Application","dc1")
[Administrator] $EventLog | gm -MemberType property


   TypeName: System.Diagnostics.EventLog

Name                 MemberType Definition
----                 ---------- ----------
Container            Property   System.ComponentModel.IContainer Container {get;}
EnableRaisingEvents  Property   System.Boolean EnableRaisingEvents {get;set;}
Entries              Property   System.Diagnostics.EventLogEntryCollection Entries {get;}
Log                  Property   System.String Log {get;set;}
LogDisplayName       Property   System.String LogDisplayName {get;}
MachineName          Property   System.String MachineName {get;set;}
MaximumKilobytes     Property   System.Int64 MaximumKilobytes {get;set;}
MinimumRetentionDays Property   System.Int32 MinimumRetentionDays {get;}
OverflowAction       Property   System.Diagnostics.OverflowAction OverflowAction {get;}
Site                 Property   System.ComponentModel.ISite Site {get;set;}
Source               Property   System.String Source {get;set;}
SynchronizingObject  Property   System.ComponentModel.ISynchronizeInvoke SynchronizingObject {get;set;}


[Administrator]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Заодно мы и посмотрели свойства полученного объекта. Для получения списка логов нужно воспользоваться свойством &lt;strong&gt;Entries&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Administrator] $EventLog.Entries | select -last 5

Index Time          Type Source                EventID Message
----- ----          ---- ------                ------- -------
  285 Nov 29 21:05  Info SceCli                   1704 Security policy in the Group policy objects has been applied ...
  286 Nov 29 21:35  Info SceCli                   1704 Security policy in the Group policy objects has been applied ...
  287 Nov 29 21:40  Info SceCli                   1704 Security policy in the Group policy objects has been applied ...
  288 Nov 29 21:43  Info SceCli                   1704 Security policy in the Group policy objects has been applied ...
  289 Dec 08 20:19  Info SceCli                   1704 Security policy in the Group policy objects has been applied ...


[Administrator]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Кстати говоря, если посмотреть вывод команды Get-Eventlog, то он будет идентичный. Т.е. можно смело предположить, что командлет Get-Eventlog использует именно механизмы .NET. А теперь попробуем рассмотреть статические методы данного класса:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Administrator] $EventLog | gm -MemberType methods -Static


   TypeName: System.Diagnostics.EventLog

Name                  MemberType Definition
----                  ---------- ----------
CreateEventSource     Method     static System.Void CreateEventSource(String source, String logName), static System....
Delete                Method     static System.Void Delete(String logName), static System.Void Delete(String logName...
DeleteEventSource     Method     static System.Void DeleteEventSource(String source), static System.Void DeleteEvent...
Equals                Method     static System.Boolean Equals(Object objA, Object objB)
Exists                Method     static System.Boolean Exists(String logName), static System.Boolean Exists(String l...
GetEventLogs          Method     static System.Diagnostics.EventLog[] GetEventLogs(), static System.Diagnostics.Even...
LogNameFromSourceName Method     static System.String LogNameFromSourceName(String source, String machineName)
ReferenceEquals       Method     static System.Boolean ReferenceEquals(Object objA, Object objB)
SourceExists          Method     static System.Boolean SourceExists(String source), static System.Boolean SourceExis...
WriteEntry            Method     static System.Void WriteEntry(String source, String message), static System.Void Wr...
WriteEvent            Method     static System.Void WriteEvent(String source, EventInstance instance, Params Object[...


[Administrator]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Первый метод, &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.createeventsource(VS.80).aspx"&gt;CreateEventSource&lt;/a&gt; позволяет создать свой источник событий в эвентлоге. А так же свой журнал:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Administrator] [System.Diagnostics.EventLog]::CreateEventSource("MySource", "PowerShell CustomLog", "dc1")
[Administrator] [System.Diagnostics.EventLog]::GetEventLogs("dc1")

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16 384      0 OverwriteAsNeeded         289 Application
     512      0 OverwriteAsNeeded          45 Directory Service
     512      7 OverwriteOlder             10 DNS Server
     512      0 OverwriteAsNeeded          52 File Replication Service
     512      7 OverwriteOlder              0 PowerShell CustomLog
 131 072      0 OverwriteAsNeeded      12 369 Security
  16 384      0 OverwriteAsNeeded         498 System
  15 360      0 OverwriteAsNeeded         625 Windows PowerShell


[Administrator]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Вот так очень просто мы создали собственный источник событий (здесь не отображён) и свой собственный журнал событий! Причём, всё так же удалённо! Для удаления журнала и источника события необходимо использовать статические методы &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.deleteeventsource(VS.80).aspx"&gt;DeleteEventSource&lt;/a&gt; и &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.delete(VS.80).aspx"&gt;Delete&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Diagnostics.EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Delete&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;LogName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Diagnostics.EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;DeleteEventSource&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;SourceName&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Чтобы управлять размером журнала нужно использовать свойство &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.maximumkilobytes(VS.80).aspx"&gt;MaximumKilobytes&lt;/a&gt;. Увеличим размер журнала PowerShell CustomLog с 512 килобайт до 2-х мегабайт:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Administrator] $EventLog = new-Object System.Diagnostics.Eventlog("PowerShell CustomLog","dc1")
[Administrator] $EventLog.MaximumKilobytes = 2048

[Administrator] [System.Diagnostics.EventLog]::GetEventLogs("dc1")

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16 384      0 OverwriteAsNeeded         289 Application
     512      0 OverwriteAsNeeded          45 Directory Service
     512      7 OverwriteOlder             10 DNS Server
     512      0 OverwriteAsNeeded          52 File Replication Service
   2 048      7 OverwriteOlder              0 PowerShell CustomLog
 131 072      0 OverwriteAsNeeded      12 369 Security
  16 384      0 OverwriteAsNeeded         498 System
  15 360      0 OverwriteAsNeeded         625 Windows PowerShell&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Если сравнить 2 последних вывода, то заметим, что размер действительной изменился. Давайте запишем какое-нибудь событие в журнал. Для этого воспользуемся методом &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.writeentry(VS.80).aspx"&gt;WriteEntry&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Administrator] $EventLog.Source = "MySource"
[Administrator] $EventLog.WriteEntry("Hello World!", "Information")
[Administrator] $EventLog = new-Object System.Diagnostics.Eventlog("PowerShell CustomLog","dc1")
[Administrator] $EventLog.entries

Index Time          Type Source                EventID Message
----- ----          ---- ------                ------- -------
    1 Dec 08 22:55  Info MySource                    0 Hello World!


[Administrator]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Сперва мы указали источник события, потом применили метод &lt;strong&gt;WriteEntry&lt;/strong&gt;, где ввели текст и тип события. Последней строкой мы убедились, что событие успешно записалось! Что касается типа события, то тут самому особо придумать ничего нельзя, потому что список типов жёстко регулируется:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Administrator] [enum]::GetNames([System.Diagnostics.EventLogEntryType])
Error
Warning
Information
SuccessAudit
FailureAudit
[Administrator]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt; Чтобы очистить журнал от событий нужно использовать метод &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.clear(VS.80).aspx"&gt;Clear&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Diagnostics.Eventlog&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;PowerShell CustomLog&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;dc1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br&gt;&lt;/span&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt;.Clear()&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;И напоследок расскажу о действии при заполнении журнала. Для этого используется метод &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.modifyoverflowpolicy(VS.80).aspx"&gt;ModifyOverflowPolicy&lt;/a&gt; и метод может иметь следующие свойства:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.minimumretentiondays(VS.80).aspx"&gt;MinimumRetentionDays&lt;/a&gt; (&lt;b&gt;OverwriteOlder&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.overflowaction.overwriteasneeded(VS.80).aspx"&gt;OverwriteAsNeeded&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.overflowaction.donotoverwrite(VS.80).aspx"&gt;DoNotOverwrite&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Эти свойства, думаю, в представлении не нуждаются, поэтому покажу примеры их использования:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.Diagnostics.Eventlog&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;PowerShell CustomLog&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;dc1&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br&gt;&lt;/span&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt;.ModifyOverflowPolicy(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;OverwriteAsNeeded&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br&gt;&lt;/span&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt;.ModifyOverflowPolicy(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;DoNotOverwrite&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br&gt;&lt;/span&gt;&lt;span style="color: #800080"&gt;$EventLog&lt;/span&gt;&lt;span style="color: #000000"&gt;.ModifyOverflowPolicy(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;OverwriteOlder&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;14&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;К сожалению, средствами .NET невозможно архивировать журналы собитий, как это я описывал в предыдущей статье. Вот, вроде рассказал всё, что мне казалось интересным по этой теме. В следующий раз расскажу об управлении эвентлогом средствами WMI.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=093ff83e-d892-4f04-b21c-a7fa234eaccd"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=815a5172-f8f3-4474-8929-c4ba6007be0a</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,815a5172-f8f3-4474-8929-c4ba6007be0a.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,815a5172-f8f3-4474-8929-c4ba6007be0a.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=815a5172-f8f3-4474-8929-c4ba6007be0a</wfw:commentRss>
      <title>Архивирование и ротация журналов событий (EventLog) средствами PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,815a5172-f8f3-4474-8929-c4ba6007be0a.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,815a5172-f8f3-4474-8929-c4ba6007be0a.aspx</link>
      <pubDate>Thu, 04 Dec 2008 21:55:32 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Снова навеяно темой на форуме &lt;A target=_blank href="http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=4208599&amp;amp;SiteID=40"&gt;TechNet-Ru&lt;/A&gt;. Уже не первый раз встречаю топики про архивирование журналов событий для последующего хранения в оффлайне. Безусловно не стоит пытаться скопировать .evt файл из папки Windows, поскольку файлы открыты и заблокированы (как и .pst файлы при запущенном MS Outlook). Для архивирования журнала скриптом нужно либо использовать Volume Shadow Copy либо использовать особые методы (например, вот так: &lt;A title=http://support.microsoft.com/kb/312571 href="http://support.microsoft.com/kb/312571"&gt;http://support.microsoft.com/kb/312571&lt;/A&gt;). В качестве особых методов можно так же выделить использование WMI, которое позволяет решить поставленную задачу и добавит нам удалённой управляемости.&lt;/P&gt;
&lt;P&gt;Полностью опираться на тему форума нельзя, ибо задача поставлена некорректно. Смысла в ежедневном удалении логов с машин без предварительного архивирования нету совсем (иначе вы потеряете точку отправления в решении проблемы, когда она возникнет и зачастую единственным выходом будет переинсталляция или восстановление из бакупа). Поэтому немного переформулируем задачу и напишем решение.&lt;/P&gt;
&lt;P&gt;Задача: проводить с некоторой периодичностью архивацию журнала событий в файл. Убедиться, что бэкап сделан и после этого очистить журналы. В противном случае сделать что-нибудь другое.&lt;/P&gt;
&lt;P&gt;За отправную точку возьмём класс &lt;A target=_blank href="http://msdn.microsoft.com/en-us/library/aa394225.aspx"&gt;Win32_NTEventlogFile&lt;/A&gt;. Давайте, вызовем его:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] gwmi Win32_NTEventlogFile

                     FileSize LogfileName                   Name
                     -------- -----------                   ----
                      8458240 Application                   C:\Windows\System32\Winevt...
                        69632 DFS Replication               C:\Windows\System32\Winevt...
                        69632 HardwareEvents                C:\Windows\System32\Winevt...
                        69632 Internet Explorer             C:\Windows\System32\Winevt...
                        69632 Key Management Service        C:\Windows\System32\Winevt...
                        69632 ODiag                         C:\Windows\System32\Winevt...
                      1118208 OSession                      C:\Windows\System32\Winevt...
                     20975616 System                        C:\Windows\System32\Winevt...
                     11603968 Windows PowerShell            C:\Windows\System32\Winevt...


[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Он показал список доступных журналов, с которыми мы можем работать. Давайте взглянем на методы данного класса:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] gwmi Win32_NTEventlogFile | gm -MemberType method


   TypeName: System.Management.ManagementObject#root\cimv2\Win32_NTEventlogFile

Name                        MemberType Definition
----                        ---------- ----------
BackupEventlog              Method     System.Management.ManagementBaseObject BackupEventlog(System.String ArchiveFi...
ChangeSecurityPermissions   Method     System.Management.ManagementBaseObject ChangeSecurityPermissions(System.Manag...
ChangeSecurityPermissionsEx Method     System.Management.ManagementBaseObject ChangeSecurityPermissionsEx(System.Man...
ClearEventlog               Method     System.Management.ManagementBaseObject ClearEventlog(System.String ArchiveFil...
Compress                    Method     System.Management.ManagementBaseObject Compress()
CompressEx                  Method     System.Management.ManagementBaseObject CompressEx(System.String StartFileName...
Copy                        Method     System.Management.ManagementBaseObject Copy(System.String FileName)
CopyEx                      Method     System.Management.ManagementBaseObject CopyEx(System.String FileName, System....
DeleteEx                    Method     System.Management.ManagementBaseObject DeleteEx(System.String StartFileName)
GetEffectivePermission      Method     System.Management.ManagementBaseObject GetEffectivePermission(System.UInt32 P...
Rename                      Method     System.Management.ManagementBaseObject Rename(System.String FileName)
TakeOwnerShip               Method     System.Management.ManagementBaseObject TakeOwnerShip()
TakeOwnerShipEx             Method     System.Management.ManagementBaseObject TakeOwnerShipEx(System.String StartFil...
Uncompress                  Method     System.Management.ManagementBaseObject Uncompress()
UncompressEx                Method     System.Management.ManagementBaseObject UncompressEx(System.String StartFileNa...


[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Здесь нас заинтересует 2 метода - &lt;A target=_blank href="http://msdn.microsoft.com/en-us/library/aa384808(VS.85).aspx"&gt;BackupEventlog&lt;/A&gt; и &lt;A target=_blank href="http://msdn.microsoft.com/en-us/library/aa389229(VS.85).aspx"&gt;ClearEventlog&lt;/A&gt; (там ещё есть ChangeSecurityPermissions - я бы не советовал с ним связываться &lt;img alt=":-D" src="/smilies/openmouth.gif"&gt;). В упрощённом варианте копирование и удаление будет сводиться к:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #800080"&gt;$LogName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Application&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Eventlog&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_NTEventlogFile&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;LogFileName = '$LogName'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Eventlog&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.BackupEventLog(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;&lt;SPAN style="COLOR: #800000"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;F:\Eventlogs\$env:computername\$LogName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;$(Get-Date -Format dd.MM.yyyy).evt&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$EventLog&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Clear()&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #000000"&gt;В данном случае с локальной машины заархивируем журнал Application в путь (после преобразований переменных) &lt;EM&gt;F:\Eventlogs\THOR\Application_04.12.2008.evt&lt;/EM&gt;, после чего данный журнал будет очищен. Ничего сложного нету совсем. Разве что кроме одной детали. Такой фокус не получится с журналом Security, поскольку это жрунал аудита. И для очистки журнала потребуется право &lt;STRONG&gt;Manage auditing and security log&lt;/STRONG&gt; привилегия &lt;STRONG&gt;SeAudit&lt;/STRONG&gt; (в общем смысле это будет административная учётная запись). Поэтому перед использованием метода ClearEventlog нужно подключить эти самые привилегии:&lt;/SPAN&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;SPAN style="COLOR: #800080"&gt;$EventLog&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.PSBase.Scope.Options.EnablePrivileges &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;$true&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;вот и всё. Осталось только решить задачу ротации журналов (удалять все файлы, которые старше 365 дней или 1 года):&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;dir&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;F&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;:\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Eventlogs&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$env:computername&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Recurse&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.lastwritetime &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-gt&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Get-Date&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).AddDays(-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;365&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)} | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;del&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Force&lt;/SPAN&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;В качестве последнего штриха стоит оформить всё в красивый скрипт:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#######################################################&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; EventLog Backup Manager.ps1&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Version 1.0&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Eventlog archiving script&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#
#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; Vadims Podans (c) 2008&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; http://www.sysadmins.lv/&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt;#######################################################&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Backup-Eventlog&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;param&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Computer&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
Begin {
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; разово получаем текущую дату в простом формате для пристыковки даты к имени файла&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$date&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Get-Date&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Format&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;dd.MM.yyyy&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    
    }
Process {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; получение списка всех журналов событий на текущем компьютере&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Eventlog&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gwmi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Win32_NTEventlogFile&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ComputerName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Computer&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #800080"&gt;$Eventlog&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; косметическая переменная для вставки имени лога в текстовые сообщения&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CurrentName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;.LogFileName
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CurrentLog&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; включение SeAudit привилегий&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.PSBase.Scope.Options.EnablePrivileges &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;$true&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; задаём путь, куда будут складываться архивы эвентлога&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\BackupServer\Eventlogs\$computer\$CurrentName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$date&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;.evt&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;        &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Processing $CurrentName log on $computer ..&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; непосредственно сам бэкап&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Backup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.BackupEventLog(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$path&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;)
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; проверка статуса бэкапа текущего журнала&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Backup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.ReturnValue &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Success&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если бэкап прошёл успешно, то можно удалять записи в журнале и командлетом Out-Null&lt;BR&gt;# подавляем ненужный вывод на экран&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CurrentLog&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.ClearEventlog() | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;out-null&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            } &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&lt;FONT size=2 face=Verdana&gt;else&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unexpected error occured. Operation aborted&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;            }
        }
    }
End {
&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; эта часть обеспечивает удаление старых архивов и их ротацию после каждого запуска скрипта&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;FONT size=2 face=Verdana&gt;#&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;FONT size=2 face=Verdana&gt; стоит отметить, что данная секция выполняется только один раз и после проведения всей архивации&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Purging old archives ..&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;dir&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\\BackupServer\Eventlogs\$computer&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Recurse&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;?&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.lastwritetime &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-gt&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Get-Date&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).AddDays(-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;365&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)} | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;del&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Force&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;FONT size=2 face=Verdana&gt;    }
}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;/SPAN&gt;как бы и всё.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=815a5172-f8f3-4474-8929-c4ba6007be0a"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,815a5172-f8f3-4474-8929-c4ba6007be0a.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=bc0587e4-250b-48bc-8c5e-6c584440501d</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,bc0587e4-250b-48bc-8c5e-6c584440501d.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,bc0587e4-250b-48bc-8c5e-6c584440501d.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=bc0587e4-250b-48bc-8c5e-6c584440501d</wfw:commentRss>
      <title>Пути к файлам и подстановочные знаки в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,bc0587e4-250b-48bc-8c5e-6c584440501d.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,bc0587e4-250b-48bc-8c5e-6c584440501d.aspx</link>
      <pubDate>Tue, 02 Dec 2008 12:28:52 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Из-за сильной занятости на работе в последнее время не получается уделять время блогу. Но сегодня выкроил немного времени и решил рассказать одну, на мой взгляд, интересную тему, которую каждый решает по-своему и не всегда очень удобным способом (о чём свидетельствует книга по PowerShell и ньюсгруппы). И на это есть весомые причины. А так же расскажу о весьма странном поведении ряда командлетов (на примере &lt;strong&gt;Get-Acl&lt;/strong&gt;) при работе с файлами.&lt;/p&gt; &lt;p&gt;Давайте рассмотрим вопрос с начала и выйдем на нашу проблему. При поиске группы файлов PowerShell, как и многие другие командные оболочки, позволяет создавать маску поиска, как "&lt;strong&gt;*&lt;/strong&gt;", "&lt;strong&gt;?&lt;/strong&gt;". Безусловно с ними проблем быть не может, т.к. эти знаки в именах файлов встречаться не могут. Но если в имени файла используется символ открывающейся или закрывающейся квадратной скобки - "&lt;strong&gt;[&lt;/strong&gt;" и "&lt;strong&gt;]&lt;/strong&gt;", соответственно. Данные символы допустимы для именования файлов, но интерпретатор PowerShell их воспринимает как мета-символы подстановочного шаблона/маски, например:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;[a-z]*&lt;/strong&gt; - все объекты, которые начинаются с букв латинского алфавита&lt;br&gt;&lt;strong&gt;*[0-9]&lt;/strong&gt; - все объекты, которые заканчиваются любой цифрой и т.д.&lt;/p&gt; &lt;p&gt;При этом встаёт вопрос, как сказать интерпретатору, что квадратная скобка в данном случае является литералом, а не мета-символ? Для начала я в папке создал 3 файла, 2 из которых содержат квадратные скобки:&lt;/p&gt; &lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] dir


    Directory: Microsoft.PowerShell.Core\FileSystem::D:\Users\_Shared Documents\Folder


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         02.12.08.      0:47         11 text.txt
-a---         02.12.08.      0:47        296 text[0].txt
-a---         02.12.08.      0:48        769 text[text.txt


[Folder]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Давайте просмотрим содержимое файла text[text.txt:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] Get-Content text[text.txt
&lt;font color="#ff0000"&gt;Get-Content : Cannot retrieve the dynamic parameters for the cmdlet. The specified wildcard pattern is not valid: text[
text.txt
At line:1 char:12
+ Get-Content  &amp;lt;&amp;lt;&amp;lt;&amp;lt; text[text.txt&lt;/font&gt;
[Folder]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;занятно, не правда ли? Здесь мы столкнулись с проблемой, что интерпретатор PowerShell воспринял скобку в имени файла за мета-символ. Бороться с этим можно различными методами. Как вариант - использовать параметр &lt;strong&gt;-LiteralPath&lt;/strong&gt;, что будет говорить интерпретатору о буквальном чтении пути. Проверим:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] Get-Content -LiteralPath text[text.txt
Quest, Quest Software, the Quest Software logo, Aelita, Benchmark Factory, Big Brother,
DataFactory, DeployDirector, ERDisk, Fastlane, Final, Foglight, Funnel Web, I/Watch,
Imceda, InLook, InTrust, IT Dad, JClass, JProbe, LeccoTech, LiveReorg, NBSpool, NetBase,
PerformaSure, PL/Vision, Quest Central, RAPS, SharePlex, Sitraka, SmartAlarm, Speed
Change Manager, Speed Coefficient, Spotlight, SQL Firewall, SQL Impact, SQL LiteSpeed,
SQL Navigator, SQLab, SQLab Tuner, SQLab Xpert, SQLGuardian, SQLProtector, SQL
Watch, Stat, Stat!, Toad, T.O.A.D., Tag and Follow, Vintela, Virtual DBA, and XRT are
trademarks and registered trademarks of Quest Software, Inc. Other trademarks and
registered trademarks used in this guide are property of their respective owners.
[Folder]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Как видите, мы получили содержимое файла (там отрывок из дисклаймера Quest Software). Однако, параметром &lt;strong&gt;-LiteralPath&lt;/strong&gt; обладают далеко не все командлеты. Например, &lt;strong&gt;Get-Acl&lt;/strong&gt;. У него нету такого параметра, поэтому получить ACL список такого файла будет очень проблематично. Посмотрим пример:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] Get-Item -LiteralPath text[text.txt


    Directory: Microsoft.PowerShell.Core\FileSystem::D:\Users\_Shared Documents\Folder


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         02.12.08.      0:59        769 text[text.txt


[Folder] Get-Item -LiteralPath text[text.txt | Get-Acl
&lt;font color="#ff0000"&gt;Get-Acl : The specified wildcard pattern is not valid: text[text.txt
At line:1 char:45
+ Get-Item -LiteralPath text[text.txt | Get-Acl &amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Get-Item спокойно работает с LiteralPath, но при передаче его по конвейеру в командлет Get-Acl мы получаем ошибку. Хотя, по идее это должно было сработать. Кстати говоря, это первый обнаруженный недостаток. Вместо LiteralPath можно использовать 4 backtick (&lt;strong&gt;text````[text.txt&lt;/strong&gt;), либо проще (что мне показалось более очевидным) - поместить литеральную скобку в подстановочный шаблон:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] Get-Item text````[text.txt


    Directory: Microsoft.PowerShell.Core\FileSystem::D:\Users\_Shared Documents\Folder


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         02.12.08.      0:59        769 text[text.txt


[Folder] Get-Item text[[]text.txt


    Directory: Microsoft.PowerShell.Core\FileSystem::D:\Users\_Shared Documents\Folder


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         02.12.08.      0:59        769 text[text.txt


[Folder]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;В первом примере я использовал рецепт из книги Windows PowerShell In Action (страница 310), второй я додумал сам. Однако, оба эти приёма заменяют параметр &lt;strong&gt;-LiteralPath&lt;/strong&gt;, но так же не решают проблемы командлетов, как Get-Acl. Если передавать эти объекты в Gat-Acl, то всё равно мы будем получать ошибки. Как вариант решения - использование промежуточной функции-фильтра (это рецепт решения &lt;strong&gt;Kiron&lt;/strong&gt; из ньюсгрупп):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #0000ff"&gt;filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Escape-Bracket&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;br&gt;&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.psPath &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.psPath &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;\[|]&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;`$0&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;br&gt;&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;br&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="color: #000000"&gt;При использовании фильтра наш литеральный символ заменяем подстановочным знаком "&lt;strong&gt;?&lt;/strong&gt;", пропускаем через фильтр и подаём на командлет Get-Acl:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] Get-Item text?text.txt | Escape-Bracket | Get-Acl | ft -a


    Directory: Microsoft.PowerShell.Core\FileSystem::D:\Users\_Shared Documents\Folder


Path          Owner        Access
----          -----        ------
text[text.txt Thor\vPodans Everyone Allow  FullControl...


[Folder]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Так оно работает. В качестве первого предположения я подумал на тип объектов:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] (Get-Item 'text[[]text.txt').GetType().fullname
System.IO.FileInfo
[Folder] (Get-Acl text.txt).GetType().fullname
System.Security.AccessControl.FileSecurity
[Folder]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Что при Get-Item мы получаем тип объектов FileInfo, который не содержит ACL, поэтому данный командлет передаёт в конвейер свойство PsPath, который уже Get-Acl использует для повторного извлечения уже ACL объекта.&lt;/p&gt;
&lt;p&gt;Однако, я обратил внимание, что при использовании UNC путей вместо локальных промежуточная функция не требуется и вполне работает подстановочная маска заключённая в квадратные скобки:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] Get-Acl 'text[[]text.txt'
&lt;font color="#ff0000"&gt;Get-Acl : The specified wildcard pattern is not valid: text[text.txt
At line:1 char:8
+ Get-Acl  &amp;lt;&amp;lt;&amp;lt;&amp;lt; 'text[[]text.txt'&lt;/font&gt;
[Folder] Get-Acl 'text[[]0[]].txt'
&lt;font color="#ff0000"&gt;Get-Acl : Cannot find path 'D:\Users\_Shared Documents\Folder\text[0].txt' because it does not exist.
At line:1 char:8
+ Get-Acl  &amp;lt;&amp;lt;&amp;lt;&amp;lt; 'text[[]0[]].txt'&lt;/font&gt;
[Folder] Get-Acl '\\Thor\_Shared Documents\Folder\text[[]text.txt' | ft -a


    Directory: Microsoft.PowerShell.Core\FileSystem::\\Thor\_Shared Documents\Folder


Path          Owner        Access
----          -----        ------
text[text.txt Thor\vPodans Everyone Allow  FullControl...


[Folder] Get-Acl '\\Thor\_Shared Documents\Folder\text[[]0[]].txt' | ft -a


    Directory: Microsoft.PowerShell.Core\FileSystem::\\Thor\_Shared Documents\Folder


Path        Owner        Access
----        -----        ------
text[0].txt Thor\vPodans Everyone Allow  FullControl...


[Folder]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;В первых двух командах я поместил квадратную скобку в подстановочный шаблон (заключил во внешние квадратные скобки) для локальных путей, а во втором - сделал то же самое, но для UNC пути. При этом, типы объектов не изменились:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[Folder] (Get-Item '\\thor\_Shared Documents\Folder\text[[]text.txt').gettype().fullname
System.IO.FileInfo
[Folder] (Get-Acl '\\thor\_Shared Documents\Folder\text[[]text.txt').gettype().fullname
System.Security.AccessControl.FileSecurity
[Folder]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Следовательно, моё предположение было неверным. Вполне возможно, что это баг командлетов, поэтому я на всякий случай запостил проблему на Connect'е:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a title="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=386138&amp;amp;SiteID=99" href="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=386138&amp;amp;SiteID=99"&gt;https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=386138&amp;amp;SiteID=99&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Желающие могут перейти по ссылке и подтвердить данную ошибку. Всем спасибо за участие :)&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=bc0587e4-250b-48bc-8c5e-6c584440501d"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,bc0587e4-250b-48bc-8c5e-6c584440501d.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=22c0550d-0c46-44ca-97ce-2b0bccbb51de</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=22c0550d-0c46-44ca-97ce-2b0bccbb51de</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>Управление принтерами в PowerShell (часть 3, заключительная)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx</link>
      <pubDate>Sat, 22 Nov 2008 18:11:28 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Вот и пришло время закрыть тему управления принтерами и их списками ACL в PowerShell с использованием WMI. Я в блоге уже расписывал решение частных задач по основным задачам управления принтеров и по управлению их ACL списками. В этом посте я сложу все наработки по этому вопросу в единый концептуальный скрипт, который будет называться PrinterUtils.ps1 с достаточно объёмным набором функций, которые нацелены на упрощение для администраторов автоматизации принтеров с использованием PowerShell. Если кто-то захочет разобраться в работе скрипта и понять используемые приёмы, то предлагаю ознакомиться с следующими ссылками:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,41226cf5-e524-446f-85c0-4a958c6c769a.aspx"&gt;Управление принтерами в PowerShell (часть 1)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,54cfbd81-dff6-4391-8ba0-13a17df9bc5f.aspx"&gt;Управление принтерами в PowerShell (часть 2)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,4c56b6d6-b4d1-4d84-963e-a10d37140e9a.aspx"&gt;Странности метода SetSecurityDescriptor класса Win32_Printer (часть 1)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,249809ac-0d9e-4b60-8109-5b756fba4496.aspx"&gt;Странности метода SetSecurityDescriptor класса Win32_Printer (часть 2)&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;В качестве основы я использовал свои предыдущие наработки с SecurityDescriptor в предыдущем блоге, когда разбирал вопрос управления SharePermissions из PowerShell:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!170.entry"&gt;Управление безопасностью общих папок (сетевых шар) в PowerShell (часть 1)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!177.entry"&gt;Управление безопасностью общих папок (сетевых шар) в PowerShell (часть 2)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!186.entry"&gt;Управление безопасностью общих папок (сетевых шар) в PowerShell (часть 3)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!188.entry"&gt;Управление безопасностью общих папок (сетевых шар) в PowerShell (часть 4)&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Материала у меня на эту тему набралось достаточно много, чтобы проникнуться в идею работы классов WMI и SecurityDescriptor, который не раз пытался посадить меня в лужу :) Однако версия скрипта ShareUtils чётко говорит о том, что скрипт далеко не идеален и не оптимален, имеет свои недостатки, т.к. это был мой первый опыт работы с функциями. Сейчас я значительно переработал структуру работы скрипта (оставив только Core работы с SecurityDescriptor), добавив удалённое управление (в разумных пределах) и, главное (как мне кажется), реализовал работу функций в конвейере. Примеры использования скрипта распишу чуть ниже. Итак, представляю набор функций, которые реализованы в скрипте:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Подключение (маппинг) сетевого принтера к пользователю; 
&lt;LI&gt;Отключение маппинга сетевого принтера от пользователя; 
&lt;LI&gt;Получение сведений о принтерах; 
&lt;LI&gt;Установка принтера по умолчанию; 
&lt;LI&gt;Установка принтера для общего пользования (расшаривание принтера); 
&lt;LI&gt;Отмена принтера для общего пользования;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Данная секция представляет собой базовые возможности по управлению принтерами и полностью работоспособна в среде Windows XP/Windows Server 2003. А вот секция управления ACL списками принтеров доступна только в среде Windows Vista/Windows Server 2008. Сюда входят следующие функции:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Получение сведений о правах доступа на конкретный принтер, конкретный принтсервер или по списку компьютеров; 
&lt;LI&gt;Импорт сведений о правах доступа из внешнего источника. Это может быть и CSV и XML или другой формат; 
&lt;LI&gt;Добавление пользователя или группы в ACL список принтера или всех принтеров, которые подключены к принтсерверу; 
&lt;LI&gt;Удаление пользователя или группы из ACL списка принтера или всех принтеров, которые подключены к принтсерверу; 
&lt;LI&gt;Установка пользователя или группы в ACL список принтера или всех принтеров, которые подключены к принтеру. При этом все имеющиеся права доступа будут удалены и заменены только одним ACE с правом ManagePrinters.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Для этих функций полностью реализована поддержка удалённой работы и работа в конвейере. Синтаксис команд используется примерно следующий:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT color=#0000ff&gt;New-NetworkPrinter -Computer &amp;lt;name&amp;gt; -name &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;Computer&lt;/STRONG&gt; - имя компьютера, к которому подключён сетевой принтер&lt;BR&gt;&lt;STRONG&gt;Name&lt;/STRONG&gt; - сетевое имя принтера, который следует подключить к пользователю 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Remove-NetworkPrinter -Name &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;Name&lt;/STRONG&gt; - имя примапленного сетевого принтера (не обязательный параметр). Если параметр Name не указан, то будут отключены все примапленные сетевые принтеры. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Get-PrinterInfo -Computer &amp;lt;name&amp;gt; -Name &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;Computer&lt;/STRONG&gt; - имя компьютера, к которому подключён принтер (не обязательный параметр. Если не указан, то будет использоваться локальная машина),&lt;BR&gt;&lt;STRONG&gt;Name&lt;/STRONG&gt; - имя принтера на удалённой или локальной машине, зависит от предыдущего параметра (не обязательный параметр. Если не указан, то будет выведена краткая справка о всех принтерах указанного компьютера. Если указан, то будет выведена подробная информация о принтере). Вывод данной команды не будет содержать сведений о правах доступа на принтер.&amp;nbsp; 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-DefaultPrinter -Name &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;Name&lt;/STRONG&gt; - имя (или путь) принтера, который должен стать для пользователя принтером по умолчанию. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;New-PrinterShare -Computer &amp;lt;name&amp;gt; -Name &amp;lt;name&amp;gt; -ShareName &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;Computer&lt;/STRONG&gt; - имя компьютера, к которому подключён принтер (не обязательный параметр. Если не указан, будет использоваться локальная машина)&lt;BR&gt;&lt;STRONG&gt;Name&lt;/STRONG&gt; - имя принтера, который требуется предоставить для общего доступа&lt;BR&gt;&lt;STRONG&gt;ShareName&lt;/STRONG&gt; - сетевое имя принтера, т.е. имя, под которым принтер будет виден из сети 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Remove-PrinterShare -Computer &amp;lt;name&amp;gt; -Name &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;Computer&lt;/STRONG&gt; - имя компьютера, к которому подключён принтер (не обязательный параметр. Если не указан, будет использоваться локальная машина)&lt;BR&gt;&lt;STRONG&gt;Name&lt;/STRONG&gt; - имя принтера, для которого необходимо отключить общий доступ (не обязательный параметр. Если не указан, то общий доступ будет отменён для всех расшаренных принтеров на выбранном предыдущим параметром компьютере) 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Get-Printer -Computer &amp;lt;name&amp;gt; -Name &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;Computer&lt;/STRONG&gt; - имя компьютера, к которому подключён принтер (не обязательный параметр. Если не указан, будет использоваться локальная машина)&lt;BR&gt;&lt;STRONG&gt;Name&lt;/STRONG&gt; - имя принтера, для которого следует получить сведения о правах доступа (не обязательный параметр. Если не указан, то будут получены сведения об ACL всех принтеров на выбранном предыдущим параметром компьютере)&lt;BR&gt;Генерирует на выходе массив объектов с необходимыми сведениями о каждом ACE. Данный массив можно использовать как для изменения прав доступа, так и просто для экспорта во внешний файл. 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-Printer&lt;BR&gt;&lt;/FONT&gt;не принимает никаких аргументов, а только получает данные по конвейеру. В качестве входных данных должны использоваться объекты, которые по свойствам соответствуют объектам, которые генерирует команда Get-Printer. Команда не может быть в начале строки, а только на выходе конвейера, с которого поступают объекты. Так же по конвейеру можно передавать объекты из внешних файлов (например, CSV, XML) 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Add-PrinterPermission -User &amp;lt;name&amp;gt; -AceType &amp;lt;name&amp;gt; -AccessMask &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;User&lt;/STRONG&gt; - имя пользователя/группы, которого следует добавить в ACL список принтера&lt;BR&gt;&lt;STRONG&gt;AceType&lt;/STRONG&gt; - тип доступа. Может быть &lt;STRONG&gt;Allow&lt;/STRONG&gt; или &lt;STRONG&gt;Deny&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;AccessMask&lt;/STRONG&gt; - маска доступа. Может иметь следующие значения: &lt;STRONG&gt;ManagePrinters&lt;/STRONG&gt;, &lt;STRONG&gt;ManageDocuments&lt;/STRONG&gt;, &lt;STRONG&gt;Print&lt;/STRONG&gt;, &lt;STRONG&gt;TakeOwnership&lt;/STRONG&gt;, &lt;STRONG&gt;ReadPermissions&lt;/STRONG&gt;, &lt;STRONG&gt;ChangePermissions&lt;/STRONG&gt;&lt;BR&gt;&lt;U&gt;Данная команда так же не может быть в начале строки, а должна находиться на выходе конвейера&lt;/U&gt;, с которого поступают объекты. В качестве входных данных должны использоваться объекты, которые по свойствам соответствуют объектам, которые генерирует команда Get-Printer. Команда не может быть в начале строки, а только на выходе конвейера, с которого поступают объекты. Так же по конвейеру можно передавать объекты из внешних файлов (например, CSV, XML) 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Remove-PrinterPermission -User &amp;lt;name&amp;gt;&lt;BR&gt;&lt;/FONT&gt;где &lt;STRONG&gt;User&lt;/STRONG&gt; - имя пользователя/группы, которого следует удалить из списка ACL принтера&lt;BR&gt;&lt;U&gt;Данная команда так же не может быть в начале строки, а должна находиться на выходе конвейера&lt;/U&gt;, с которого поступают объекты. В качестве входных данных должны использоваться объекты, которые по свойствам соответствуют объектам, которые генерирует команда Get-Printer. Команда не может быть в начале строки, а только на выходе конвейера, с которого поступают объекты. Так же по конвейеру можно передавать объекты из внешних файлов (например, CSV, XML) 
&lt;LI&gt;&lt;FONT color=#0000ff&gt;Set-PrinterPermission -User &amp;lt;name&amp;gt;&lt;/FONT&gt;&lt;BR&gt;где &lt;STRONG&gt;User&lt;/STRONG&gt; - имя пользователя/группы, для которого следует предоставить привилегированный доступ.&lt;BR&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Важно:&lt;/FONT&gt;&lt;/STRONG&gt; &lt;EM&gt;&lt;U&gt;при использовании команды Set-PrinterPermission следует помнить, что указанный пользователь/группа будут иметь единственный доступ к принтеру с правом ManagePrinters. При этом вероятно, что вы после исполнения команды потеряете доступ к принтеру&lt;/U&gt;&lt;/EM&gt;&lt;BR&gt;&lt;U&gt;Данная команда так же не может быть в начале строки, а должна находиться на выходе конвейера&lt;/U&gt;, с которого поступают объекты. В качестве входных данных должны использоваться объекты, которые по свойствам соответствуют объектам, которые генерирует команда Get-Printer. &lt;BR&gt;&lt;BR&gt;Команда не может быть в начале строки, а только на выходе конвейера, с которого поступают объекты. Так же по конвейеру можно передавать объекты из внешних файлов (например, CSV, XML) &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;и несколько примеров использования:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Get-Printer PrintSrv "MyPrinter" | export-csv C:\LaserJet.csv&lt;/FONT&gt; - экспортирует ACL списки принтера MyPrinter в CSV файл&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Get-Printer PrintSrv | Remove-PrinterPermission Everyone&lt;/FONT&gt; - удаляет группу Everyone из списков ACL всех принтеров сервера PrintSrv&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Import-Clixml C:\Printers.xml | Set-Printer&lt;/FONT&gt; - восстанавливает права для принтеров на те, которые содержатся в XML файле. При этом текущие списки ACL указанных в файле принтеров будут полностью перезаписаны списком ACL из файла.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Get-Content C:\Computers.txt | %{Get-printer $_ | Add-Printerpermission NewPrinterWorkers Allow Print}&lt;/FONT&gt; - даёт право печати на всех принтерах, которые подключены к компьютерам из списка computers.txt&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;New-NetworkPrinter PrintSrv "HP LaserJet 2100"&lt;/FONT&gt; - подключает пользователю в контексте котрого исполняется скрипт сетевой принтер HP LaserJet 2100, который физически подключен к компьютеру PrintSrv&lt;/P&gt;
&lt;P&gt;Это далеко не все варианты использования :) Вобщем, я старался создать достаточно широким функционалом, который обычно требуется в скриптах для принтменеджмента. Безусловно, он не охватывает все задачи и в нём реализованы только те функции, которые я посчитал актуальными. А вот, собственно и скрипт с небольшими комментариями по ходу дела:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#009500&gt;########################################################&lt;BR&gt;# PrinterUtils.ps1&lt;BR&gt;# Version 0.1.0.0&lt;BR&gt;#&lt;BR&gt;# Functions for advanced printer management&lt;BR&gt;#&lt;BR&gt;# Vadims Podans (c) 2008&lt;BR&gt;# &lt;/FONT&gt;&lt;A href="http://www.sysadmins.lv/"&gt;&lt;FONT color=#009500&gt;http://www.sysadmins.lv/&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;FONT color=#009500&gt;########################################################&lt;/FONT&gt; 
&lt;P&gt;&lt;FONT color=#009500&gt;# внутренняя функция, которая преобразовывает числовой код возврата операции записи ACL&lt;BR&gt;# в текстовое значение.&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;function _PrinterUtils_Get-Code&lt;/STRONG&gt; ($Write) {&lt;BR&gt;switch ($Write.ReturnValue) {&lt;BR&gt;&amp;nbsp;&amp;nbsp; "0" {"Success"}&lt;BR&gt;&amp;nbsp;&amp;nbsp; "2" {"Access Denied"}&lt;BR&gt;&amp;nbsp;&amp;nbsp; "8" {"Unknown Error"}&lt;BR&gt;&amp;nbsp;&amp;nbsp; "9" {"The user does not have adequate privileges to execute the method"}&lt;BR&gt;&amp;nbsp;&amp;nbsp; "21" {"A parameter specified in the method call is invalid"}&lt;BR&gt;&amp;nbsp;&amp;nbsp; default {"Unknown error $Write.ReturnValue"}&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#009500&gt;# функция получения списка (списков) ACL принтера или всех принтеров&lt;BR&gt;&lt;/FONT&gt;&lt;STRONG&gt;function Get-Printer&lt;/STRONG&gt; ($Computer = ".", $name) {&lt;BR&gt;&lt;FONT color=#009500&gt;# Если переменная $name пустая, то возвращается список всех локальных принтеров&lt;/FONT&gt;&lt;BR&gt;if ($name) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Printers = gwmi&amp;nbsp; Win32_Printer -ComputerName&amp;nbsp; $Computer -Filter "name = '$name'"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Printers = gwmi Win32_Printer -ComputerName $Computer -Filter "local = '$True'"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;FONT color=#009500&gt;# объявление массива списков ACL&lt;BR&gt;&lt;/FONT&gt;$PrinterInfo = @()&lt;BR&gt;&lt;FONT color=#009500&gt;# извлечение списка ACL из каждого элемента массива списков ACL&lt;BR&gt;&lt;/FONT&gt;foreach ($Printer in $Printers) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($printer) {&lt;BR&gt;&lt;FONT color=#009500&gt;# в переменную $SD получаем дескриптор безопасности для каждого принтера и каждый элемент ACE (DACL)&lt;BR&gt;# и добавляем в $PrinterInfo&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $SD = $Printer.GetSecurityDescriptor()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $PrinterInfo += $SD.Descriptor.DACL | %{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_ | Select @{e = {$Printer.SystemName}; n = 'Computer'},&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @{e = {$Printer.name}; n = 'Name'},&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AccessMask,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AceFlags,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AceType,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @{e = {$_.trustee.Name}; n = 'User'},&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @{e = {$_.trustee.Domain}; n = 'Domain'},&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @{e = {$_.trustee.SIDString}; n = 'SID'}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Warning "Specified printer not found!"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;FONT color=#009500&gt;# выдача сведений об ACL на выход функции для последующей подачи на конвейер&lt;/FONT&gt;&lt;BR&gt;$PrinterInfo&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#009500&gt;# функция записи в ACL принтера. Она не принимает никаких аргументов,&lt;BR&gt;# а только принимает данные с конвейера&lt;/FONT&gt;&lt;BR&gt;&lt;STRONG&gt;function Set-Printer&lt;/STRONG&gt; {&lt;BR&gt;&lt;FONT color=#009500&gt;# по конвейеру получаем массив ACE из внешнего источника&lt;/FONT&gt;&lt;BR&gt;$PrinterInfo = @($input)&lt;BR&gt;&lt;FONT color=#009500&gt;# расшиваем полученный массив по имени принтера и дальше по циклу подаём на&lt;BR&gt;# обработку только ACL одного принтера&lt;BR&gt;&lt;/FONT&gt;$PrinterInfo | Select -Unique Computer, Name | % {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Computer = $_.Computer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $name = $_.name&lt;BR&gt;&lt;FONT color=#009500&gt;# создаём новые объекты необходимых классов&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $SD = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ace = ([WMIClass] "Win32_Ace").CreateInstance()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()&lt;BR&gt;&lt;FONT color=#009500&gt;# теперь расшиваем каждый ACE уже отфильтрованного списка ACL из PrinterInfo и&lt;BR&gt;# заполняем форму SecurityDescriptor&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $PrinterInfo | ? {$_.Computer -eq $Computer -and $_.name -eq $name} | % {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $SID = new-object security.principal.securityidentifier($_.SID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [byte[]] $SIDArray = ,0 * $SID.BinaryLength&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $SID.GetBinaryForm($SIDArray,0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Trustee.Name = $_.user&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Trustee.SID = $SIDArray&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ace.AccessMask = $_.AccessMask&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ace.AceType = $_.AceType&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ace.AceFlags = $_.AceFlags&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ace.trustee = $Trustee&lt;BR&gt;&lt;FONT color=#009500&gt;# набор ACE поэтапно добавляем в DACL дескриптора безопасности&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $SD.DACL += @($ace.psobject.baseobject)&lt;BR&gt;&lt;FONT color=#009500&gt;# устанавливаем флаг SE_DACL_PRESENT, что будет говорить о том, что мы изменяем&lt;BR&gt;# только DACL и ничего более&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $SD.ControlFlags = 0x0004&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;FONT color=#009500&gt;# когда полный список ACL для текущего принтера собран, выбираем имя текущего принтера&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Printer = gwmi Win32_Printer -ComputerName $Computer -Filter "name = '$name'"&lt;BR&gt;&lt;FONT color=#009500&gt;# проверяется, что принтер для записи ACL найден и производится запись.&lt;BR&gt;# В противном случае запись ACL пропускается&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($Printer) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Write = $Printer.SetSecurityDescriptor($SD)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Host "Processing current printer: $name"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _PrinterUtils_Get-Code $Write&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Warning "Skipping non-present printer: $name"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#009500&gt;# внутренняя функция, которая только формирует объект пользователя с набором прав&lt;BR&gt;# и возвращает объект в вызывающую функцию для последующих преобразований&lt;/FONT&gt;&lt;BR&gt;&lt;STRONG&gt;function _Create-SDObject&lt;/STRONG&gt; ( $user, $AceType, $AccessMask) {&lt;BR&gt;&lt;FONT color=#009500&gt;# преобразование текстового вида прав в числовые значения&lt;/FONT&gt;&lt;BR&gt;$masks = @{ManagePrinters = 983052; ManageDocuments = 983088; Print = 131080;&lt;BR&gt;TakeOwnership = 524288; ReadPermissions = 131072; ChangePermissions = 262144}&lt;BR&gt;$types = @{Allow = 0; Deny = 1}&lt;BR&gt;&lt;FONT color=#009500&gt;# создание необходимых свойств для объекта. Для поддержки удалённого управления&lt;BR&gt;# было добавлено свойство Computer, которое будет принимать от Get-Printer аналогичное&lt;BR&gt;# значение. Тем самым обеспечивается сквозная трансляция имени компьютера, где&lt;BR&gt;# подключен принтер, по конвейеру для последующей записи&lt;BR&gt;&lt;/FONT&gt;$AddInfo = New-Object System.Management.Automation.PSObject&lt;BR&gt;$AddInfo | Add-Member NoteProperty Computer&amp;nbsp; ([PSObject]$null)&lt;BR&gt;$AddInfo | Add-Member NoteProperty Name&amp;nbsp; ([PSObject]$null)&lt;BR&gt;$AddInfo | Add-Member NoteProperty AccessMask&amp;nbsp; ([uint32]$null)&lt;BR&gt;$AddInfo | Add-Member NoteProperty AceFlags&amp;nbsp; ([uint32]$null)&lt;BR&gt;$AddInfo | Add-Member NoteProperty AceType&amp;nbsp; ([uint32]$null)&lt;BR&gt;$AddInfo | Add-Member NoteProperty User&amp;nbsp; ([PSObject]$null)&lt;BR&gt;$AddInfo | Add-Member NoteProperty Domain&amp;nbsp; ([PSObject]$null)&lt;BR&gt;$AddInfo | Add-Member NoteProperty SID&amp;nbsp; ([PSObject]$null)&lt;BR&gt;&lt;FONT color=#009500&gt;# заполнение объекта данными, которые были указаны в качестве аргументов вызова функции и возврат&lt;BR&gt;# объекта в вызывающую функцию&lt;BR&gt;&lt;/FONT&gt;$AddInfo.Name = $name&lt;BR&gt;$AddInfo.User = $user&lt;BR&gt;$AddInfo.SID = (new-object security.principal.ntaccount $user).translate([security.principal.securityidentifier])&lt;BR&gt;$AddInfo.AccessMask = $masks.$AccessMask&lt;BR&gt;$AddInfo.AceType = $types.$AceType&lt;BR&gt;$AddInfo&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#009500&gt;# функция для установки разрешений на принтер. При её использовании, текущий ACL очищается&lt;BR&gt;# от всех записей и устанавливается только один ползователь/группа с правом ManagePrinters&lt;BR&gt;&lt;/FONT&gt;&lt;STRONG&gt;function Set-PrinterPermission&lt;/STRONG&gt; ($user) {&lt;BR&gt;&lt;FONT color=#009500&gt;# принимаются данные с конвейера&lt;/FONT&gt; &lt;BR&gt;$PrinterInfo = @($input)&lt;BR&gt;$AddInfo = _Create-SDObject $user Allow ManagePrinters&lt;BR&gt;&lt;FONT color=#009500&gt;# в этом цикле перебираются по именам все имена принтеров и для каждого из них&lt;BR&gt;# записывается указанный в аргументах пользователь с удалением текущих ACE из ACL принтера&lt;BR&gt;# это видно по тому, что никакая часть $PrinterInfo не передаётся по конвейеру на запись&lt;BR&gt;&lt;/FONT&gt;foreach ($Printer in ($PrinterInfo | select -Unique Computer, Name)) {&lt;BR&gt;$AddInfo.Computer = $Printer.Computer&lt;BR&gt;$AddInfo.Name = $Printer.name&lt;BR&gt;$AddInfo | Set-Printer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#009500&gt;# функция добавления пользователя/группу в имеющийся список ACL принтера. Основное отличие от&lt;BR&gt;# предыдущего варианта, что для каждого принтера ACE не устанавливается, а добавляется&lt;BR&gt;&lt;/FONT&gt;&lt;STRONG&gt;function Add-PrinterPermission&lt;/STRONG&gt; ($user, $AceType, $AccessMask) {&lt;BR&gt;$PrinterInfo = @($input)&lt;BR&gt;$AddInfo = _Create-SDObject $user $AceType $AccessMask&lt;BR&gt;foreach ($Printer in ($PrinterInfo | select -Unique Computer, Name)) {&lt;BR&gt;$AddInfo.Name = $Printer.name&lt;BR&gt;$AddInfo.Computer = $Printer.Computer&lt;BR&gt;&lt;FONT color=#009500&gt;# вот этой строкой мы из списка всех принтеров итеративно перебираем каждый принтер&lt;BR&gt;&lt;/FONT&gt;$PrinterInfoNew = $PrinterInfo | ?{$_.name -eq $Printer.name}&lt;BR&gt;&lt;FONT color=#009500&gt;# и в хвост списка ACL добавляем новый ACE&lt;BR&gt;&lt;/FONT&gt;$PrinterInfoNew += $AddInfo&lt;BR&gt;&lt;FONT color=#009500&gt;# и подаём на запись&lt;/FONT&gt;&lt;BR&gt;$PrinterInfoNew | Set-Printer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#009500&gt;# функция для удаления ACE пользователя/группы из ACL&lt;/FONT&gt;&lt;BR&gt;&lt;STRONG&gt;function Remove-PrinterPermission&lt;/STRONG&gt; ($user) {&lt;BR&gt;$Printers = @($input)&lt;BR&gt;&lt;FONT color=#009500&gt;# просто берём списки ACL, которые пришли по конвейеру и выкидываем оттуда все ACE,&lt;BR&gt;# в которых фигурирует указанный в аргументах пользователь/группа и записывем ACE обратно в ACL&lt;BR&gt;&lt;/FONT&gt;$printers | ? {$_.user -ne $user} | Set-Printer&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;function New-NetworkPrinter&lt;/STRONG&gt; ($Computer, $name) {&lt;BR&gt;([wmiclass]'Win32_Printer').AddPrinterConnection("\\$Computer\$name")&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;function Remove-NetworkPrinter&lt;/STRONG&gt; ($name) {&lt;BR&gt;if ($name) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (gwmi Win32_Printer -Filter "sharename='$name'").delete()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (gwmi Win32_Printer -Filter "local='$false'").delete()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;function Set-DefaultPrinter&lt;/STRONG&gt; ($name) {&lt;BR&gt;if (!$name) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Warning "You must to specify printer name. Operation aborted!"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (gwmi win32_Printer -Filter "name='$name'") {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $SetDefault = (gwmi win32_Printer -Filter "name='$name'").SetDefaultPrinter()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch ($SetDefault.ReturnValue) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "0" {Write-Host "Now your default printer is $name"}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default {Write-Warning "Some error occur"}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Warning "Specified printer not exist!"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;function Get-PrinterInfo&lt;/STRONG&gt; ($Computer = ".", $name) {&lt;BR&gt;&lt;FONT color=#009500&gt;# здесь я предлагаю получить как полный набор свойств, так и упрощённый вывод сведений.&lt;/FONT&gt; &lt;BR&gt;if ($name) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gwmi Win32_Printer -ComputerName $Computer -Filter "name='$name'" | select *&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gwmi Win32_Printer -ComputerName $Computer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;function New-PrinterShare&lt;/STRONG&gt; ($Computer = ".", $name, $ShareName) { &lt;BR&gt;$Printer = gwmi win32_Printer -ComputerName $Computer -Filter "name='$name'"&lt;BR&gt;if ($Printer) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Printer.shared = $True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Printer.ShareName = $ShareName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Printer.put()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write-Warning "Specified printer not exist!"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;function Remove-PrinterShare&lt;/STRONG&gt; ($Computer = ".", $name) {&lt;BR&gt;if ($name) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $filter = "name = '$name'"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $filter = "local = '$false'"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;gwmi Win32_Printer -ComputerName $Computer -Filter $filter | % {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_.shared = $false&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_.put()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;многовато, конечно же, но ничего космически сложного для разбора я тут не вижу. Главное - чёткое понимание структуры SecurityDescriptor и хотя бы базовые навыки работы с ним.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Важно:&lt;/FONT&gt;&lt;/STRONG&gt; &lt;U&gt;если не указываете необязательные параметры, то указание последующих параметров в виде именованных (не позиционных) обязательна!&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;Даже не знаю, что ещё добавить сюда. Вроде все вопросы разобрал ранее, сейчас просто это всё собрал воедино. Вобщем, как обычно, если есть вопросы, замечания - кнопка Comments вам в помощь &lt;img alt=";)" src="/smilies/wink.gif"&gt;&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=22c0550d-0c46-44ca-97ce-2b0bccbb51de"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,22c0550d-0c46-44ca-97ce-2b0bccbb51de.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / ACL</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=249809ac-0d9e-4b60-8109-5b756fba4496</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,249809ac-0d9e-4b60-8109-5b756fba4496.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,249809ac-0d9e-4b60-8109-5b756fba4496.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=249809ac-0d9e-4b60-8109-5b756fba4496</wfw:commentRss>
      <title>Странности метода SetSecurityDescriptor класса Win32_Printer (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,249809ac-0d9e-4b60-8109-5b756fba4496.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,249809ac-0d9e-4b60-8109-5b756fba4496.aspx</link>
      <pubDate>Wed, 19 Nov 2008 16:36:47 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Итак, как я и обещал, я вернулся к вопросу изменения ACL принтеров в PowerShell. В первой части (&lt;a title="Странности метода SetSecurityDescriptor класса Win32_Printer" href="http://www.sysadmins.lv/PermaLink,guid,4c56b6d6-b4d1-4d84-963e-a10d37140e9a.aspx"&gt;Странности метода SetSecurityDescriptor класса Win32_Printer&lt;/a&gt;) я изложил проблематику вопроса. В конечном итоге я сегодня смог найти решение, которое оказалось не совсем понятным, но относительно предсказуемым.&lt;/p&gt; &lt;p&gt;Вернёмся снова к документации MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/aa393594(VS.85).aspx" target="_blank"&gt;SetSecurityDescriptor Method of the Win32_Printer Class&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Это, конечно же, было моим попустительством, что не указал флаг управления &lt;strong&gt;SE_DACL_PRESENT&lt;/strong&gt; и не включил привилегии &lt;strong&gt;SeSecurityPrivilege&lt;/strong&gt; ("&lt;em&gt;&lt;u&gt;умение читать - первое умение системного администратора&lt;/u&gt;&lt;/em&gt;" (c) &lt;strong&gt;Peter.G&lt;/strong&gt;). Понимание этого факта пришло после очередного прочтения поста о смене владельца папки (&lt;a href="http://www.sysadmins.lv/PermaLink,guid,243d77ee-4975-4335-9abf-ce8660e9439c.aspx"&gt;Смена владельца папки или файла в PowerShell (часть 2)&lt;/a&gt;). Что касается флагов управления, то выложу здесь значения флагов:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;SE_OWNER_DEFAULTED = 0x0001  &lt;li&gt;SE_GROUP_DEFAULTED = 0x0002  &lt;li&gt;&lt;strong&gt;SE_DACL_PRESENT = 0x0004&lt;/strong&gt;  &lt;li&gt;SE_DACL_DEFAULTED =&amp;nbsp; 0x0008  &lt;li&gt;SE_SACL_PRESENT = 0x0010  &lt;li&gt;SE_SACL_DEFAULTED = 0x0020  &lt;li&gt;SE_DACL_AUTO_INHERIT_REQ = 0x0100  &lt;li&gt;SE_SACL_AUTO_INHERIT_REQ =0x0200  &lt;li&gt;SE_DACL_AUTO_INHERITED = 0x0400  &lt;li&gt;SE_SACL_AUTO_INHERITED = 0x0800  &lt;li&gt;SE_DACL_PROTECTED = 0x1000  &lt;li&gt;SE_SACL_PROTECTED = 0x2000  &lt;li&gt;SE_RM_CONTROL_VALID = 0x4000  &lt;li&gt;SE_SELF_RELATIVE = 0x8000&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Здесь я выделил жирным тот флаг, который нам нужен.&lt;/p&gt; &lt;p&gt;Добавим эту строчку к скрипту и добавим включение привилегий. И мы должны будем получить примерно такой скрипт:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;$user = "everyone"&lt;br&gt;$SD = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()&lt;br&gt;$ace = ([WMIClass] "Win32_Ace").CreateInstance()&lt;br&gt;$Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()&lt;br&gt;$SID = (new-object security.principal.ntaccount $user).translate([security.principal.securityidentifier])&lt;br&gt;[byte[]] $SIDArray = ,0 * $SID.BinaryLength&lt;br&gt;$SID.GetBinaryForm($SIDArray,0)&lt;br&gt;$Trustee.Name = $user&lt;br&gt;$Trustee.SID = $SIDArray&lt;br&gt;$ace.AccessMask = 393224&lt;br&gt;$ace.AceType = 0&lt;br&gt;$ace.AceFlags = 0&lt;br&gt;$ace.Trustee = $Trustee&lt;br&gt;$SD.DACL = $ace&lt;br&gt;&lt;strong&gt;$SD.ControlFlags = 0x0004&lt;/strong&gt;&lt;br&gt;$Printer = gwmi win32_printer -filter "name='CutePDF Writer'"&lt;br&gt;&lt;strong&gt;$Printer.psbase.Scope.Options.EnablePrivileges = $true&lt;/strong&gt;&lt;br&gt;$inParams = $Printer.psbase.GetMethodParameters("SetSecurityDescriptor")&lt;br&gt;$inParams.Descriptor = $SD&lt;br&gt;$Printer.SetSecurityDescriptor($inParams)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Пробуем запустить его:&lt;/p&gt; &lt;blockquote&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;
[System32] $user = "everyone"
[System32] $SD = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()
[System32] $ace = ([WMIClass] "Win32_Ace").CreateInstance()
[System32] $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
[System32] $SID = (new-object security.principal.ntaccount $user).translate([security.principal.securityidentifier])
[System32] [byte[]] $SIDArray = ,0 * $SID.BinaryLength
[System32] $SID.GetBinaryForm($SIDArray,0)
[System32] $Trustee.Name = $user
[System32] $Trustee.SID = $SIDArray
[System32] $ace.AccessMask = 393224
[System32] $ace.AceType = 0
[System32] $ace.AceFlags = 0
[System32] $ace.Trustee = $Trustee
[System32] $SD.DACL = $ace
[System32] $SD.ControlFlags = 0x0004
[System32] $Printer = gwmi win32_printer -filter "name='CutePDF Writer'"
[System32] $Printer.psbase.Scope.Options.EnablePrivileges = $true
[System32] $inParams = $Printer.psbase.GetMethodParameters("SetSecurityDescriptor")
[System32] $inParams.Descriptor = $SD
[System32] $Printer.SetSecurityDescriptor($inParams)


__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ReturnValue      : 2147749896



[System32]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;И снова мы получаем ошибку, которая указывает, что какой-то параметр вызова неверный. Снова посмотрев предыдущую статью, я стал понимать в чём тут дело. А дело в том, что метод &lt;strong&gt;SetSecurityDescripto&lt;/strong&gt;r в этом классе не принимает параметр &lt;strong&gt;Descriptor&lt;/strong&gt; (хотя он есть в выдаче команды &lt;strong&gt;GetSecurityDescriptor&lt;/strong&gt;) и в MSDN чётко указано:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;uint32 SetSecurityDescriptor( 
&lt;p&gt;[in] Win32_SecurityDescriptor &lt;em&gt;&lt;strong&gt;Descriptor&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;); &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;При этом, в методе &lt;a href="http://msdn.microsoft.com/en-us/library/aa393598(VS.85).aspx" target="_blank"&gt;SetShareInfo&lt;/a&gt; класса Win32_Share параметр Access я указывал и всё проходило на "ура". Здесь мы сталкиваемся с отсутствием единого формата использования метода SetSecurityDescriptor (отсутствие единого формата параметров я уже указывал в первой части) для различных WMI классов. И если один приём работает для одного класса, то, увы, далеко не гарантия, что этот же приём сработает для другого. Поэтому выкинем 2 предпоследние строчки из скрипта и в последней строке вместо аргумента &lt;strong&gt;$inParams&lt;/strong&gt; заменим на &lt;strong&gt;$SD&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[System32] $user = "everyone"
[System32] $SD = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()
[System32] $ace = ([WMIClass] "Win32_Ace").CreateInstance()
[System32] $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
[System32] $SID = (new-object security.principal.ntaccount $user).translate([security.principal.securityidentifier])
[System32] [byte[]] $SIDArray = ,0 * $SID.BinaryLength
[System32] $SID.GetBinaryForm($SIDArray,0)
[System32] $Trustee.Name = $user
[System32] $Trustee.SID = $SIDArray
[System32] $ace.AccessMask = 393224
[System32] $ace.AceType = 0
[System32] $ace.AceFlags = 0
[System32] $ace.Trustee = $Trustee
[System32] $SD.DACL = $ace
[System32] $SD.ControlFlags = 0x0004
[System32] $Printer = gwmi win32_printer -filter "name='CutePDF Writer'"
[System32] $Printer.psbase.Scope.Options.EnablePrivileges = $true
[System32] $Printer.SetSecurityDescriptor($SD)


__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ReturnValue      : 0



[System32]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Вуаля! Мы получили ReturnValue=0, что означает успешное выполнение команды. Давайте убедимся, что группа Everyone имеет маску доступа 393224 (это &lt;strong&gt;ReadPermissions&lt;/strong&gt;, &lt;strong&gt;ChangePermissions&lt;/strong&gt; и &lt;strong&gt;Print&lt;/strong&gt;). Для этого снова вызовем метод GetSecurityDescriptor для нового образца класса Win32_Printer:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span  #009500?; background-color: black?&gt;&lt;p&gt;[System32] $a = (gwmi win32_Printer -filter "name='cutepdf writer'").getsecuritydescriptor()
[System32] $a.descriptor.dacl[0]


__GENUS                 : 2
__CLASS                 : Win32_ACE
__SUPERCLASS            : __ACE
__DYNASTY               : __SecurityRelatedClass
__RELPATH               :
__PROPERTY_COUNT        : 7
__DERIVATION            : {__ACE, __SecurityRelatedClass}
__SERVER                :
__NAMESPACE             :
__PATH                  :
AccessMask              : 393224
AceFlags                : 0
AceType                 : 0
GuidInheritedObjectType :
GuidObjectType          :
TIME_CREATED            :
Trustee                 : System.Management.ManagementBaseObject



[System32] $a.descriptor.dacl[0].trustee


__GENUS          : 2
__CLASS          : Win32_Trustee
__SUPERCLASS     : __Trustee
__DYNASTY        : __SecurityRelatedClass
__RELPATH        :
__PROPERTY_COUNT : 6
__DERIVATION     : {__Trustee, __SecurityRelatedClass}
__SERVER         :
__NAMESPACE      :
__PATH           :
Domain           :
Name             : Everyone
SID              : {1, 1, 0, 0...}
SidLength        : 12
SIDString        : S-1-1-0
TIME_CREATED     :



[System32]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Вот теперь мы видим нашу маску доступа (&lt;strong&gt;AccessMask=393224&lt;/strong&gt;) в корне &lt;strong&gt;DACL&lt;/strong&gt; и нашего уважаемого &lt;strong&gt;everyone&lt;/strong&gt; в &lt;strong&gt;Trustee&lt;/strong&gt;. &lt;img alt="Rock" src="/smilies/blush.gif"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; &lt;u&gt;данный скрипт удаляет все имеющиеся ACE из ACL принтера и записывает новый единственный ACE. Не забывайте об этом.&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Теперь я закрываю этот вопрос. Что же дальше? А дальше будет вот что: я напишу готовый набор функций для управления ACL списками принтеров. Какой это будет набор - я пока в процессе разработки его структуры, но однозначно будут функции вида Get- Set- Add- Remove- PrinterPermission. Возможно будут добавлены функции для владельцев. Но об этом уже в следующий раз, так что продолжение следует однозначно &lt;img alt="happy" src="/smilies/veryhappy.gif"&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=249809ac-0d9e-4b60-8109-5b756fba4496"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,249809ac-0d9e-4b60-8109-5b756fba4496.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / ACL</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=243d77ee-4975-4335-9abf-ce8660e9439c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,243d77ee-4975-4335-9abf-ce8660e9439c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,243d77ee-4975-4335-9abf-ce8660e9439c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=243d77ee-4975-4335-9abf-ce8660e9439c</wfw:commentRss>
      <title>Смена владельца папки или файла в PowerShell (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,243d77ee-4975-4335-9abf-ce8660e9439c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,243d77ee-4975-4335-9abf-ce8660e9439c.aspx</link>
      <pubDate>Mon, 17 Nov 2008 00:19:53 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Как-то давно &lt;a href="http://stanky2.spaces.live.com/"&gt;Александр Станкевич&lt;/a&gt; просил у меня вариант скрипта, который бы менял владельца файла или папки из PowerShell. В своё время я занимался этим вопросом и результат моих исследований:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!155.entry" target="_blank"&gt;Управление ACL в PowerShell (часть 3)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!161.entry" target="_blank"&gt;Смена владельца (Owner) папки или файла&lt;/a&gt; (часть 1) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Что-то меня натолкнуло снова вернуться к этому вопросу. Учитывая проблематику, изложенных в предыдущих статьях, я перестал искать нативный способ изменения владельца в PowerShell через .NET и решил поискать его в WMI (что означает очередные мучения многострадального SecurityDescriptor &lt;img alt=":'(" src="/smilies/unhappy.gif"&gt; ). Итак, у WMI есть несколько классов для работы с &lt;strong&gt;ACL&lt;/strong&gt; (&lt;em&gt;AccessControlList&lt;/em&gt;) файлов и папок. Например:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa394130(VS.85).aspx" target="_blank"&gt;Win32_Directory&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa394180(VS.85).aspx" target="_blank"&gt;Win32_LogicalFileSecuritySetting&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Я для решения данной задачи решил использовать класс &lt;strong&gt;Win32_LogicalFileSecuritySetting&lt;/strong&gt; (хотя, можно и Win32_Directory использовать но после мелкой доработки. Но об этом я выскажусь в конце статьи).&lt;/p&gt;  &lt;p&gt;Итак, класс &lt;strong&gt;Win32_LogicalFileSecuritySetting&lt;/strong&gt; имеет те же методы, что и остальные классы, работающие со списками ACL - &lt;a href="http://msdn.microsoft.com/en-us/library/aa390773(VS.85).aspx" target="_blank"&gt;GetSecurityDescriptor&lt;/a&gt; и &lt;a href="http://msdn.microsoft.com/en-us/library/aa393592(VS.85).aspx" target="_blank"&gt;SetSecurityDescriptor&lt;/a&gt;. Я уже неоднократно поднимал вопрос работы с &lt;a href="http://msdn.microsoft.com/en-us/library/aa394577.aspx" target="_blank"&gt;SecurityDescriptor&lt;/a&gt; в PowerShell, поэтому приступим сразу к решению задачи.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell_F12F/SecurityDescriptor%20Structure_2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" border="0" alt="SecurityDescriptor Structure" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShell_F12F/SecurityDescriptor%20Structure_thumb.png" width="477" height="369" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Как видно из картинки, нас будет интересовать объект &lt;strong&gt;Owner&lt;/strong&gt; и &lt;strong&gt;ControlFlags&lt;/strong&gt;. Объект &lt;strong&gt;DACL&lt;/strong&gt; нас не будет интересовать совсем, поэтому работать с Win32_Ace нам не придётся, а только с Trustee:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;WMIClass&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_SecurityDescriptor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).CreateInstance()
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;WMIClass&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_Trustee&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).CreateInstance()&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Далее следует стандартная процедура преобразования имени пользователя в SID и получение байтового массива из SID'а:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;new-object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;security.principal.ntaccount&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$user&lt;/span&gt;&lt;span style="color: #000000"&gt;).translate([&lt;/span&gt;&lt;span style="color: #008080"&gt;security.principal.securityidentifier&lt;/span&gt;&lt;span style="color: #000000"&gt;])
[&lt;/span&gt;&lt;span style="color: #008080"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]] &lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;BinaryLength&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetBinaryForm&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Теперь $SIDArray и имя пользователя запишем в Trustee и поместим этот объект в свойство Owner дескриптора безопасности:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt;.Name &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$user&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt;.SID &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;.Owner &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Для того, чтобы заменить владельца папки нужно заполнить объект Control Flags, которые описаны здесь: &lt;a title="http://msdn.microsoft.com/en-us/library/aa394402(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa394402(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa394402(VS.85).aspx&lt;/a&gt;. Не уверен, что стоит углубляться в этот момент (на практике очень редко приходится им пользоваться), поэтому скажу, что нас заинтересует флаг &lt;strong&gt;SE_SELF_RELATIVE&lt;/strong&gt;. Заполняется он одной строчкой:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;.ControlFlags&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&lt;strong&gt;0x8000&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Его можно записывать как десятичное число (&lt;strong&gt;32768&lt;/strong&gt;), так и в HEX нотации. Я использую HEX. Вот и всё, дескриптор безопасности у нас готов. Теперь самое время получить ACL в формате SecurityDescriptor из имеющейся папки:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$wPrivilege&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_LogicalFileSecuritySetting&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;path='$path'&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Вот теперь мы вплотную подошли к нашей проблеме. К слову говоря, если этот скрипт использовать в Windows Vista/Windows Server 2008 с повышенными привилегиями (запустив консоль в привилегированном режиме), то можно добавлять последнюю строчку с записью нового владельца в папку. В системах, где есть UAC нету такой проблемы, которая описана в ссылках, которые приведены в начале поста, поскольку при запуске консоли с повышенными привилегиями UAC включает для нас все необходимые привилегии (в частности &lt;strong&gt;SeRestorePrivilege&lt;/strong&gt; и &lt;strong&gt;SeTakeOwnershipPrivilege&lt;/strong&gt;, которые необходимы для этой операции). Но в более ранних ОС при запуске консоли PowerShell эти права не включаются и их нужно включать отдельно. Если в .NET нету нативного метода включения этих привилегий, то в WMI они есть и вот они:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$wPrivilege&lt;/span&gt;&lt;span style="color: #000000"&gt;.psbase.Scope.Options.EnablePrivileges &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;В Options помимо включения привилегий можно указывать имперсонализацию пользователя (Impersonate) и другие параметры. Чтобы посмотреть доступные свойства достаточно набрать в консоли:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$wPrivilege&lt;/span&gt;&lt;span style="color: #000000"&gt;.psbase.scope.options | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-Member&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Когда привилегии включены, можно уже записывать дескриптор в папку при помощи метода &lt;a href="http://msdn.microsoft.com/en-us/library/aa393592(VS.85).aspx" target="_blank"&gt;SetSecurityDescriptor&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$wPrivilege&lt;/span&gt;&lt;span style="color: #000000"&gt;.setsecuritydescriptor(&lt;/span&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Если имя папки указано верно, то в выводе &lt;strong&gt;ReturnValue&lt;/strong&gt; должен вернуть значение &lt;strong&gt;0&lt;/strong&gt;, что означает, что владелец сменён! &lt;img alt="Rock" src="/smilies/blush.gif"&gt; и мы небольшим (но для PowerShell'а это уже много, учитывая что многие вещи в нём делаются в одну строчку &lt;img alt=";)" src="/smilies/wink.gif"&gt; ) увеличением объёма кода можем полноценно изменять владельца файла или папки без установки дополнительных расширений, как PSCX или отдельных консольных утилит, как SubInAcl или SetAcl.&lt;/p&gt;

&lt;p&gt;Теперь это всё окультурим в готовый скрипт:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Set-Owner&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$user&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-LiteralPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;)) {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Указан неверный путь к папке&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; преобразовываем путь вида C:\Folder в C:\\Folder (к слешу пути добавляем ещё один&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; для корректной работы класса Win32_LogicalFileSecuritySetting и эскейпим другие символы&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;\\|'&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;\$0&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;\[&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;$([char]91)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;\]&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;$([char]93)&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; т.к. DACL мы не записываем, то объявляем только классы SecurityDescriptor и Trustee&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;WMIClass&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_SecurityDescriptor&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).CreateInstance()
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;WMIClass&lt;/span&gt;&lt;span style="color: #000000"&gt;] &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_Trustee&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).CreateInstance()
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; преобразовываем имя пользователя в SID и заполняем необходимые поля в Trustee&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;new-object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;security.principal.ntaccount&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$user&lt;/span&gt;&lt;span style="color: #000000"&gt;).translate([&lt;/span&gt;&lt;span style="color: #008080"&gt;security.principal.securityidentifier&lt;/span&gt;&lt;span style="color: #000000"&gt;])
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;byte&lt;/span&gt;&lt;span style="color: #000000"&gt;[]] &lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;BinaryLength&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$SID&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetBinaryForm&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt;.Name &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$user&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt;.SID &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$SIDArray&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;.Owner &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Trustee&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; здесь мы добавляем флаг управления&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;.ControlFlags&lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;0x8000&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выбираем сведения о безопасности необходимой папки&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$wPrivilege&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Win32_LogicalFileSecuritySetting&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;path='$path'&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; включаем привилегия для WMI. Для Windows Vista/Windows Server 2008,&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; при запуске скрипта с повышенными привилегиями данная строка не обязательна&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$wPrivilege&lt;/span&gt;&lt;span style="color: #000000"&gt;.psbase.Scope.Options.EnablePrivileges &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; записываем SecurityDescriptor с новым владельцем в папку&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$wPrivilege&lt;/span&gt;&lt;span style="color: #000000"&gt;.setsecuritydescriptor(&lt;/span&gt;&lt;span style="color: #800080"&gt;$SD&lt;/span&gt;&lt;span style="color: #000000"&gt;)
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; преобразовываем возвращаемый код в текстовое значение&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Return&lt;/span&gt;&lt;span style="color: #000000"&gt;.ReturnValue) {
            &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;0&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Успешно&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;2&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Отказано в доступе&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;8&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Неизвестная ошибка&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;9&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Отсутствуют привилегии&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;21&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Указан неправильный параметр&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;1307&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Указанный пользователь не может быть владельцем данного объекта&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;}
            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;default&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Произошла неизвестная ошибка с кодом:&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Return&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #800000"&gt;Value&lt;/span&gt;&lt;span style="color: #000000"&gt;}
        }
    }
}

&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; эта часть совсем необязательна, я её включил лишь для наглядности &lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; и полноты скрипта &lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Get-Owner&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;) {(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-Acl&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;).owner}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/Set-Owner.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/Set-Owner.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/Set-Owner.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;8,62 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/Set-Owner.ps1" target="_self" alt="Download File"&gt;Download File.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; &lt;u&gt;При указании пути, который содержит пробелы, путь нужно заключать в кавычки!&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;и немного о стандартности использования методов SetSecurityDescriptor для различных объектов. Мне не понятно, почему в различных классах WMI используются различные именования свойств дескриптора безопасности, когда в этом явных причин нету? Например:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa394435(VS.85).aspx" target="_blank"&gt;Win32_Share&lt;/a&gt; для дескриптора использует свойство &lt;strong&gt;Access&lt;/strong&gt; метода &lt;em&gt;SetShareInfo&lt;/em&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa394363.aspx" target="_blank"&gt;Win32_Printer&lt;/a&gt; использует свойство &lt;strong&gt;Descriptor&lt;/strong&gt; метода &lt;em&gt;SetSecurityDescriptor&lt;/em&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa394130(VS.85).aspx" target="_blank"&gt;Win32_Directory&lt;/a&gt; использует &lt;strong&gt;SecurityDescriptor&lt;/strong&gt; метода &lt;em&gt;SetSecurityDescriptor&lt;/em&gt; (и для &lt;em&gt;SetSecurityDescrptorEx&lt;/em&gt;) &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa394180(VS.85).aspx" target="_blank"&gt;Win32_LogicalFileSecuritySetting&lt;/a&gt; использует &lt;strong&gt;Descriptor&lt;/strong&gt; метода &lt;em&gt;SetSecurityDescriptor&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Вот 4 WMI класса управления ACL списками различных объектов, с которыми я недавно работал и имеем 3 различных именования свойства дескриптора безопасности и Win32_Share использует даже другое название метода (SetShareInfo), хотя этот метод использует тот же Win32_SecurityDescriptor. Но это уже оффтопик и личные размышления. Вот :)&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=243d77ee-4975-4335-9abf-ce8660e9439c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,243d77ee-4975-4335-9abf-ce8660e9439c.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / ACL</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=f3a9a181-0eac-45d0-8b2d-5943337d2c6a</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,f3a9a181-0eac-45d0-8b2d-5943337d2c6a.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,f3a9a181-0eac-45d0-8b2d-5943337d2c6a.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=f3a9a181-0eac-45d0-8b2d-5943337d2c6a</wfw:commentRss>
      <title>Аудит доступа к файловым ресурсам в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,f3a9a181-0eac-45d0-8b2d-5943337d2c6a.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,f3a9a181-0eac-45d0-8b2d-5943337d2c6a.aspx</link>
      <pubDate>Sat, 15 Nov 2008 22:17:15 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Навеяно темой на форуме: &lt;A title=http://forum.sysfaq.ru/index.php?showtopic=13274 href="http://forum.sysfaq.ru/index.php?showtopic=13274"&gt;http://forum.sysfaq.ru/index.php?showtopic=13274&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Итак, есть задача отслеживать события удаления объектов (файлов и/или папок) с файлового сервера. Итак, для начала необходимо настроить аудит на файловом сервере. Приведу рекомендации коллеги WindowsNT:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Включить аудит успешных событий типа Object Access. 
&lt;LI&gt;Отрегулировать размер журнала и параметры перезаписи. 
&lt;LI&gt;В свойствах папки Shared Documents (и других папок общего доступа) включить Аудит на Успешные Everyone: Delete, Delete Subfolders and Files. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Учитывая сопутствующую проблематику удалений, что для части программ при работе нормально удалять файлы при сохранении было предложено фиксировать 5 событий удаления в секунду. Такая схема вполне сгодится для среднестатистического решения. В любом случае предложенный скрипт можно будет изменить под свои нужды вполне свободно. За основу будет взят пост из моего предыдущего блога (&lt;A href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!270.entry" target=_blank&gt;Аудит входов на сервере терминалов с использованием PowerShell&lt;/A&gt;), но с некоторыми доработками.&lt;/P&gt;
&lt;P&gt;Итак, задача разбивается на 4 составные части:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;получение всех эвентов с кодом EventID = 560; 
&lt;LI&gt;из полученных эвентов получить массив с уникальным временем; 
&lt;LI&gt;подсчитать количество эвентов для каждого уникального времени из массива, который был получен на втором этапе; 
&lt;LI&gt;если кол-во эвентов больше или равно 5 (цифра может быть и немного другой), то записываем их в лог и отмечаем, как "возможно нелегальное". &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Итак, давайте пробовать решить все этапы:&lt;/P&gt;
&lt;P&gt;1) получение массива эвентов по коду 560:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;$Events = Get-EventLog security | ?{$_.eventid -eq 560 -and &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_.EntryType -eq "SuccessAudit" -and &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_.message -like "*Object Name:`tD:\Shared Documents\*" -and &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_.message -like "*Accesses:`t%delete*" &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Итак, здесь я сделал 3 фильтра: код события - &lt;STRONG&gt;560&lt;/STRONG&gt;, Тип аудита &lt;STRONG&gt;Success Audit&lt;/STRONG&gt; (т.к. под кодом 560 регистрируются и неуспешные аудиты), имя корневой папки, которая нас будет интересовать (только для случаев, если настроено несколько аудитов на различных папках) и явно будем интересоваться действием $Delete. Теперь из этого массива нужно получить массив уникального времени:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;$UniqueTime = $Events | select -Unique TimeGenerated | %{($_.timegenerated).datetime}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Здесь я получил массив с набором уникального времени. Отмечу, что я взял свойство &lt;STRONG&gt;DateTim&lt;/STRONG&gt;e, которое даст нам точность до 1 секунды. Массив мы делаем затем, чтобы потом считать сколько событий удаления зафиксировано с этим временем (отличить легальное удаление от нелегального). Теперь при помощи полученной переменной соберём кол-во эвентов удаления на момент уникального времени. Иными словами мы берём отметку времени, когда зафиксирован лог удаления файла или папки и посмотрим, сколько ещё логов было зафиксировано за эту секунду:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;[object[]]$SelectedEvents = $Events | ?{($_.timegenerated).datetime -eq UniqueTime} &lt;BR&gt;$SelectedEvents.count&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Переменная &lt;STRONG&gt;$SelectedEvents&lt;/STRONG&gt; будет содержать все эвенты удаления в течении секунды. И их количество можно посчитать свойством &lt;STRONG&gt;Count&lt;/STRONG&gt;. И дальше можно проводить сравнительный анализ по кол-ву эвентов. Если их за секунду зафиксировано больше 5 (вероятность нелегального удаления файлов), то продолжаем разбирать переменную &lt;STRONG&gt;$SelectedEvents&lt;/STRONG&gt;. Разбирается скрипт по той же схеме, что и в упомянутой выше статье по аудиту доступа на терминальный сервер. В итоге мы получим такой скрипт:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#009500&gt;######################################################## &lt;BR&gt;# FileServerDeleteAudit.ps1 &lt;BR&gt;# Version 1.0 &lt;BR&gt;# &lt;BR&gt;# Windows Server 2003 eventlog parser &lt;BR&gt;# &lt;BR&gt;# Vadims Podans (c) 2008 &lt;BR&gt;# &lt;/FONT&gt;&lt;A href="http://www.sysadmins.lv/"&gt;&lt;FONT color=#009500&gt;http://www.sysadmins.lv/&lt;/FONT&gt;&lt;/A&gt; &lt;BR&gt;&lt;FONT color=#009500&gt;########################################################&lt;/FONT&gt; &lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;$Data = New-Object System.Management.Automation.PSObject &lt;BR&gt;$Data | Add-Member NoteProperty Time ($null) &lt;BR&gt;$Data | Add-Member NoteProperty UserName ($null) &lt;BR&gt;$Data | Add-Member NoteProperty FileName ($null) &lt;BR&gt;$Data | Add-Member NoteProperty EventCount ($null) &lt;BR&gt;$Events = Get-EventLog security | ?{$_.eventid -eq 560 -and &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_.EntryType -eq "SuccessAudit" -and &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_.message -like "*Object Name:`t&lt;STRONG&gt;D:\Shared Documents\*&lt;/STRONG&gt;" -and &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $_.message -like "*Accesses:`t%delete*" &lt;BR&gt;} &lt;BR&gt;$UniqueTime = $Events | select -Unique TimeGenerated | %{($_.timegenerated).datetime} &lt;BR&gt;foreach ($time in $UniqueTime) {[object[]]$SelectedEvents = $Events | ?{($_.timegenerated).datetime -eq $time} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($SelectedEvents.count -ge &lt;STRONG&gt;5&lt;/STRONG&gt;) { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Data.EventCount = $SelectedEvents.Count &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $SelectedEvents | %{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $message = $_.message.split("`n") |&amp;nbsp;&amp;nbsp;&amp;nbsp; %{$_.trim()} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Data.time = $_.TimeGenerated &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($message -like "Primary User Name:`t*$") { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Data.UserName = ($message | ?{$_ -like "Client User Name:*"} | %{$_ -replace "^.+`t *"})} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Data.UserName = ($message | ?{$_ -like "Primary User Name:*"} | %{$_ -replace "^.+`t *"})} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Data.FileName = ($message | ?{$_ -like "Object Name:*"} | %{$_ -replace "^.+`t *"}) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Data &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Что касается поля &lt;STRONG&gt;$Data.UserName&lt;/STRONG&gt;, то здесь я сделал проверку поля &lt;STRONG&gt;Primary User Name&lt;/STRONG&gt;. Если файл или папка были удалены с компьютера локально, то данное поле заполняется именем пользователя. Если же файл или папку удалили по сети, то в данном поле будет указано имя компьютера в формате &lt;STRONG&gt;ComputerName$&lt;/STRONG&gt;, а имя пользователя будет отражено в поле &lt;STRONG&gt;Client User Name&lt;/STRONG&gt;. Поэтому если в поле Primary User Name будет встречаться знак доллара ($), то мы в поле $Data.UserName записываем имя пользователя из поля эвентлога &lt;STRONG&gt;Client User Name&lt;/STRONG&gt;. Жирным в скрипте я отметил те места, которые в зависимости от местных условий могут изменяться. В первом случае отмечена корневая папка, которая будет изучаться и кол-во инцидентов удаления в секунду описывает порог срабатывания скрипта. И результат работы скрипта:&lt;/P&gt;
&lt;BLOCKQUOTE class=postsub&gt;&lt;CODE style="FONT: 9pt courier new; COLOR: #fff; BACKGROUND-COLOR: black"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;
&lt;P&gt;Time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventCount &lt;BR&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------- &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\AR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\BG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\DA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140 &lt;BR&gt;2008.11.15. 23:33:44&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\New Folder\dasblog\bin\...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 140&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;&lt;/CODE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=f3a9a181-0eac-45d0-8b2d-5943337d2c6a"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,f3a9a181-0eac-45d0-8b2d-5943337d2c6a.aspx</comments>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=4c56b6d6-b4d1-4d84-963e-a10d37140e9a</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,4c56b6d6-b4d1-4d84-963e-a10d37140e9a.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,4c56b6d6-b4d1-4d84-963e-a10d37140e9a.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=4c56b6d6-b4d1-4d84-963e-a10d37140e9a</wfw:commentRss>
      <title>Странности метода SetSecurityDescriptor класса Win32_Printer (часть 1)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,4c56b6d6-b4d1-4d84-963e-a10d37140e9a.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,4c56b6d6-b4d1-4d84-963e-a10d37140e9a.aspx</link>
      <pubDate>Fri, 14 Nov 2008 19:21:45 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;В &lt;a href="http://www.sysadmins.lv/PermaLink,guid,41226cf5-e524-446f-85c0-4a958c6c769a.aspx" target="_blank"&gt;первой&lt;/a&gt; и &lt;a href="http://www.sysadmins.lv/PermaLink,guid,54cfbd81-dff6-4391-8ba0-13a17df9bc5f.aspx" target="_blank"&gt;второй&lt;/a&gt; части я рассказал про основные моменты управления принтерами в PowerShell и теперь хочу поговорить о правах на принтеры. Т.к. принтеры управляются с помощью классов WMI, то управление правами доступа к ним будет превращаться в очередную эпохальную эпопею, которую я исследовал при изучении безопасности Share Permissions (вот ссылка на эти статьи в моём прежнем блоге: &lt;a title="http://vpodans.spaces.live.com/lists/cns!BB1419A2CFC1E008!178" href="http://vpodans.spaces.live.com/lists/cns!BB1419A2CFC1E008!178"&gt;http://vpodans.spaces.live.com/lists/cns!BB1419A2CFC1E008!178&lt;/a&gt;). Однако, с принтерами оказалось всё печальней &lt;img alt=":'(" src="/smilies/unhappy.gif"&gt; Мне так и не удалось заставить работать метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa393594(VS.85).aspx" target="_blank"&gt;SetSecurityDescriptor&lt;/a&gt;. Итак, я расскажу о своих кратких исследованиях и в чём же мы имеем проблему.&lt;/p&gt; &lt;p&gt;Для чтения прав доступа принтера потребуется метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa390778(VS.85).aspx" target="_blank"&gt;GetSecurityDescriptor&lt;/a&gt;: &lt;/p&gt; &lt;blockquote&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;&lt;p&gt;[System32] $a=(gwmi win32_printer -filter "name='cutepdf writer'").getsecuritydescriptor()
[System32] $a 

__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Descriptor       : System.Management.ManagementBaseObject
ReturnValue      : 0 


[System32] $a.Descriptor | fl [a-z]* 

ControlFlags     : 32780
DACL             : {System.Management.ManagementBaseObject, System.Management.ManagementBaseObject,System.Mana
gement.ManagementBaseObject, System.Management.ManagementBaseObject...}
Group            : System.Management.ManagementBaseObject
Owner            : System.Management.ManagementBaseObject
SACL             :
TIME_CREATED     : 

[System32] $a.descriptor.dacl[0] | fl [a-z]* 
AccessMask              : 983052
AceFlags                : 0
AceType                 : 0
GuidInheritedObjectType :
GuidObjectType          :
TIME_CREATED            :
Trustee                 : System.Management.ManagementBaseObject 


[System32] $a.descriptor.dacl[0].trustee | fl [a-z]* 

Domain       : Thor
Name         : Admin
SID          : {1, 5, 0, 0...}
SidLength    : 28
SIDString    : S-1-5-21-3020384060-3247076327-363933757-1000
TIME_CREATED : 
 
[System32]&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Как видите, метод &lt;strong&gt;GetSecurityDescriptor&lt;/strong&gt; вернул нам единственный параметр - &lt;strong&gt;Descriptor&lt;/strong&gt;. Заглянув в &lt;strong&gt;Descriptor&lt;/strong&gt;, нам нужно было найти параметр &lt;strong&gt;DACL&lt;/strong&gt;, который уже содержит все пермишены. Подробнее материал изложен тут: &lt;a href="http://msdn.microsoft.com/en-us/library/aa394577.aspx" target="_blank"&gt;WMI Security Descriptor Objects&lt;/a&gt;. 
&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; &lt;u&gt;методы &lt;strong&gt;GetSecurityDescriptor&lt;/strong&gt; и &lt;strong&gt;SetSecurityDescriptor&lt;/strong&gt; доступны только в ОС начиная от &lt;strong&gt;Windows Vista/Windows Server 2008&lt;/strong&gt; и выше.&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Структура &lt;strong&gt;DACL&lt;/strong&gt; содержит в себе как права доступа (&lt;strong&gt;AccessMask&lt;/strong&gt;), так и сведения о пользователе, который имеет указаную AccessMask маску доступа (&lt;strong&gt;Trustee&lt;/strong&gt;). Я попробовал создать идентичную структуру &lt;strong&gt;SecurityDescriptor&lt;/strong&gt; (как описано в ссылке: &lt;a href="http://msdn.microsoft.com/en-us/library/aa394577.aspx" target="_blank"&gt;WMI Security Descriptor Objects&lt;/a&gt;) и получил вот такой скрипт:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;font color="#009500"&gt;# задаём пользователя, которому хотим предоставить доступ&lt;/font&gt;&lt;br&gt;$user = "everyone"&lt;br&gt;&lt;font color="#009500"&gt;# объявляем необходимые классы, которые описывают дескриптор безопасности&lt;/font&gt;&lt;br&gt;$SD = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()&lt;br&gt;$ace = ([WMIClass] "Win32_Ace").CreateInstance()&lt;br&gt;$Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()&lt;br&gt;&lt;font color="#009500"&gt;# преобразовываем имя пользователя в строковый SID и массив байтов для Win32_Trustee&lt;br&gt;&lt;/font&gt;$SID = (new-object security.principal.ntaccount $user).translate([security.principal.securityidentifier])&lt;br&gt;[byte[]] $SIDArray = ,0 * $SID.BinaryLength&lt;br&gt;$SID.GetBinaryForm($SIDArray,0)&lt;br&gt;&lt;font color="#009500"&gt;# заполняем необходимыми данными класс Win32_Trustee&lt;/font&gt;&lt;br&gt;$Trustee.Name = $user&lt;br&gt;$Trustee.SID = $SIDArray&lt;br&gt;&lt;font color="#009500"&gt;# заполняем поля класса Win32_Ace, которые описывают права доступа и заворачиваем&lt;br&gt;# пользователя в лице класса Win32_Trustee&lt;br&gt;# AccessMask в контексте принтера может принимать значения:&lt;br&gt;# 524288 - Take ownership&lt;br&gt;# 131072 - read permissions&lt;br&gt;# 262144 - change permissions&lt;br&gt;# 983088 - manage documents&lt;br&gt;# 983052 - manage printers&lt;br&gt;# 131080 - print + read permissions&lt;/font&gt;&lt;br&gt;$ace.AccessMask = 983052&lt;br&gt;$ace.AceType = 0&lt;br&gt;$ace.AceFlags = 0&lt;br&gt;$ace.Trustee = $Trustee&lt;br&gt;&lt;font color="#009500"&gt;# заворачиваем полученный объект Win32_Ace в параметр DACL класса Win32_SecurityDescriptor&lt;br&gt;&lt;/font&gt;$SD.DACL = $ace&lt;br&gt;&lt;font color="#009500"&gt;# получаем объект принтера, с которым собираемся работать&lt;br&gt;&lt;/font&gt;$Printer = gwmi win32_printer -filter "name='CutePDF Writer'"&lt;br&gt;&lt;font color="#009500"&gt;# получаем свойства метода SetSecurityDescriptor, чтобы в соответствии с ними&lt;br&gt;# завернуть туда SecurityDescriptor&lt;br&gt;&lt;/font&gt;$inParams = $Printer.psbase.GetMethodParameters("SetSecurityDescriptor")&lt;br&gt;&lt;font color="#009500"&gt;# заворачиваем SecurityDescriptor в параметр Descriptor метода SetSecurityDescriptor&lt;/font&gt;&lt;br&gt;$inParams.Descriptor = $SD&lt;br&gt;&lt;font color="#009500"&gt;# применяем метод SetSecurityDescriptor&lt;/font&gt;&lt;br&gt;$Printer.SetSecurityDescriptor($inParams)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;И попробуем его запустить:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[System32] $user = "everyone"
[System32] $SD = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()
[System32] $ace = ([WMIClass] "Win32_Ace").CreateInstance()
[System32] $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
[System32] $SID = (new-object security.principal.ntaccount $user).translate([security.principal.securityidentifier])
[System32] [byte[]] $SIDArray = ,0 * $SID.BinaryLength[System32] $SID.GetBinaryForm($SIDArray,0)
[System32] $Trustee.Name = $user
[System32] $Trustee.SID = $SIDArray
[System32] $ace.AccessMask = 983052
[System32] $ace.AceType = 0
[System32] $ace.AceFlags = 0
[System32] $ace.Trustee = $Trustee
[System32] $SD.DACL = $ace
[System32] $Printer = gwmi win32_printer -filter "name='CutePDF Writer'"
[System32] $inParams = $Printer.psbase.GetMethodParameters("SetSecurityDescriptor")
[System32] $inParams.Descriptor = $SD
[System32] $Printer.SetSecurityDescriptor($inParams)   

__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT :
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
ReturnValue      : 2147749896


[System32]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Как видно, ни одна строка не вернула ошибок, а последняя строка вернула значение &lt;strong&gt;2147749896&lt;/strong&gt;. Прогулявшись по MSDN нашёл описание этой ошибки: &lt;a title="Win32SDToSDDL Method of the Win32_SecurityDescriptorHelper Class" href="http://msdn.microsoft.com/en-us/library/Aa394056(VS.85).aspx"&gt;Win32SDToSDDL Method of the Win32_SecurityDescriptorHelper Class&lt;/a&gt; (практически везде данное значение в контексте SecurityDescriptor интерпретируются так):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One of the parameters to the call is not correct. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;один из параметров вызова указан неверно. Давайте попробуем проанализировать, что мы сформировали и сравним с данными, которые получили методом GetSecurityDescriptor:&lt;/p&gt;
&lt;p&gt;
&lt;blockquote&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[System32] $inparams 

__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     :
__DYNASTY        : __PARAMETERS
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Descriptor       : System.Management.ManagementBaseObject


[System32] $inparams.Descriptor | fl [a-z]* ControlFlags :

DACL         : {System.Management.ManagementBaseObject}
Group        :
Owner        :
SACL         :
TIME_CREATED : 


[System32] $inparams.Descriptor.dacl[0] | fl [a-z]* 

AccessMask              : 983052
AceFlags                : 0
AceType                 : 0
GuidInheritedObjectType :
GuidObjectType          :
TIME_CREATED            :
Trustee                 : System.Management.ManagementBaseObject 


[System32] $inparams.Descriptor.dacl[0].trustee | fl [a-z]* 

Domain       :
Name         : everyone
SID          : {1, 1, 0, 0...}
SidLength    :
SIDString    :
TIME_CREATED : 
[System32]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Если сравнивать с первым листингом, где мы получали текущий SecurityDescriptor, то мы сохранили структуру SecurityDescriptor и в соответствующие поля записали нужные данные. При этом я также пытался для Trustee записать строковый &lt;strong&gt;SIDString&lt;/strong&gt; и &lt;strong&gt;SIDLength&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;$Trustee.SIDString = $SID.Value &lt;br&gt;$Trustee.SIDLength = $SID.BinaryLength&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;и получил уже такой Trustee:&lt;/p&gt;
&lt;p&gt;
&lt;blockquote class="postsub"&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[System32] $inparams.Descriptor.dacl[0].trustee | fl [a-z]* 

Domain       :
Name         : everyone
SID          : {1, 1, 0, 0...}
SidLength    : 12
SIDString    : S-1-1-0
TIME_CREATED : 


[System32]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;От этого результат не изменился. Попробовал вызвать несколько иначе метод SetSecurityDescriptor:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;$Printer.psbase.invokemethod("SetSecurityDescriptor", $inParams, $null)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;и всё по старому. Я попытался нагуглить этот вопрос поисковой фразой "setsecuritydescriptor win32_printer powershell" (да-да, каюсь, я пользуюсь гуглем, как это ни прискорбно). И он мне выдал меньше одной страницы и 2 вменяемые ссылки, одна из которых ведёт на MSDN, а вторая на какой-то французский сайт (в котором я без переводчика плохо понимаю, а жаль) - &lt;a href="http://powershell-scripting.com/index.php?option=com_joomlaboard&amp;amp;Itemid=76&amp;amp;func=view&amp;amp;id=2292&amp;amp;catid=6"&gt;http://powershell-scripting.com/index.php?option=com_joomlaboard&amp;amp;Itemid=76&amp;amp;func=view&amp;amp;id=2292&amp;amp;catid=6&lt;/a&gt;, но человек там творил что-то страшное и я понял, что там помощи не ждать.&lt;/p&gt;
&lt;p&gt;Вобщем, этот вопрос пока остаётся открытым. Что ему не нравится, я пока не могу понять. Управление SecurityDescriptor в WMI - это не самая удачная модель управления безопасностью в WMI, но пока это почти единственный способ добиться результата - приходится с этим работать. Хотя, на первый взгляд может показаться, что там всё страшно и ужасно, но на самом деле, если разобрать предметно вопрос и поупражняться, всё оказывается вполне понятным, хоть и не совсем логичным и не всегда это хочет работать как положено :)&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=4c56b6d6-b4d1-4d84-963e-a10d37140e9a"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,4c56b6d6-b4d1-4d84-963e-a10d37140e9a.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / ACL</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=54cfbd81-dff6-4391-8ba0-13a17df9bc5f</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,54cfbd81-dff6-4391-8ba0-13a17df9bc5f.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,54cfbd81-dff6-4391-8ba0-13a17df9bc5f.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=54cfbd81-dff6-4391-8ba0-13a17df9bc5f</wfw:commentRss>
      <title>Управление принтерами в PowerShell (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,54cfbd81-dff6-4391-8ba0-13a17df9bc5f.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,54cfbd81-dff6-4391-8ba0-13a17df9bc5f.aspx</link>
      <pubDate>Fri, 14 Nov 2008 01:31:03 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;По некоторым причинам я пока не готов разговаривать об управлении безопасностью принтеров в PowerShell, поэтому продолжу начатую тему базового управления. Я обещал, что создам набор необходимых функций, для работы с принтерами и на данный момент приготовил следующие функции:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;New-NetworkPrinter&lt;/strong&gt; - добавляет (мапит) сетевой принтер к пользователю  &lt;li&gt;&lt;strong&gt;Remove-NetworkPrinter&lt;/strong&gt; - удаляет сетевой принтер у пользователя (удаляет только маппинг принтера)  &lt;li&gt;&lt;strong&gt;Set-DefaultPrinter&lt;/strong&gt; - устанавливает выбранный принтер принтером по умолчанию  &lt;li&gt;&lt;strong&gt;Get-Printer&lt;/strong&gt; - получение сведений о выбранном принтере. Как полный набор сведений, так и краткий  &lt;li&gt;&lt;strong&gt;New-PrinterShare&lt;/strong&gt; - расшаривает локальный принтер для общего сетевого доступа  &lt;li&gt;&lt;strong&gt;Remove-PrinterShare&lt;/strong&gt; - отменяет сетевой доступ к принтеру &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; здесь я не буду подробно описывать всё подряд, а расскажу только о тех вещах, которые считаю важными для читателя. Остальное он и сам додумает ;)&lt;/p&gt; &lt;p&gt;Сразу хочу оговориться, что для первых 3-х функций реализована только локальная поддержка (т.е. использовать функции по отношению к другим компьютерам нельзя). Сделано это почему: дело в том, что все WMI операции выполняются (даже на удалённых машинах) в контексте того пользователя, который запустил скрипт. Очень сомнительный смысл мапить для себя принтер на другой машине. Ко всему прочему в классе Win32_Printer не реализована даже поддержка удалённого маппинга принтера. Сейчас я это продемонстрирую:&lt;/p&gt; &lt;p&gt;В классе &lt;a href="http://msdn.microsoft.com/en-us/library/aa394363.aspx" target="_blank"&gt;Win32_Printer&lt;/a&gt; есть замечательный метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa384769(VS.85).aspx"&gt;&lt;strong&gt;AddPrinterConnection&lt;/strong&gt;&lt;/a&gt;, который подключает сетевой принтер к пользователю. Если в MSDN написано, что он есть, значит таконо и есть. Посмотрим:&lt;/p&gt; &lt;blockquote&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] gwmi Win32_Printer | gm -membertype method


   TypeName: System.Management.ManagementObject#root\cimv2\Win32_Printer

Name                  MemberType Definition
----                  ---------- ----------
CancelAllJobs         Method     System.Management.ManagementBaseObject CancelAllJobs()
GetSecurityDescriptor Method     System.Management.ManagementBaseObject GetSecurityDescriptor()
Pause                 Method     System.Management.ManagementBaseObject Pause()
PrintTestPage         Method     System.Management.ManagementBaseObject PrintTestPage()
RenamePrinter         Method     System.Management.ManagementBaseObject RenamePrinter(System.String NewPrinterName)
Reset                 Method     System.Management.ManagementBaseObject Reset()
Resume                Method     System.Management.ManagementBaseObject Resume()
SetDefaultPrinter     Method     System.Management.ManagementBaseObject SetDefaultPrinter()
SetPowerState         Method     System.Management.ManagementBaseObject SetPowerState(System.UInt16 PowerState, Syst...
SetSecurityDescriptor Method     System.Management.ManagementBaseObject SetSecurityDescriptor(System.Management.Mana...


[vPodans]&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Здесь я выбрал список методов объекта Win32_Printer. &lt;em&gt;&lt;u&gt;Но метода AddPrinterConnection мы там не наблюдаем! Почему? А всё потому, что ни один объект Win32_Printer не содержит данный метод! &lt;strong&gt;Метод AddPrinterConnection есть только внутри самого класса Win32_Printer&lt;/strong&gt; и ни одним объектом не наследуется&lt;/u&gt;&lt;/em&gt;. Чтобы убедиться в этом, я вызову новый инстанс класса (не существующего объекта) и просмотрю его методы:&lt;/p&gt;&lt;blockquote&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] [wmiClass]'Win32_Printer' | gm -membertype method


   TypeName: System.Management.ManagementClass#ROOT\cimv2\Win32_Printer

Name                 MemberType Definition
----                 ---------- ----------
AddPrinterConnection Method     System.Management.ManagementBaseObject AddPrinterConnection(System.String Name)


[vPodans]&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Вуаля, вот и наш метод! Ещё раз обратите внимание, что в первом случае я просматривал методы существующего объекта Win32_Printer, во втором же случае я просмотрел методы самого класса и увидел искомый метод. В принципе, можно создать новый инстанс класса на удалённой машине, но я, всё же, не вижу в этом реальной необходимости, поэтому я решил оставить это всё как есть. У кого энтузиазма больше - может поупражняться в этом.&lt;/p&gt;&lt;p&gt;Что касается удаления примапленного принтера, то я рассказывал об этом в первой части. Чтобы не было вопросов, откуда взялся метод Delete, которого мы здесь не увидели (а так же не увидим на сайте MSDN), то сразу отвечу, что это не чистый метод, а скриптметод. Его можно найти, выполнив лишь команду:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;gwmi Win32_Printer | gm -membertype scriptmethod&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;И там он будет. Поехали дальше. Что касается расшаривания принтера для предоставления общего доступа и его отмены. Мы не имеем ни единого метода или скриптметода, который бы это делал. Но если ещё раз и внимательно изучить класс &lt;a href="http://msdn.microsoft.com/en-us/library/aa394363.aspx" target="_blank"&gt;Win32_Printer&lt;/a&gt; на MSDN (ещё раз даю ссылку), то можно заметить, что некоторые свойства объектов имеют &lt;strong&gt;Access Type: Read/Write&lt;/strong&gt;. Именно этим мы и воспользуется:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class="postsub"&gt;&lt;pre style="font: 9pt courier new; color: #fff; background-color: black"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[System32] (gwmi Win32_Printer -Filter "name='CutePDF Writer'").shared
False
[System32] $a = gwmi Win32_Printer -Filter "name='CutePDF Writer'"
[System32] $a.shared = $True
[System32] $a.put()


Path          : \\localhost\root\cimv2:Win32_Printer.DeviceID="CutePDF Writer"
RelativePath  : Win32_Printer.DeviceID="CutePDF Writer"
Server        : localhost
NamespacePath : root\cimv2
ClassName     : Win32_Printer
IsClass       : False
IsInstance    : True
IsSingleton   : False



[System32] (gwmi Win32_Printer -Filter "name='CutePDF Writer'").shared
True
[System32]&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Итак, что же я сделал. Первой строкой я просмотрел свойство &lt;strong&gt;Shared&lt;/strong&gt; для принтера &lt;em&gt;CutePDF Writer&lt;/em&gt; и получил его значение - &lt;strong&gt;False&lt;/strong&gt;. Это значит, что принтер просто локальный и не предоставлен в общий доступ. Далее, я изменил свойство &lt;strong&gt;Shared&lt;/strong&gt; на &lt;strong&gt;True&lt;/strong&gt;, предоставив его в общий доступ. Но это я только изменил свойство в переменной &lt;strong&gt;$a&lt;/strong&gt;, но не в самом объекте. Чтобы записать изменения в объект я выполняю скриптметод &lt;strong&gt;put()&lt;/strong&gt; и изменения уже записываются в сам объект принтера. Для верности я снова просмотрел свойство Shared и увидел мои изменения (вместо False получил &lt;strong&gt;True&lt;/strong&gt;), т.е. принтер расшарился. Отмена предоставления принтера в общий доступ делается с точностью наоборот, а именно - свойство &lt;strong&gt;Shared&lt;/strong&gt; выставляется обратно в &lt;strong&gt;False&lt;/strong&gt; и изменения записываются командой &lt;strong&gt;put()&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; &lt;u&gt;при первом расшаривании принтера, кроме свойства Shared следует заполнить свойство ShareName&lt;/u&gt;, под которым он будет виден в сети. Так же выставив свойство Published в True мы можем опубликовать принтер в службе Active Directory.&lt;/p&gt;&lt;p&gt;На основе вышеизложенного материала напишем 6 несложных функций, которые обеспечивают базовый (это далеко не всё, что мы можем сделать с классом Win32_Printer) функционал по управлению принтерами:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#009500"&gt;######################################################## &lt;br&gt;# BasicPrinterUtils.ps1 &lt;br&gt;# Version 1.0 &lt;br&gt;# &lt;br&gt;# Functions for basic printer management &lt;br&gt;# &lt;br&gt;# Vadims Podans (c) 2008 &lt;br&gt;# &lt;/font&gt;&lt;a href="http://www.sysadmins.lv/"&gt;&lt;font color="#009500"&gt;http://www.sysadmins.lv/&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;font color="#009500"&gt;########################################################&lt;/font&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;function New-NetworkPrinter ($computer, $name) { &lt;br&gt;([wmiclass]'Win32_Printer').AddPrinterConnection("\\$computer\$name") &lt;br&gt;} &lt;/font&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;function Remove-NetworkPrinter ($name) { &lt;br&gt;if ($name) {(gwmi Win32_Printer -Filter "sharename='$name'").delete()} &lt;br&gt;else {(gwmi Win32_Printer -Filter "local='$false'").delete()} &lt;br&gt;} &lt;/font&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;function Set-DefaultPrinter ($name) { &lt;br&gt;if (!$name) {Write-Host "Не указано имя принтера. Операция прервана"} &lt;br&gt;else {$internal = gwmi win32_Printer -Filter "name='$name'" &lt;br&gt;$internal.setdefaultprinter()} &lt;br&gt;} &lt;/font&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;function Get-Printer ($computer, $name, $full) { &lt;br&gt;$internal = gwmi Win32_Printer -ComputerName $computer -Filter "name='$name'" &lt;br&gt;# здесь я предлагаю получить как полный набор свойств, так и упрощённый вывод сведений. &lt;br&gt;if ($full) {$internal | select *} else {Write-Host $internal} &lt;br&gt;} &lt;/font&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;function New-PrinterShare ($computer, $name, $ShareName) { &lt;br&gt;$internal = gwmi win32_Printer -ComputerName $computer -Filter "name='$name'" &lt;br&gt;if ($internal) {$internal.shared = $true; $internal.ShareName = $ShareName; $internal.put()} &lt;br&gt;else {Write-Host "Указано неверное имя принтера"} &lt;br&gt;} &lt;/font&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;function Remove-PrinterShare ($computer, $name) { &lt;br&gt;if ($name) {$internal = gwmi Win32_Printer -Filter "name='$name'"; $internal.shared = $false; $internal.put()} &lt;br&gt;else {gwmi Win32_Printer -Filter "shared='$true'" | %{$_.shared = $false; $_.put()}} &lt;br&gt;} &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Полагаю, что здесь комментировать особо нечего, т.к. тут всё очень просто и понятно. На этом пока всё. Продолжение, полагаю, следует. :)&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.sysadmins.lv/content/binary/BasicPrinterUtils.ps1.txt"&gt;BasicPrinterUtils.ps1 (1,6 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=54cfbd81-dff6-4391-8ba0-13a17df9bc5f"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,54cfbd81-dff6-4391-8ba0-13a17df9bc5f.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=41226cf5-e524-446f-85c0-4a958c6c769a</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,41226cf5-e524-446f-85c0-4a958c6c769a.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,41226cf5-e524-446f-85c0-4a958c6c769a.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=41226cf5-e524-446f-85c0-4a958c6c769a</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Управление принтерами в PowerShell (часть 1)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,41226cf5-e524-446f-85c0-4a958c6c769a.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,41226cf5-e524-446f-85c0-4a958c6c769a.aspx</link>
      <pubDate>Mon, 10 Nov 2008 20:06:45 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Ни для кого не секрет, что PowerShell умеет управлять принтерами. Для этого используются как WMI классы, так и COM объекты. При этом управление ими из PowerShell совсем не сложное. WMI представляет следующие классы:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa394363.aspx" target=_blank&gt;Win32_Printer&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa394364(VS.85).aspx" target=_blank&gt;Win32_PrinterConfiguration&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa394366(VS.85).aspx" target=_blank&gt;Win32_PrinterDriver&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa394367(VS.85).aspx" target=_blank&gt;Win32_PrinterDriverDll&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa394370(VS.85).aspx" target=_blank&gt;Win32_PrintJob&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Итак, самое простое - перечисление принтеров:&lt;/P&gt;&lt;PRE class=code style="WIDTH: 97.95%; HEIGHT: 70px"&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;&lt;FONT size=2&gt;Write-Host &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: maroon"&gt;"`tLocal Printers"
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;gwmi &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;win32_printer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;-Filter &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"Local='$true'" &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;| &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;ft &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Drivername &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: black"&gt;-a
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Write-Host &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: maroon"&gt;"`tNetwork Printers"
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;gwmi &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;win32_printer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;-Filter &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"Local='$false'" &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;| &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;ft &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Drivername&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;ServerName &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;-a&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;Здесь я вывожу 2 списка принтеров - которые подключены локально и сетевые принтеры. Фильтрация осуществляется по свойству Local, которое может быть или &lt;STRONG&gt;$true&lt;/STRONG&gt; или &lt;STRONG&gt;$false&lt;/STRONG&gt;. Так же можно посмотреть, какие принтеры расшарены для других пользователей:&lt;/P&gt;&lt;PRE class=code style="WIDTH: 97.79%; HEIGHT: 34px"&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;&lt;FONT size=2&gt;Write-Host &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: maroon"&gt;"`tShared Printers"
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;gwmi &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;win32_printer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;-Filter &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"Shared='$true'" &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;| &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;ft &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;ShareName &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;-a&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;Безусловно, как и остальные классы WMI, класс Win32_Printer позволяет удалённо подключаться к принтсерверу с использованием параметра &lt;STRONG&gt;-ComputerName.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Так же можно посмотреть текущие настройки принтера:&lt;/P&gt;&lt;PRE class=code style="WIDTH: 97.81%; HEIGHT: 17px"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;gwmi &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Win32_PrinterConfiguration &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;| &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;ft &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Caption&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;XResolution&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;YResolution&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;PaperSize &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;-a&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;Этой командой я увижу основные параметры качества печати и текущий размер используемой бумаги. Дополнительные свойства описаны в классе Win32_PrinterConfiguration и описывать их тут смысла нету.&lt;/P&gt;
&lt;P&gt;Классы Win32_PrinterDriver и Win32_PrinterDriverDll несут лишь справочную информацию о драйверах принтеров и реальное применение им я представляю слабо и рассматривать не буду.&lt;/P&gt;
&lt;P&gt;Класс &lt;STRONG&gt;Win32_PrintJob&lt;/STRONG&gt; показывает текущее состояние очереди печати принтера. Например, сейчас мой принтер печатает тестовую страницу:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="FONT: 9pt courier new; COLOR: #fff; BACKGROUND-COLOR: black"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;[user name] gwmi Win32_Printjob | select *


Document         : Test Page
JobId            : 3
JobStatus        : Printing
Name             : Новая оргтехника, 3
PagesPrinted     : 0
Status           : OK
__GENUS          : 2
__CLASS          : Win32_PrintJob
__SUPERCLASS     : CIM_Job
__DYNASTY        : CIM_ManagedSystemElement
__RELPATH        : Win32_PrintJob.Name="Новая оргтехника, 3"
__PROPERTY_COUNT : 24
__DERIVATION     : {CIM_Job, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER         : CAMELOT
__NAMESPACE      : root\cimv2
__PATH           : \\CAMELOT\root\cimv2:Win32_PrintJob.Name="Новая оргтехника, 3"
Caption          : Новая оргтехника, 3
DataType         : NT EMF 1.008
Description      : Новая оргтехника, 3
DriverName       : HP Photosmart D6100 series
ElapsedTime      :
HostPrintQueue   : \\CAMELOT
InstallDate      :
Notify           : user name
Owner            : user name
Parameters       :
PrintProcessor   : hpzpp4pi
Priority         : 1
Size             : 114944
StartTime        :
StatusMask       : 16
TimeSubmitted    : 20081110195514.849000+120
TotalPages       : 1
UntilTime        :
&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Здесь видно, на какой принтер идёт печать, имя документа, статус печати, размер документа, имя пользователя, от которого производится печать и др. Кстати говоря, параметр &lt;STRONG&gt;JobId&lt;/STRONG&gt; показывает количество отправленных заданий с момента последнего перезапуска спулера печати. Так же хочу заметить, что Win32_PrintJob возвращает информацию только при наличии заданий в спулере. Когда принтер простаивает, то данный класс ничего не возвращает.&lt;/P&gt;
&lt;P&gt;Теперь настало время поговорить, как подключать новые принтеры и удалять текущие принтеры. Подключать принтеры можно как с помощью &lt;STRONG&gt;WMI&lt;/STRONG&gt;, так и с помощью &lt;STRONG&gt;COM&lt;/STRONG&gt;:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;WMI&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;PRE class=code style="WIDTH: 98.02%; HEIGHT: 18px"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: black"&gt;([&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;wmiclass&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;'Win32_Printer'&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;).AddPrinterConnection(&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"\\server\Printername"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;COM&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;PRE class=code style="WIDTH: 98.14%; HEIGHT: 15px"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;New-Object -ComObject &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;WScript.Network&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;).AddWindowsPrinterConnection(&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"\\Server\PrinterName"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;)&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;EM&gt;&lt;U&gt;При этом важно отметить, что при получении объекта &lt;STRONG&gt;Win32_Printer&lt;/STRONG&gt; в нём метод &lt;STRONG&gt;AddPrinterConnection&lt;/STRONG&gt; не содержится, т.к. данный метод содержится в самом классе &lt;STRONG&gt;Win32_Printer&lt;/STRONG&gt;.&lt;/U&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Удаление принтера производится при помощи метода &lt;STRONG&gt;Delete&lt;/STRONG&gt;:&lt;/P&gt;&lt;PRE class=code style="WIDTH: 98.03%; HEIGHT: 17px"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;gwmi &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Win32_Printer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;-Filter &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"name='PrinterName'"&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;).delete()&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;Таким образом удаляется только один принтер. Все принтеры удаляются без указания фильтра:&lt;/P&gt;&lt;PRE class=code style="WIDTH: 97.88%; HEIGHT: 16px"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;gwmi &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;Win32_Printer&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;).delete()&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;Например, недавно на ньюсгруппах был вопрос, как для развёртывания нового принтсервера удалить со всех компьютеров домена. Задача решалась в несколько строк:&lt;/P&gt;&lt;PRE class=code style="WIDTH: 98.01%; HEIGHT: 66px"&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: purple"&gt;$filter &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;= &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: maroon"&gt;"(objectcategory=computer)"
&lt;/SPAN&gt;&lt;SPAN style="COLOR: purple"&gt;$ds &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;= &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;New-object &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;System.DirectoryServices.DirectorySearcher&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;([&lt;/SPAN&gt;&lt;SPAN style="COLOR: teal"&gt;ADSI&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;""&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;,&lt;/SPAN&gt;&lt;SPAN style="COLOR: purple"&gt;$filter&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: black"&gt;)
&lt;/SPAN&gt;&lt;SPAN style="COLOR: purple"&gt;$computers &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;= &lt;/SPAN&gt;&lt;SPAN style="COLOR: purple"&gt;$ds&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;.Findall() | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: navy"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;SPAN style="COLOR: black"&gt;.properties.name}
&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;foreach &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: purple"&gt;$computer &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;in &lt;/SPAN&gt;&lt;SPAN style="COLOR: purple"&gt;$computers&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;gwmi &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;win32_printer &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;-computername &lt;/SPAN&gt;&lt;SPAN style="COLOR: maroon"&gt;"$computer" &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;| &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: navy"&gt;$_&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="COLOR: black"&gt;&lt;FONT size=2&gt;.delete()}
&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/PRE&gt;На сегодня, я думаю, это всё. Во второй части я планирую поговорить о чтении и установке пермишенов на принтеры с использованием PowerShell.&lt;/SPAN&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=41226cf5-e524-446f-85c0-4a958c6c769a"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,41226cf5-e524-446f-85c0-4a958c6c769a.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / WMI</category>
    </item>
  </channel>
</rss>