<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>PowerShell и другие скрипты</title>
	<atom:link href="http://xaegr.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://xaegr.wordpress.com</link>
	<description>Get-Command &#124; Out-Blog</description>
	<lastBuildDate>Tue, 04 Oct 2011 19:05:37 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='xaegr.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>PowerShell и другие скрипты</title>
		<link>http://xaegr.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://xaegr.wordpress.com/osd.xml" title="PowerShell и другие скрипты" />
	<atom:link rel='hub' href='http://xaegr.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Многопоточный сканер сети</title>
		<link>http://xaegr.wordpress.com/2011/07/12/threadping/</link>
		<comments>http://xaegr.wordpress.com/2011/07/12/threadping/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 07:49:46 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[2.0]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Ping]]></category>
		<category><![CDATA[Threads]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/2011/07/12/threadping/</guid>
		<description><![CDATA[Натолкнулся в форумах на просьбу написать сканер сети работающий в несколько потоков, но на скриптах Задачка показалась мне интересной и даже полезной, поэтому родился вот такой скриптик: ThreadPing.ps1 Param ( [string[]]$Address = $(1..20 &#124; %{&#34;192.168.1.$_&#34;}), [int]$Threads = 5 ) write-host &#34;Distributing addresses around jobs&#34; $JobAddresses = @{} $CurJob = 0 $CurAddress = 0 while ($CurAddress [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=867&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Натолкнулся в форумах на просьбу написать сканер сети работающий в несколько потоков, но на скриптах <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/07/wlemoticon-smile.png?w=780" /> Задачка показалась мне интересной и даже полезной, поэтому родился вот такой скриптик:</p>
<p><strong>ThreadPing.ps1</strong></p>
<pre class="PowerShellColorizedScript"><span style="color:#00008b;">Param</span> <span style="color:#000000;">(</span>
<span style="color:#008080;">[string[]]</span><span style="color:#ff4500;">$Address</span> <span style="color:#a9a9a9;">=</span> <span style="color:#000000;">$(</span><span style="color:#800080;">1</span><span style="color:#a9a9a9;">..</span><span style="color:#800080;">20</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">%</span><span style="color:#000000;">{</span><span style="color:#8b0000;">&quot;192.168.1.$_&quot;</span><span style="color:#000000;">}</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">,</span>
<span style="color:#008080;">[int]</span><span style="color:#ff4500;">$Threads</span> <span style="color:#a9a9a9;">=</span> <span style="color:#800080;">5</span>
<span style="color:#000000;">)</span>            

<span style="color:#0000ff;">write-host</span> <span style="color:#8b0000;">&quot;Distributing addresses around jobs&quot;</span>
<span style="color:#ff4500;">$JobAddresses</span> <span style="color:#a9a9a9;">=</span> <span style="color:#000000;">@{</span><span style="color:#000000;">}</span>
<span style="color:#ff4500;">$CurJob</span> <span style="color:#a9a9a9;">=</span> <span style="color:#800080;">0</span>
<span style="color:#ff4500;">$CurAddress</span> <span style="color:#a9a9a9;">=</span> <span style="color:#800080;">0</span>
<span style="color:#00008b;">while</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$CurAddress</span> <span style="color:#a9a9a9;">-lt</span> <span style="color:#ff4500;">$Address</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">count</span><span style="color:#000000;">)</span>
<span style="color:#000000;">{</span>
    <span style="color:#ff4500;">$JobAddresses</span><span style="color:#a9a9a9;">[</span><span style="color:#ff4500;">$CurJob</span><span style="color:#a9a9a9;">]</span> <span style="color:#a9a9a9;">+=</span> <span style="color:#000000;">@(</span><span style="color:#ff4500;">$Address</span><span style="color:#a9a9a9;">[</span><span style="color:#ff4500;">$CurAddress</span><span style="color:#a9a9a9;">]</span><span style="color:#000000;">)</span>
    <span style="color:#ff4500;">$CurAddress</span><span style="color:#a9a9a9;">++</span>
    <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$CurJob</span> <span style="color:#a9a9a9;">-eq</span> <span style="color:#ff4500;">$Threads</span> <span style="color:#a9a9a9;">-</span><span style="color:#800080;">1</span><span style="color:#000000;">)</span>
    <span style="color:#000000;">{</span>
        <span style="color:#ff4500;">$CurJob</span> <span style="color:#a9a9a9;">=</span> <span style="color:#800080;">0</span>
    <span style="color:#000000;">}</span>
    <span style="color:#00008b;">else</span>
    <span style="color:#000000;">{</span>
        <span style="color:#ff4500;">$CurJob</span><span style="color:#a9a9a9;">++</span>
    <span style="color:#000000;">}</span>
<span style="color:#000000;">}</span>            

<span style="color:#ff4500;">$Jobs</span> <span style="color:#a9a9a9;">=</span> <span style="color:#000000;">@(</span><span style="color:#000000;">)</span>
<span style="color:#00008b;">foreach</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$n</span> <span style="color:#00008b;">in</span> <span style="color:#800080;">0</span> <span style="color:#a9a9a9;">..</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Threads</span><span style="color:#a9a9a9;">-</span><span style="color:#800080;">1</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
<span style="color:#000000;">{</span>
    <span style="color:#0000ff;">Write-host</span> <span style="color:#8b0000;">&quot;Starting job $n, for addresses $($JobAddresses[$n])&quot;</span>
    <span style="color:#ff4500;">$Jobs</span> <span style="color:#a9a9a9;">+=</span> <span style="color:#0000ff;">Start-Job</span> <span style="color:#000080;">-ArgumentList</span> <span style="color:#ff4500;">$JobAddresses</span><span style="color:#a9a9a9;">[</span><span style="color:#ff4500;">$n</span><span style="color:#a9a9a9;">]</span> <span style="color:#000080;">-ScriptBlock</span> <span style="color:#000000;">{</span>
        <span style="color:#ff4500;">$ping</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">new-object</span> <span style="color:#8a2be2;">System.Net.NetworkInformation.Ping</span>
        <span style="color:#00008b;">Foreach</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Ip</span> <span style="color:#00008b;">in</span> <span style="color:#ff4500;">$Args</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            <span style="color:#00008b;">trap</span> <span style="color:#000000;">{</span>
                <span style="color:#0000ff;">new-object</span> <span style="color:#8a2be2;">psobject</span> <span style="color:#000080;">-Property</span> <span style="color:#000000;">{</span>
                    <span style="color:#0000ff;">Status</span> <span style="color:#8a2be2;">=</span> <span style="color:#8b0000;">&quot;Error: $_&quot;</span>
                    <span style="color:#0000ff;">Address</span> <span style="color:#8a2be2;">=</span> <span style="color:#ff4500;">$Ip</span>
                    <span style="color:#0000ff;">RoundtripTime</span> <span style="color:#8a2be2;">=</span> <span style="color:#800080;">0</span>
                <span style="color:#000000;">}</span>
                <span style="color:#00008b;">Continue</span>
            <span style="color:#000000;">}</span>
            <span style="color:#ff4500;">$ping</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">send</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$Ip</span><span style="color:#a9a9a9;">,</span><span style="color:#800080;">100</span><span style="color:#000000;">)</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">select</span> <span style="color:#000000;">`
</span>                <span style="color:#000000;">@{</span><span style="color:#000000;">name</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">&quot;Status&quot;</span><span style="color:#000000;">;</span> <span style="color:#000000;">expression</span><span style="color:#a9a9a9;">=</span><span style="color:#000000;">{</span><span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Status</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">ToString</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">}</span><span style="color:#000000;">}</span><span style="color:#a9a9a9;">,</span>
                <span style="color:#000000;">@{</span><span style="color:#000000;">name</span> <span style="color:#a9a9a9;">=</span> <span style="color:#8b0000;">&quot;Address&quot;</span><span style="color:#000000;">;</span> <span style="color:#000000;">expression</span><span style="color:#a9a9a9;">=</span><span style="color:#000000;">{</span><span style="color:#ff4500;">$Ip</span><span style="color:#000000;">}</span><span style="color:#000000;">}</span><span style="color:#a9a9a9;">,</span> <span style="color:#8a2be2;">RoundtripTime</span>
        <span style="color:#000000;">}</span>
    <span style="color:#000000;">}</span>
<span style="color:#000000;">}</span>            

<span style="color:#0000ff;">write-host</span> <span style="color:#8b0000;">&quot;Waiting for jobs&quot;</span>
<span style="color:#ff4500;">$ReceivedJobs</span> <span style="color:#a9a9a9;">=</span> <span style="color:#800080;">0</span>
<span style="color:#00008b;">while</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$ReceivedJobs</span> <span style="color:#a9a9a9;">-le</span> <span style="color:#ff4500;">$Jobs</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Count</span><span style="color:#000000;">)</span>
<span style="color:#000000;">{</span>
    <span style="color:#00008b;">foreach</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$CompletedJob</span> <span style="color:#00008b;">in</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Jobs</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">where</span> <span style="color:#000000;">{</span><span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">State</span> <span style="color:#a9a9a9;">-eq</span> <span style="color:#8b0000;">&quot;Completed&quot;</span><span style="color:#000000;">}</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
    <span style="color:#000000;">{</span>
        <span style="color:#0000ff;">Receive-Job</span> <span style="color:#ff4500;">$CompletedJob</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">select</span> <span style="color:#8a2be2;">status</span><span style="color:#a9a9a9;">,</span> <span style="color:#8a2be2;">address</span><span style="color:#a9a9a9;">,</span> <span style="color:#8a2be2;">roundtriptime</span>
        <span style="color:#ff4500;">$ReceivedJobs</span> <span style="color:#a9a9a9;">++</span>
        <span style="color:#0000ff;">sleep</span> <span style="color:#800080;">1</span>
    <span style="color:#000000;">}</span>
<span style="color:#000000;">}</span>            

<span style="color:#0000ff;">Remove-Job</span> <span style="color:#ff4500;">$Jobs</span>
<span style="color:#0000ff;">write-host</span> <span style="color:#8b0000;">&quot;Done.&quot;</span></pre>
<p>&#160;</p>
<p>У скрипта два аргумента:</p>
<ul>
<li>Threads – число потоков </li>
<li>Address – диапазон ip-адресов в виде массива строк. Например чтобы просканировать адреса с 192.168.1.1 по 192.168.1.254 можно использовать следующую конструкцию: 1..254 | ${&quot;192.168.1.$_&quot;} </li>
</ul>
<p>Пример использования:</p>
<pre>PS &gt; .\ThreadPing.ps1 -Address (1..20|%{&quot;192.168.1.$_&quot;}) -threads 5
Distributing addresses around jobs
Starting job 0, for addresses 192.168.1.1 192.168.1.6 192.168.1.11 192.168.1.16
Starting job 1, for addresses 192.168.1.2 192.168.1.7 192.168.1.12 192.168.1.17
Starting job 2, for addresses 192.168.1.3 192.168.1.8 192.168.1.13 192.168.1.18
Starting job 3, for addresses 192.168.1.4 192.168.1.9 192.168.1.14 192.168.1.19
Starting job 4, for addresses 192.168.1.5 192.168.1.10 192.168.1.15 192.168.1.20
Waiting for jobs

Done.
Status   Address      RoundtripTime
------   -------      -------------
TimedOut 192.168.1.2              0
TimedOut 192.168.1.7              0
Success  192.168.1.12             1
TimedOut 192.168.1.17             0
Success  192.168.1.1              0
Success  192.168.1.6              1
TimedOut 192.168.1.11             0
TimedOut 192.168.1.16             0
Success  192.168.1.3             10
TimedOut 192.168.1.8              0
TimedOut 192.168.1.13             0
TimedOut 192.168.1.18             0
TimedOut 192.168.1.4              0
TimedOut 192.168.1.9              0
TimedOut 192.168.1.14             0
TimedOut 192.168.1.19             0
TimedOut 192.168.1.5              0
TimedOut 192.168.1.10             0
TimedOut 192.168.1.15             0
TimedOut 192.168.1.20             0</pre>
<p>Так как вывод полностью объектный, в лучших традициях PowerShell’а, то результатами легко оперировать. Например, чтобы получить лишь отзывающиеся на пинг хосты, можно использовать where:</p>
<pre>.\ThreadPing.ps1 -Address (1..254|%{&quot;192.168.1.$_&quot;}) -threads 20 |
	where {$_.status -eq &quot;success&quot;}</pre>
<p>A что бы выбрать лишь адреса, достаточно добавить Select –ExpandProperty</p>
<pre>$IPs = 1..3 | %{$s=$_; 1..254 | %{&quot;192.168.$s.$_&quot;}}
.\ThreadPing.ps1 -Address $Ips -threads 20 |
	where {$_.status -eq &quot;success&quot;} |
		Select -expandproperty Address</pre>
<p>&#160;</p>
<p>Да, кстати, сценарий использует фоновые работы, поэтому будет работать только в PowerShell 2.0, но я надеюсь все мои читатели уже до него <a href="http://support.microsoft.com/kb/968929/ru">обновились</a> <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/07/wlemoticon-smile.png?w=780" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/867/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/867/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/867/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=867&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2011/07/12/threadping/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/07/wlemoticon-smile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/07/wlemoticon-smile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Запуск политик Opalis</title>
		<link>http://xaegr.wordpress.com/2011/04/27/opalis-4-start-policy/</link>
		<comments>http://xaegr.wordpress.com/2011/04/27/opalis-4-start-policy/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 07:21:00 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[Opalis]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/?p=843</guid>
		<description><![CDATA[В нашем Opalis’е уже завелась первая простенькая политика и в этом посте я расскажу каким образом её можно запустить и заставить работать Запускать политику можно в нескольких режимах. Сначала мы рассмотрим первый и основной – режим выполнения на Action Server’е. В таком режиме политика выполняется в полностью автоматическом режиме, под учетной записью службы Opalis Action [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=843&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img style="background-image:none;padding-left:0;padding-right:0;display:inline;float:left;padding-top:0;border-width:0;margin:0 10px 0 0;" title="image" border="0" alt="image" align="left" src="http://xaegr.files.wordpress.com/2011/04/image13.png?w=244&#038;h=132" width="244" height="132" />В нашем Opalis’е уже завелась первая простенькая политика и в этом посте я расскажу каким образом её можно запустить и заставить работать <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile2.png?w=780" /></p>
<p>Запускать политику можно в нескольких режимах. Сначала мы рассмотрим первый и основной – режим выполнения на Action Server’е.</p>
<p>В таком режиме политика выполняется в полностью автоматическом режиме, под учетной записью службы Opalis Action Service.</p>
<p>Чтобы запустить нашу политику в этом режиме, надо лишь подтвердить все изменения в ней нажав кнопку Check In, а затем кнопку Start на панели инструментов. Теперь политика будет выполняться на сервере, каждый час, как мы и задали в настройках её первого элемента.</p>
<p>Клиент Opalis в выполнении политики не учавствует, его можно спокойно закрывать – политика выполняется на Action Server.</p>
<p>Отслеживать результаты её выполнения можно с помощью закладок в нижней части клиента Opalis. Каждый запуск отображается на вкладке Log History как отдельная запись.</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image7.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb7.png?w=316&#038;h=98" width="316" height="98" /></a></p>
<p>Дважды щелкнув на этой записи, можно просмотреть этапы выполнения политики:</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image8.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb8.png?w=244&#038;h=185" width="244" height="185" /></a></p>
<p>Правда, не слишком подробно. В этом журнале отображается достаточно мало информации об элементах. Это разумное решение – незачем засорять базу данных подробностями выполнения элементов. Обычно достататочно лишь статуса и сообщения об ошибке если она произошла.</p>
<p>Если же вам интересно больше подробностей о выполнении политики, или вы хотите выловить причину какой то ошибки, то вам будет полезен другой режим выполнения политик – тестовый.</p>
<p>При тестировании политика выполняется не на Action Server, а на компьютере на котором установлен клиент Opalis (в случае если это разные компьютеры). Кроме того, при тестировании испольуется учетная запись текущего пользователя.</p>
<p>Для запуска политики в таком режиме, надо выбрать в панели инструментов клиента Opalis пункт Test<a href="http://xaegr.files.wordpress.com/2011/04/image9.png"><img style="display:inline;margin:0 0 0 10px;" title="image" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb9.png?w=27&#038;h=12" width="27" height="12" /></a>. Откроется Policy Testing Console, специальный отладочный интерпретатор политик.</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image10.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb10.png?w=393&#038;h=280" width="393" height="280" /></a></p>
<p>Давайте кратко рассмотрим его элементы. Во-первых это панель инструментов, позволяющая запустить политику на выполнение с автоматическим переходом с элемента на элемент или в пошаговом режиме. Кроме того можно создавать точки останова (breakpoint) на тех элементах на которых вы хотите приостановить выполнение.</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image11.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb11.png?w=244&#038;h=23" width="244" height="23" /></a></p>
<p>На верхней правой части экрана останавливаться не будем, там всё достаточно очевидно – отображается политика и текущий выполняемый элемент.</p>
<p>Если вы выберите один из этих элементов, то в левой части экрана отобразятся его входные параметры. В нижней части – заданные на этапе разработки, а в верхней части – текущие, актуальные значения. Что интересно, актуальные значения можно поменять прямо на ходу.</p>
<p>В правой нижней части экрана есть возможность изучить группы компьютеров, переменные, счетчики и т.д. Они нам пока не нужны, о них я расскажу в другой раз.</p>
<p>Самое же интересное расположено в центре нижней части экрана. Это список выполнившихся шагов политики и текущего шага. Эти элементы можно развернуть, и просмотреть все свойства элемента политики (и настройки, и входные данные и выходные) и их значения.</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image12.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb12.png?w=336&#038;h=216" width="336" height="216" /></a></p>
<p>На этом пока всё<img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile2.png?w=780" /> В следующем посте расскажу о других методов старта политики кроме запуска каждые n дней/часов/минут.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/843/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/843/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/843/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/843/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/843/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/843/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/843/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/843/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/843/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/843/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/843/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/843/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/843/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/843/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=843&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2011/04/27/opalis-4-start-policy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image13.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile2.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb7.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb8.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb9.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb10.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb11.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb12.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile2.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Создание политик в Opalis</title>
		<link>http://xaegr.wordpress.com/2011/04/17/opalis-3-create-policy/</link>
		<comments>http://xaegr.wordpress.com/2011/04/17/opalis-3-create-policy/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 12:54:38 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[Opalis]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/?p=811</guid>
		<description><![CDATA[Opalis Integration Server установлен и теперь можно приступать к созданию политик. Создать политику очень просто, достаточно запустить консоль Opalis Client, в дереве слева выбрать пункт Policies и открыв его контекстное меню, выбрать пункт New \ Policy. Отображаются политики в виде закладок. Щелкнув на такой закладке правой кнопкой, вы откроете контекстное меню, в котором можно переименовать [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=811&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://xaegr.files.wordpress.com/2011/04/image.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;float:left;padding-top:0;border-width:0;margin:0 5px 0 10px;" title="image" border="0" alt="image" align="left" src="http://xaegr.files.wordpress.com/2011/04/image_thumb.png?w=183&#038;h=109" width="183" height="109" /></a>Opalis Integration Server установлен и теперь можно приступать к созданию политик. Создать политику очень просто, достаточно запустить консоль Opalis Client, в дереве слева выбрать пункт Policies и открыв его контекстное меню, выбрать пункт New \ Policy. Отображаются политики в виде закладок. Щелкнув на такой закладке правой кнопкой, вы откроете контекстное меню, в котором можно переименовать политику, запустить и остановить её или настроить другие свойства.</p>
<p>Для начала, давайте создадим новую политику, и назовём её “Remove old files”. Эта простая политика будет запускаться каждый час и перемещать все файлы старше 30 дней из папки Share в папку Old, а после этого записывать имя файла в Archive.log.</p>
<p><span id="more-811"></span>
<p>В первую очередь мы создадим набросок политики, перетащив в центральную область элементы политик из списка справа. Из группы Scheduling нам понадобится элемент Monitor Date/Time, затем Move File из группы File Management и Append Line из Text File Management.</p>
<p>Эти элементы надо соеденить друг с другом. Для этого наводим курсор на исходный элемент, ждём пока появится треугольная стрелка справа от элемента и перетаскиваем её на целевой элемент. В результате у нас должна получиться примерно такая конструкция:</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image1.png"><img style="display:inline;margin:0 0 0 10px;" title="image" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb1.png?w=172&#038;h=65" width="172" height="65" /></a></p>
<p>В общих чертах логика готова <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile1.png?w=780" /> Однако, чтобы политика действительно заработала, нам понадобится настроить кое-какие подробности в свойствах этих элементов.</p>
<p>Первым будет Monitor Date/Time. Открываем его свойства с помощью пункта Properties контекстного меню или просто двойным щелчком на элементе.</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image16.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb14.png?w=610&#038;h=410" width="610" height="410" /></a></p>
<p>Тут нам надо задать интервал срабатывания элемента. Поставив его равным 1 часу, мы добъёмся того, что политика будет стартовать каждый час. Галочка Trigger immediately указывает, что первое срабатывание должно произойти сразу после развёртывания политики.</p>
<p>Нажимаем Finish и переходим к следующему элементу – Move File. Здесь понадобится задать немного больше опций. Во-первых откуда и куда мы будем перемещать файлы:</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image17.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb15.png?w=610&#038;h=410" width="610" height="410" /></a></p>
<p>Во-вторых, во вкладке Advanced нам надо задать значения Filter, указав, что перемещать надо только файлы старше 30 дней:</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image18.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb16.png?w=611&#038;h=411" width="611" height="411" /></a></p>
<p>Снова нажимаем Finish и переходим к свойствам Append Line. Тут кроме простого задания имени и кодировки файла в который мы будем добавлять строку, нам надо задать собственно текст этой строки. При этом в текст надо вставить имена перемещаемых файлов. Тут уже начинается самое интересное – нам на помощь приходит “Data bus”, так называемая “шина данных” позволяющая одним объектам, получать данные от других связанных объектов, выполнившихся ранее. </p>
<p>Но, прежде чем воспользоваться шиной данных, давайте немножко увеличим окно для ввода текста, а то в одной строчке писать большое сообщение тяжеловато. Для этого щелкните в поле Text правой кнопкой, и выберите пункт Expand. Вот, теперь гораздо лучше. Давайте начнем писать сообщение.</p>
<p>Сначала введите строку “File” и поставьте после неё пробел. Сюда нам надо вставить имя перемещаемого файла. Вызовите контекстное меню, и выберите пункт Subscribe \ Published Data. Откроется диалоговое окно, в котором можно выбрать элемент политики из которого мы хотим получить данные и свойство этого элемента, содержащее нужную нам информацию.</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image19.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb17.png?w=403&#038;h=377" width="403" height="377" /></a>&#160;</p>
<p>Нам нужен элемент Move File и его свойство File Name. Выбрав его, нажмите OK. Теперь допишите “ was moved to ” и добавьте свойство Name and path of the destination file из того же элемента. Ну и не помещает еще указать возраст перемещенного файла. В результате должно получиться примерно следующее:</p>
<p><a href="http://xaegr.files.wordpress.com/2011/04/image20.png"><img style="background-image:none;border-bottom:0;border-left:0;padding-left:0;padding-right:0;display:inline;border-top:0;border-right:0;padding-top:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/04/image_thumb18.png?w=591&#038;h=211" width="591" height="211" /></a></p>
<p>Нажмите OK, а затем Finish.</p>
<p>Политика готова к работе! Но как протестировать и развернуть её, я расскажу в следующий раз <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile1.png?w=780" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/811/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/811/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/811/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/811/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/811/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/811/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/811/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/811/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/811/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/811/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/811/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/811/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/811/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/811/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=811&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2011/04/17/opalis-3-create-policy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile1.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb14.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb15.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb16.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb17.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image_thumb18.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile1.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Установка Opalis</title>
		<link>http://xaegr.wordpress.com/2011/04/16/opalis-2-install/</link>
		<comments>http://xaegr.wordpress.com/2011/04/16/opalis-2-install/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 11:06:53 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[Opalis]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/2011/04/16/opalis-2-install/</guid>
		<description><![CDATA[Прошло немало времени после того как я рассказал что такое Opalis, пришло время его устанавливать Opalis был приобретен Microsoft’ом относительно недавно и продукт разрабатывался “не совсем так” как принято в Microsoft. В частности его установку нельзя описать как “некст,некст,финиш”. Всё немножко сложнее, особенно если вы решите использовать веб-консоль. Поэтому я решил создать для себя этакий [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=809&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img style="display:inline;float:left;margin:0 10px 0 0;" title="image" alt="image" align="left" src="http://xaegr.files.wordpress.com/2011/04/image15.png?w=144&#038;h=133" width="144" height="133" />Прошло немало времени после того как я <a href="http://xaegr.wordpress.com/2011/01/23/opalis-1-intro/">рассказал что такое Opalis</a>, пришло время его устанавливать <img style="border-style:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://xaegr.files.wordpress.com/2011/04/wlemoticon-winkingsmile.png?w=780" /></p>
<p>Opalis был приобретен Microsoft’ом относительно недавно и продукт разрабатывался “не совсем так” как принято в Microsoft. В частности его установку нельзя описать как “некст,некст,финиш”. Всё немножко сложнее, особенно если вы решите использовать веб-консоль. Поэтому я решил создать для себя этакий чеклист. Ну и, авось, кому-нибудь еще он тоже пригодится.</p>
<p>Я буду описывать установку Opalis 6.3&#160; на Windows Server 2008 R2, с SQL Server 2008 R2. После непосредственной установки Opalis, установим еще и особенно сложный в плане установки компонент – консоль оператора или просто веб-консоль и настроим её для запуска в качестве службы Windows.</p>
<p><span id="more-809"></span>
<p>Обратите внимание, что установка текущей версии Opalis поддерживается только на серверах с английской локалью. Кроме того, версия 6.3 является просто надстройкой над версией 6.2, поэтому сначала придётся поставить именно 6.2, а уже потом обновить её.</p>
<ol>
<li>Сначала, разумеется, надо загрузить дистрибутив Opalis. И триальная и полная версии 6.3 расположены на странице <a title="http://www.microsoft.com/systemcenter/en/us/opalis.aspx" href="http://www.microsoft.com/systemcenter/en/us/opalis.aspx">http://www.microsoft.com/systemcenter/en/us/opalis.aspx</a> и не требуют каких-то проверок перед скачиванием. Соответствие вашим лицензиям остаётся на вашей совести – технических проверок нет.       <br />Отдельного дистрибутива версии 6.3 не существует. Сначала всегда устанавливается версия 6.2, а на неё уже обновление до 6.3. </li>
<li>Распакуем скачанный архив в папку c:\Opalis (разумеется можно использовать и другую папку <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile.png?w=780" />). Внутри будет еще несколько архивов (Opalis 6.2.2, Opalis 6.3, Licenses), распакуем их в соответствующие подпапки. </li>
<li>Затем зайдите в папку подпапку Opalis 6.2.2, распакуйте архив Opalis Integration Server 6.22_6.2.2.5229.zip и запустите из него Setup.exe </li>
<li>Выберите опцию Install Opalis Integration Server </li>
<li>Выберите опцию Install the Management Server
<ol>
<li>Далее несколько стандартных шагов установщика: приветствие, лицензия, папка установки… </li>
<li>На экране Logon Information надо ввести учетные данные для службы Opalis. У данной учетной записи должны быть административные привилегии на сервере Opalis, и право “Logon as service”. </li>
<li>Next, Finish. </li>
</ol>
</li>
<li>Завершив установку, запустите следующий пункт – Configure the Datastore.
<ol>
<li>Вам надо указать сервер баз данных, на котором будет находится база Opalis, имя этой базы, и учетные данные для подключения к ней. </li>
</ol>
</li>
<li>Следующим шагом импортируем лицензии (Import a license). Так как после покупки Microsoft’ом, лицензии на все Integration Pack’и стали прилагаться к Opalis бесплатно, то файлы лицензий поставляются в комплекте с дистрибутивом и находятся в архиве Licenses.zip
<ol>
<li>Распакуйте лицензии из архива и поместите их в локальную папку (из сетевой импорт не пройдет). </li>
<li>Откройте расположенный в папке с лицензиями файл opalis product licenses.docx </li>
<li>Импортируйте все необходимые вам лицензии (можно будет добавить их и потом). Как минимум нужна лицензия на сам Opalis Integration Server. Для её импорта вам надо указать файл (5-OISBP_25.lic) и ключ из файла docx. Ключ надо указывать вместе с фигурными скобками. </li>
</ol>
</li>
<li>Следующий шаг (Install Client) не выполняйте. </li>
<li>Обновление до 6.3
<ol>
<li>Скопируйте файл OpalisIntegrationServer_FoundationObjects.msi из папки Opalis 6.3 в папку C:\Program Files (x86)\Opalis Software\Opalis Integration Server\Management Service\Components\Objects </li>
<li>Из папки Opalis 6.3 запустите файл OpalisIntegrationServer_ManagementService_630_PATCH.msp </li>
<li>Из меню &quot;Start&quot;, запустите Opalis Deployment Manager с повышенными привилегиями. Он обладает достаточно простым интерфейсом, так что не буду расписывать куда и в каком порядке кликать.
<ol>
<li>Установите Action Server’ы. </li>
<li>Установите Client’ов. </li>
</ol>
</li>
<li>На каждом клиенте запустите OpalisIntegrationServer_Client_630_PATCH.msp </li>
<li>Снова запустите Deployment Manager, добавьте в него пакеты интеграции (Integration Packs) и разверните их на клиентах и Action Server’ах. </li>
</ol>
</li>
<li>Если вам не нужна консоль оператора, на этом можно остановится. Но если нужна, то продолжаем… </li>
<li>Установка Operator Console
<ol>
<li>В дистрибутиве Opalis Integration Server 6.22, в подпапке Documentation есть документ Opalis_Integration_Server-Administrator_Guide.pdf, там в разделе Operator Console Installation Requirements (стр. 14) перечислены третьесторонние компоненты, которые понадобятся для работы консоли оператора. Их все придётся скачать вам самостоятельно и поместить в папку C:\Libraries </li>
<li>В папке Opalis 6.2.2 найдите архив Opalis Operator Console Installer Script 1.0_1.0.0.0001.zip и запустите из него файл OpalisOperatorConsoleInstaller.exe. Это самораспаковывающийся архив. По умолчанию он распаковывает файлы в C:\OpConsoleInstaller </li>
<li>Так как я рассказываю про Windows Server 2008 R2, PowerShell у меня уже установлен. В случае других ОС его нужно будет установить. </li>
<li>Установите Java Development Kit 6 Update 4 из c:\Libraries с настройками по умолчанию. Несмотря на то что 2008R2 является 64битным, нам нужна x86 версия JDK, так как сам Opalis – 32битный. </li>
<li>Создайте системную переменную окружения %JAVA_HOME% указывающую на путь установки JDK. По умолчанию это C:\Program Files (x86)\Java\jdk1.6.0_04 </li>
<li>Добавьте в системную переменную окружения %PATH% строку %JAVA_HOME%\bin </li>
<li>Распакуйте c:\Libraries\Jboss Application Server 4.2.3.GA.zip в c:\JBoss </li>
<li>Запустите командную строку (я предпочитаю PowerShell), перейдите в папку C:\Libraries и выполните команду java -jar JAXWS2.1.2-20070917.jar </li>
<li>Примите лицензионное соглашение, чтобы продолжить. </li>
<li>Скопируйте папку OperatorConsole из дистрибутива Opalis Integration Server 6.22_6.2.2.5229 на диск C:\ (так просто удобнее) </li>
<li>Запустите PowerShell, при необходимости установите в нём подходящую политику выполнения для запуска сценариев. </li>
<li>Запустите C:\OpConsoleInstaller\InstallOpConsole.ps1 и ответьте на вопросы сценария. По большей части можно оставить умолчания просто нажав Enter.
<ol>
<li>Укажите папку JBoss (c:\jboss) </li>
<li>Укажите папку дистрибутива консоли (c:\OperatorConsole) </li>
<li>Укажите папку с третьесторонними компонентами (C:\Libraries) </li>
<li>Укажите тип базы данных (разумеется 1 – MSSQL) </li>
<li>Укажите имя сервера БД (по умолчанию localhost) </li>
<li>Выберите тип аутентификации в БД (1 – Windows Integrated) </li>
<li>Укажите имя базы данных (Opalis) </li>
<li>Укажите адрес привязки JBoss (1 – 0.0.0.0 – все адреса) </li>
<li>Выберите метот аутентификации пользователей (я выбрал 2 – Active Directory) </li>
<li>Укажите DN домена (обычно правильно определяется по умолчанию) </li>
<li>Выберите контроллер домена из списка, или укажите самостоятельно </li>
<li>Порт привязки LDAP, обычно умолчание – 389. </li>
<li>Имя группы AD администраторов консоли. Так как я устанавливал в тестовой лаборатории то Domain Admins </li>
</ol>
</li>
<li>На всякий случай, можно скопировать файл %JBOSS_HOME%\Bin\sqljdbc_auth.dll в папки %JBOSS_HOME%\lib и в C:\Program Files (x86)\Java\jdk1.6.0_04\bin. Это помогает решить некоторые проблемы. </li>
<li>Можно запускать сервер JBOSS выполнив c:\jboss\bin\run.bat. После вывода сообщения Started in … откройте веб-страницу http://localhost:5314/ и попробуйте залогинится. </li>
<li>Если у вас получилось залогинится – можете пропустить этот пункт. Если же вы получили следующее сообщение об ошибке: “The username or password you have entered is not correct. Transaction failed” то вам стоит проверить настройки привязки к AD и базе Opalis. Они задаются в файлах opalis-activedirectory-service.xml и opalis-ds.xml, находящихся в папке c:\jboss\server\default\deploy\ </li>
<li>Проблема в том, что если вы закроете появившееся окно – сервер перестанет работать. Достаточно неудобно, если вы привыкли к службам Windows, которые запускаются без необходимости входа пользователя и не закрываются при закрытии его сессии. Чтобы решить эту проблему, надо настроить запуск консоли оператора как службы. </li>
</ol>
</li>
<li>Запуск консоли оператора в качестве службы
<ol>
<li>Вам понадобится исполняемый файл srvany.exe. Его можно взять из Windows 2003 Resource Kit. Поместите его например в папку C:\Jboss </li>
<li>Создайте системную переменную окружения %JBOSS_HOME% Указывающую на папку c:\jboss\ </li>
<li>Запустите следующую команду, чтобы создать службу: sc.exe create OpalisOpConsole binPath= c:\JBoss\srvany.exe depend= OpalisManagementService DisplayName= &quot;Opalis Operator Console (srvany)&quot; </li>
<li>Настройте дополнительные параметры службы через оснастку services.msc. Например, можно задать учетную запись под которой будет работать служба и тип запуска. </li>
<li>Запустите regedit.exe и перейдите в ключ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OpalisOpConsole
<ol>
<li>Добавьте подключ “Parameters” </li>
<li>В этот подключ добавьте свойство Application с типом REG_SZ и значением c:\windows\system32\cmd.exe </li>
<li>Аналогично добавьте свойство AppParameters со значением /c c:\Jboss\bin\run.bat </li>
<li>Добавьте свойство AppDirectory со значением c:\Jboss\bin </li>
</ol>
</li>
<li>Теперь можно запустить службу и подождав некоторое время (JBoss стартует далеко не моментально) зайти на сайт. </li>
</ol>
</li>
<li>Готово! </li>
</ol>
<p>Как видите, процесс достаточно непростой, и это даже при том, что сценарий PowerShell помог нам избавиться от множества нудных настроек. В Интернет можно найти решения и утилиты частично упрощающие этот процесс, но я предпочитаю использовать минимум сторонних решений.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/809/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/809/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/809/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/809/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/809/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/809/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/809/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/809/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/809/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/809/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/809/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/809/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/809/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/809/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=809&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2011/04/16/opalis-2-install/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/image15.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/wlemoticon-winkingsmile.png" medium="image">
			<media:title type="html">Winking smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/04/wlemoticon-smile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Welcome, Opalis!</title>
		<link>http://xaegr.wordpress.com/2011/01/23/opalis-1-intro/</link>
		<comments>http://xaegr.wordpress.com/2011/01/23/opalis-1-intro/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 20:36:59 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[Opalis]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/2011/01/23/opalis-1-intro/</guid>
		<description><![CDATA[На недавней платформе я рассказывал про Opalis, продукт который недавно был приобретен Microsoft и теперь войдет в семейство System Center. Opalis призван выполнять следующие задачи в инфраструктуре System Center: Интеграция компонентов System Center друг с другом, в том числе в сценариях не предусмотренных стандартными возможностями продуктов. Автоматизация повторяющихся и рутинных процессов. Интеграция с различными системами [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=806&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://xaegr.files.wordpress.com/2011/01/image.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;float:left;padding-top:0;border-width:0;margin:0 10px 10px;" title="image" border="0" alt="image" align="left" src="http://xaegr.files.wordpress.com/2011/01/image_thumb.png?w=326&#038;h=258" width="326" height="258" /></a>На <a href="http://msplatforma.ru/">недавней платформе</a> я <a href="http://www.microsoft.com/ru-ru/events/platforma/materials/default.aspx?id=DC_203">рассказывал</a> про <a href="http://opalis.com/">Opalis</a>, продукт который недавно был приобретен Microsoft и теперь войдет в семейство System Center.</p>
<p>Opalis призван выполнять следующие задачи в инфраструктуре System Center:</p>
<ol>
<li>Интеграция компонентов System Center друг с другом, в том числе в сценариях не предусмотренных стандартными возможностями продуктов. </li>
<li>Автоматизация повторяющихся и рутинных процессов. </li>
<li>Интеграция с различными системами других производителей. </li>
</ol>
<p><span id="more-806"></span>
<p>Как вы можете заметить, возможности Opalis некоторым образом пересекаются с PowerShell <img style="border-style:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://xaegr.files.wordpress.com/2011/01/wlemoticon-winkingsmile.png?w=780" />. Разумеется это совершенно разные продукты, и хотя цели у них общие, они вовсе не заменяют друг друга, а скорее дополняют. Так, с помощью PowerShell можно расширять возможности Opalis, а Opalis взамен предоставляет еще более простую и быструю автоматизацию, управляемое выполнение процессов, централизованное отслеживание их состояния и богатейший набор готовых средств интеграции. </p>
<p>На иллюстрации ниже приведен один из примеров использования Opalis для интеграции и автоматизации компонентов System Center: Автоматическая миграция физической машины в виртуальную по заявке в SC Service Manager и с участием других продуктов.</p>
<p><a href="http://xaegr.files.wordpress.com/2011/01/image1.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0 0 0 10px;" title="image" border="0" alt="image" src="http://xaegr.files.wordpress.com/2011/01/image_thumb1.png?w=532&#038;h=322" width="532" height="322" /></a></p>
<p>Создаётся такая политика почти так же просто как и выглядит:</p>
<ol>
<li>Надо перетащить соответствующие элементы в область разработки </li>
<li>Соеденить их друг с другом, при необходимости изменяя условия при которых срабатывает соединение </li>
<li>Настроить свойства этих элементов </li>
</ol>
<p>Ниже я постараюсь привести очень краткий обзор активностей (элементов автоматизации) которые присутствуют в Opalis:<a href="http://xaegr.files.wordpress.com/2011/01/image2.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;float:right;padding-top:0;border-width:0;margin:0 0 0 10px;" title="image" border="0" alt="image" align="right" src="http://xaegr.files.wordpress.com/2011/01/image_thumb2.png?w=202&#038;h=551" width="202" height="551" /></a></p>
<ul>
<li>Запуск, остановка, мониторинг процессов, служб </li>
<li>Работа с SNMP, в том числе с Trap’ами </li>
<li>Мониторинг и запросы WMI </li>
<li>Запись, чтение, сохранение, очистка журналов событий </li>
<li>Запуск внешних исполняемых файлов (в т.ч. на удаленных компьютерах), скриптов PowerShell или кода .NET, SSH команд </li>
<li>Планировщик заданий </li>
<li>Проверка доступности компьютеров, веб-приложений (HTTP,SMTP,POP3,DNS), и других </li>
<li>Всевозможные операции для работы с файлами, в том числе мониторинг изменения/создания/удаления, шифрование, архивация </li>
<li>Отправка и проверка почты </li>
<li>Отправка сообщений на пейджер, журнал событий, Syslog </li>
<li>Работа с XML, веб-сервисами, базами данных, веб-страницами </li>
<li>Работа с текстовыми файлами </li>
</ul>
<p>Это лишь беглый (я и правда многое пропустил) список того что доступно “из коробки”. Но кроме этого можно подключить пакеты интеграции (Integration Pack) для работы с другими продуктами. Сначала разумеется весь System Center:</p>
<ul>
<li>System Center Operations Manager </li>
<li>System Center Configuration Manager </li>
<li>System Center Service Manager </li>
<li>System Center Virtual Machine Manager </li>
<li>System Center Data Protection Manager </li>
</ul>
<p>Еще доступны пакеты для интеграции с Active Directory, FTP и даже Unix Integration Pack</p>
<p>Ну и еще IP для не-Microsoft’овских решений:</p>
<ul>
<li>BMC Atrium CMDB </li>
<li>BMC Remedy AR System </li>
<li>BMC Event Manager </li>
<li>BMC Patrol </li>
<li>BMC BladeLogic Operations Manager </li>
<li>CA AutoSys </li>
<li>CA eHealth </li>
<li>CA Service Desk </li>
<li>CA SPECTRUM </li>
<li>CA Unicenter NSM </li>
<li>VMware VI / vSphere </li>
<li>HP Operations for UNIX </li>
<li>HP Operations Windows </li>
<li>HP Operations Solaris </li>
<li>HP Network Node Manager </li>
<li>HP Service Desk </li>
<li>HP Service Manager </li>
<li>HP Accet Manager </li>
<li>HP iLO 2 </li>
<li>Symantec/Veritas NetBackup </li>
<li>IBM Tivoli Enterprise Console </li>
<li>IBM Tivoli Netcool/Omnibus </li>
<li>IBM Tivoli Storage Manager </li>
<li>EMC Smarts InCharge </li>
</ul>
<p>Неплохой списочек, неправда ли? <img style="border-style:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://xaegr.files.wordpress.com/2011/01/wlemoticon-winkingsmile.png?w=780" /> Но это еще не всё, <strike>за те же деньги </strike>если вам необходимо интегрировать какой либо продукт не попавший в этот список, – это достаточно несложно. Главное чтобы у системы был какой нибудь интерфейс управления: веб-сервис, PowerShell или NET, утилиты командной строки, XML, и т.д. Вы можете использовать как готовые активности, или даже написать свой Integration Pack. Так например уже доступно много открытых пакетов интеграции: </p>
<ul>
<li><a href="http://blogs.technet.com/b/opalis/archive/2010/11/21/sharepoint-integration-pack-now-on-codeplex.aspx">SharePoint</a> </li>
<li>Открытые пакеты для <a href="http://opalis.wordpress.com/2010/12/14/integration-pack-active-directory/">управления AD</a> и <a href="http://opalis.wordpress.com/2010/12/16/integration-pack-local-group-and-user-management/">локальными пользователями</a> </li>
<li>Обработка почты <a href="http://opalis.wordpress.com/2010/12/14/integration-pack-exchange-mail/">Exchange</a> </li>
<li>Еще <a href="http://opalis.wordpress.com/2010/12/16/integration-pack-opalis-utilities/">утилиты</a> </li>
</ul>
<p>После того как вы создадите свой процесс (в Opalis он называется “политикой”), для его активации можно использовать различные методы:</p>
<ul>
<li>Мониторы ожидающие некоторых условий. Например запуск при появлении записи в журнале событий, создании определенного файла или получении сообщения от OpsMgr </li>
<li>Ручной запуск через веб-интерфейс оператора, с возможностью передачи параметров политике </li>
<li>Запуск из командной строки </li>
<li>Активация через веб-сервис </li>
</ul>
<p>Я думаю теперь понятно почему Opalis заинтересовал меня, и как вы можете догадаться, теперь в этом блоге будут посты не только по PowerShell <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/01/wlemoticon-smile1.png?w=780" /> Так в <a href="http://xaegr.wordpress.com/2011/04/16/opalis-2-install/">следующем посте</a>, я расскажу о процессе инсталляции и настройки Opalis, и некоторых связанных с этим тонкостях.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/806/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/806/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/806/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/806/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/806/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/806/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/806/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/806/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/806/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/806/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/806/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/806/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/806/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/806/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=806&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2011/01/23/opalis-1-intro/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/01/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/01/wlemoticon-winkingsmile.png" medium="image">
			<media:title type="html">Winking smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/01/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/01/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/01/wlemoticon-winkingsmile.png" medium="image">
			<media:title type="html">Winking smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/01/wlemoticon-smile1.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Новые русскоязычные ресурсы по PowerShell</title>
		<link>http://xaegr.wordpress.com/2011/01/19/new-russian-powershell-resources/</link>
		<comments>http://xaegr.wordpress.com/2011/01/19/new-russian-powershell-resources/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 07:25:27 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/2011/01/19/new-russian-powershell-resources/</guid>
		<description><![CDATA[Привет! К сожалению, в последнее время я несколько подзабросил свой блог. Впрочем скоро я снова начну писать, несколько интересных постов уже наготове Но речь не об этом. Сообщество PowerShell не стоит на месте, и у нас появилось несколько новых русскоязычных ресурсов посвященных PowerShell. Знакомьтесь: Скринкасты Юрия Лебедева о PowerShell – обучающее пособие для тех кому [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=797&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Привет! К сожалению, в последнее время я несколько подзабросил свой блог. Впрочем скоро я снова начну писать, несколько интересных постов уже наготове <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/01/wlemoticon-smile.png?w=780" /> Но речь не об этом. Сообщество PowerShell не стоит на месте, и у нас появилось несколько новых русскоязычных ресурсов посвященных PowerShell. Знакомьтесь:</p>
<ul>
<li><a href="http://sites.google.com/site/lebedevum/voprosy-i-otvety/windows-powershell">Скринкасты Юрия Лебедева</a> о PowerShell – обучающее пособие для тех кому удобнее воспринимать информацию в формате видео.</li>
<li><a href="http://shserg.ru/">Блог SHS</a> (возможно знакомого многим по форумам), “еще один блог сисадмина” со всевозможными скриптами на PowerShell и другими интересными постами.</li>
<li><a href="http://eosfor.blogspot.com/">NETZ</a> – Блог об администрировании Windows и не только, и конечно о PowerShell <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2011/01/wlemoticon-smile.png?w=780" /></li>
<li><a href="http://kazunposh.wordpress.com/">Заметки о PowerShell</a>. Автор блога – Kazun, которого вы могли встретить в <a href="http://social.technet.microsoft.com/Forums/ru-RU/scrlangru/">разделе скриптинга</a> на русскоязычных форумах технет. В блоге приводятся интересные скрипты PowerShell, в том числе с активным применением C# и Win32API.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/797/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/797/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/797/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=797&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2011/01/19/new-russian-powershell-resources/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/01/wlemoticon-smile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2011/01/wlemoticon-smile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Active Setup</title>
		<link>http://xaegr.wordpress.com/2010/09/15/active-setup/</link>
		<comments>http://xaegr.wordpress.com/2010/09/15/active-setup/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 17:29:54 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[Active Setup]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/2010/09/15/active-setup/</guid>
		<description><![CDATA[Вы наверняка не раз замечали при первом входе в систему на компьютере с Windows XP или 2003, такие окошки? На Windows Vista/2008 и выше, этот процесс выглядит иначе: Это происходит только при первом входе, зайдя в систему во второй раз под этим же пользователем, вы их уже не увидите. Но зато если на этот компьютер [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=795&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Вы наверняка не раз замечали при первом входе в систему на компьютере с Windows XP или 2003, такие окошки?</p>
<p><a href="http://xaegr.files.wordpress.com/2010/09/as.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0 0 0 10px;" title="AS" border="0" alt="AS" src="http://xaegr.files.wordpress.com/2010/09/as_thumb.png?w=244&#038;h=99" width="244" height="99" /></a></p>
<p>На Windows Vista/2008 и выше, этот процесс выглядит иначе:</p>
<p><a href="http://xaegr.files.wordpress.com/2010/09/as_2008r2.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0 0 0 10px;" title="AS_2008R2" border="0" alt="AS_2008R2" src="http://xaegr.files.wordpress.com/2010/09/as_2008r2_thumb.png?w=244&#038;h=61" width="244" height="61" /></a></p>
<p>Это происходит только при первом входе, зайдя в систему во второй раз под этим же пользователем, вы их уже не увидите. Но зато если на этот компьютер зайдет другой пользователь, для него весь процесс повторится заново. Что же это такое, и как оно может быть полезно системным администраторам? <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2010/09/wlemoticonsmile.png?w=780" /></p>
<p>  <span id="more-795"></span>
<p>Этот функционал называется Active Setup, и предназначен он как не сложно догадаться для разового применения пользовательских настроек различных продуктов. Например с помощью Active Setup настраиваются некоторые компоненты Microsoft Office, Internet Explorer Enhanced Security Configuration и т.п.</p>
<p>Как он может понадобиться не-разработчикам? Если вам придётся применять какие то параметры пользователей (отсутствующие в групповой политике) в большой сети, Active Setup – прекрасное решение. Кроме того он пригодится когда после установки системы надо выполнить какую либо команду один раз под каждым новым пользователем входящим на компьютер.</p>
<p>Добавить свой элемент Active Setup очень просто. По сути это просто ключ реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components, желательно с GUID в качестве имени. Получить новый GUID для вашего элемента Active Setup можно например выполнив в PowerShell команду [guid]::NewGuid()</p>
<p>Внутри ключа могут находятся следующие параметры:</p>
<ul>
<li>@ (значение по умолчанию). В нёго можно поместить название компонента которое будет отображаться при выполнении на Windows XP/2003. </li>
<li>Version – текстовое представление версии, где подэлементы разделены запятыми. Например 1,0,24. </li>
<li>StubPath – выполняемая командная строка. Здесь может быть что угодно: вызов исполняемого файла, скрипта cmd, vbs или powershell (разумеется надо будет указать powershell.exe а уже в качестве его параметра имя скрипта). </li>
</ul>
<p>Есть еще несколько необязательных параметров, их можно подсмотреть у соседних элементов ActiveSetup.</p>
<p>После того как вы подготовили этот ключ – можете распостранить его по компьютерам любым удобным вам образом, например включить в образ операционной системы или выполнив с помощью ConfigMgr или стартап-скрипта команду reg import.</p>
<p>Теперь давайте рассмотрим как этот механизм работает. На самом деле всё очень просто. </p>
<p>При входе пользователя в систему, Windows сверяет содержимое ключей HKEY_<strong>LOCAL_MACHINE</strong>\SOFTWARE\Microsoft\Active Setup\Installed Components и HKEY_<strong>CURRENT_USER</strong>\SOFTWARE\Microsoft\Active Setup\Installed Components. Для каждого ключа из HKLM ищется копия с таким же GUID в HKCU и если не находится, то выполняется команда из StubPath, и по её завершению, в HKCU создается ключ с таким же GUID, версией, и т.п.</p>
<p>Если же ключ есть и в HKLM и в HKCU, то сравнивается версия, и если версия в HKCU младше чем в HKLM, то компонент запускается снова, а затем обновляется версия в HKCU.</p>
<p>Ну и разумеется если совпадает и GUID и версия, то это значит что компонент уже запускался для этого пользователя, и снова его выполнять не надо.</p>
<p>Ну и в качестве примера:</p>
<p><a href="http://xaegr.files.wordpress.com/2010/09/as_setup.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0 0 0 10px;" title="AS_Setup" border="0" alt="AS_Setup" src="http://xaegr.files.wordpress.com/2010/09/as_setup_thumb.png?w=469&#038;h=184" width="469" height="184" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/795/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=795&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2010/09/15/active-setup/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/09/as_thumb.png" medium="image">
			<media:title type="html">AS</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/09/as_2008r2_thumb.png" medium="image">
			<media:title type="html">AS_2008R2</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/09/wlemoticonsmile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/09/as_setup_thumb.png" medium="image">
			<media:title type="html">AS_Setup</media:title>
		</media:content>
	</item>
		<item>
		<title>Invoke-SQL</title>
		<link>http://xaegr.wordpress.com/2010/08/16/invoke-sql/</link>
		<comments>http://xaegr.wordpress.com/2010/08/16/invoke-sql/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 09:12:00 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cmdlet]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/2010/08/16/invoke-sql/</guid>
		<description><![CDATA[Всем привет! Спасибо всем кто не отписался от моего блога несмотря на отсутствие новых постов в последнее время. У меня для вас есть кое что вкусное Я думаю большинству читателей моего блога, так или иначе приходится сталкиваться и взаимодействовать с серверами MSSQL, ведь большинстов современных серверных продуктов используют их для хранения данных. И я думаю [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=787&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Всем привет!</p>
<p><a href="http://xaegr.files.wordpress.com/2010/08/thumbnailca2cqqeo.jpg"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;margin:0 10px;" class="wlDisabledImage" title="thumbnailCA2CQQEO" border="0" alt="thumbnailCA2CQQEO" align="left" src="http://xaegr.files.wordpress.com/2010/08/thumbnailca2cqqeo_thumb.jpg?w=164&#038;h=124" width="164" height="124" /></a>Спасибо всем кто не отписался от моего блога несмотря на отсутствие новых постов в последнее время. У меня для вас есть кое что вкусное <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2010/08/wlemoticonsmile.png?w=780" /></p>
<p>Я думаю большинству читателей моего блога, так или иначе приходится сталкиваться и взаимодействовать с серверами MSSQL, ведь большинстов современных серверных продуктов используют их для хранения данных. И я думаю что вам, так же как и мне, часто хотелось автоматизировать взаимодействие с этими хранилищами данных с помощью PowerShell. И Microsoft даже пошла нам на встречу выпустив SQL Server 2008 с интеграцией PowerShell. Это позволило нам автоматизировать настройку серверов SQL, но возможностей работы с данными содержащимися в базах к сожалению не прибавило. То же относится к недавно выпущенному MSSQL 2008 R2. А ведь казалось бы, нам нужно совсем немного – хотя бы простой командлет который смог бы принимать на вход SQL запрос, и возвращать данные не в текстовом представлении, как это делают osql.exe или isql.exe, а в виде объектов, со свойствами – столбцами. Аналогичный командлет на самом деле уже написала компания SoftwareFX, но он поставляется в составе их платного продукта PowerGadgets, который хоть и хорош сам по себе, но покупать его только для того чтобы удобно выполнять SQL запросы из PowerShell – просто нецелесообразно. Поэтому я решил написать собственный командлет (advanced function), с таким функционалом, являющийся на самом деле обёрткой над .NET классами для работы с SQL.</p>
<p>    <span id="more-787"></span>
<p>Вот несколько примеров его использования:</p>
<pre>PS C:\&gt; Invoke-SQLCommand -database sms_lab 'select collectionname,collectionid from dbo.collections'

collectionname                                  collectionid
--------------                                  ------------
All Active Directory Security Groups                       6
All Desktops and Servers                                  19
All Systems                                                2
All Unknown Computers                                     24
All User Groups                                            4
All Users                                                  3
All Windows 2000 Professional Systems                     14
All Windows 2000 Server Systems                           15
All Windows Mobile Devices                                18
All Windows Mobile Pocket PC 2003 Devices                 20
All Windows Mobile Pocket PC 5.0 Devices                  21
All Windows Mobile Smartphone 2003 Devices                22
All Windows Mobile Smartphone 5.0 Devices                 23
All Windows Server 2003 Systems                           17
All Windows Server Systems                                13
All Windows Workstation or Professional Systems            5
All Windows XP Systems                                    16
Root Collection                                            1

PS C:\&gt; $Reports = Invoke-SQLCommand -database sms_lab `
&gt;&gt; -command 'select reportid,name,category,sqlquery from dbo.report'
&gt;&gt;

PS C:\&gt; $Reports | where {$_.category -eq 'Operating System'} |
&gt;&gt; Format-Table reportid, name, category -AutoSize
&gt;&gt;

reportid name                                                        category
-------- ----                                                        --------
      38 Computer operating system version history                   Operating System
      39 Services - Computers running Remote Access Server           Operating System
      40 Services - Computers running a specific service             Operating System
      41 Services - Services information for a specific computer     Operating System
      42 Windows Server computers                                    Operating System
     100 Computers with a specific operating system and service pack Operating System
     101 Computers with a specific operating system                  Operating System
     102 Count operating systems and service packs                   Operating System
     103 Count operating system versions                             Operating System</pre>
<p>Кроме простых запросов можно выполнять и другие операции, например изменение или удаление записей. В таком случае в качестве результата возвращается количество измененных записей.</p>
<pre>PS C:\&gt; Invoke-SQLCommand -server sccm -database sms_lab `
&gt;&gt; -Command &quot;update dbo.smspackages set description='Updated from PowerShell' where Name='Test Package'&quot;
&gt;&gt;
1</pre>
<p>Кроме того, так как эта команда позволяет изменять данные, я реализовал и поддержку ключей –whatif и –confirm.</p>
<p>Ну и наконец, исходный код, с кучей комментариев <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://xaegr.files.wordpress.com/2010/08/wlemoticonsmile.png?w=780" /></p>
<pre class="PowerShellColorizedScript"><span style="color:#00008b;">function</span> <span style="color:#8a2be2;">Invoke-SQLCommand</span>
<span style="color:#000000;">{</span>
    <span style="color:#006400;">#Объявление о том что мы будем использовать возможности Advanced </span>
    <span style="color:#006400;">#Functions, в частности несколько наборов параметров, и поддержку</span>
    <span style="color:#006400;">#ключей -WhatIf -Confirm -Verbose (ShouldProcess)</span>
    <span style="color:#a9a9a9;">[</span><span style="color:#add8e6;">CmdletBinding</span><span style="color:#000000;">(</span>
    <span style="color:#000000;">SupportsShouldProcess</span><span style="color:#a9a9a9;">=</span><span style="color:#ff4500;">$True</span><span style="color:#a9a9a9;">,</span>
    <span style="color:#000000;">ConfirmImpact</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">&quot;Low&quot;</span><span style="color:#a9a9a9;">,</span>
    <span style="color:#000000;">DefaultParameterSetName</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">&quot;Default&quot;</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span>            

    <span style="color:#00008b;">Param</span>
    <span style="color:#000000;">(</span>
        <span style="color:#006400;">#Команда SQL. Обязательный параметр присутствующий во всех наборах </span>
        <span style="color:#006400;">#параметров, по умолчанию находится на первом месте, и принимает</span>
        <span style="color:#006400;">#значения из конвейера. Тип - массив строк.</span>
        <span style="color:#a9a9a9;">[</span><span style="color:#add8e6;">Parameter</span><span style="color:#000000;">(</span><span style="color:#000000;">Mandatory</span><span style="color:#a9a9a9;">=</span><span style="color:#ff4500;">$True</span><span style="color:#a9a9a9;">,</span> <span style="color:#000000;">Position</span><span style="color:#a9a9a9;">=</span><span style="color:#800080;">1</span><span style="color:#a9a9a9;">,</span> <span style="color:#000000;">ValueFromPipeLine</span><span style="color:#a9a9a9;">=</span><span style="color:#ff4500;">$True</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span>
        <span style="color:#008080;">[String[]]</span><span style="color:#ff4500;">$Command</span><span style="color:#a9a9a9;">,</span>            

        <span style="color:#006400;">#Имя сервера SQL. Присутствует только в наборе параметров Default.</span>
        <span style="color:#006400;">#По умолчанию равен имени текущего компьютера.</span>
        <span style="color:#a9a9a9;">[</span><span style="color:#add8e6;">Parameter</span><span style="color:#000000;">(</span><span style="color:#000000;">Position</span><span style="color:#a9a9a9;">=</span><span style="color:#800080;">2</span><span style="color:#a9a9a9;">,</span> <span style="color:#000000;">ParameterSetName</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">&quot;Default&quot;</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span>
        <span style="color:#008080;">[String]</span><span style="color:#ff4500;">$Server</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$Env:computername</span><span style="color:#a9a9a9;">,</span>            

        <span style="color:#006400;">#База данных. По умолчанию - &quot;master&quot;.</span>
        <span style="color:#a9a9a9;">[</span><span style="color:#add8e6;">Parameter</span><span style="color:#000000;">(</span><span style="color:#000000;">Position</span><span style="color:#a9a9a9;">=</span><span style="color:#800080;">3</span><span style="color:#a9a9a9;">,</span> <span style="color:#000000;">ParameterSetName</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">&quot;Default&quot;</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span>
        <span style="color:#008080;">[String]</span><span style="color:#ff4500;">$Database</span> <span style="color:#a9a9a9;">=</span> <span style="color:#8b0000;">&quot;master&quot;</span><span style="color:#a9a9a9;">,</span>            

        <span style="color:#006400;">#Надо ли отключить интегрированную аутентикацию и использовать</span>
        <span style="color:#006400;">#родную SQL (менее безопасно). Тип - switch (наличие параметра </span>
        <span style="color:#006400;">#означает $true.</span>
        <span style="color:#a9a9a9;">[</span><span style="color:#add8e6;">Parameter</span><span style="color:#000000;">(</span><span style="color:#000000;">ParameterSetName</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">&quot;Default&quot;</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span>
        <span style="color:#008080;">[switch]</span><span style="color:#ff4500;">$SQLAuthentication</span><span style="color:#a9a9a9;">,</span>            

        <span style="color:#006400;">#Учетные данные для подключения, тип - PSCredential.</span>
        <span style="color:#006400;">#Можно получить выполнив командлет Get-Credential</span>
        <span style="color:#a9a9a9;">[</span><span style="color:#add8e6;">Parameter</span><span style="color:#000000;">(</span><span style="color:#000000;">ParameterSetName</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">&quot;Default&quot;</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span>
        <span style="color:#008080;">[System.Management.Automation.PSCredential]</span><span style="color:#ff4500;">$Credential</span><span style="color:#a9a9a9;">,</span>            

        <span style="color:#006400;">#Строка для подключения сервера. Позволяет указать имя сервера,</span>
        <span style="color:#006400;">#базы, параметры аутентикации, и прочее, вручную. Принадлежит </span>
        <span style="color:#006400;">#набору параметров ConnectionString.</span>
        <span style="color:#a9a9a9;">[</span><span style="color:#add8e6;">Parameter</span><span style="color:#000000;">(</span><span style="color:#000000;">Mandatory</span><span style="color:#a9a9a9;">=</span><span style="color:#ff4500;">$True</span><span style="color:#a9a9a9;">,</span>
        <span style="color:#000000;">Position</span><span style="color:#a9a9a9;">=</span><span style="color:#800080;">2</span><span style="color:#a9a9a9;">,</span>
        <span style="color:#000000;">ParameterSetName</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">&quot;ConnectionString&quot;</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span>
        <span style="color:#008080;">[String]</span><span style="color:#ff4500;">$ConnectionString</span>            

    <span style="color:#000000;">)</span>            

    <span style="color:#006400;">#Блок BEGIN выполняется 1 раз, в начале выполнения командлета, до</span>
    <span style="color:#006400;">#начала обработки данных из конвейера. Обычно здесь происходит инициализация.</span>
    <span style="color:#00008b;">BEGIN</span>
    <span style="color:#000000;">{</span>
        <span style="color:#006400;">#Создаем объект подключения к SQL</span>
        <span style="color:#ff4500;">$Connection</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">New-Object</span> <span style="color:#8a2be2;">System.Data.SQLClient.SQLConnection</span>            

        <span style="color:#006400;">#Если использовался набор параметров Default, то формируем</span>
        <span style="color:#006400;">#строку подключения самостоятельно.</span>
        <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$PSCmdlet</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">ParameterSetName</span> <span style="color:#a9a9a9;">-eq</span> <span style="color:#8b0000;">&quot;Default&quot;</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            <span style="color:#ff4500;">$Trusted</span> <span style="color:#a9a9a9;">=</span> <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$SQLAuthentication</span><span style="color:#000000;">)</span> <span style="color:#000000;">{</span><span style="color:#8b0000;">&quot;False&quot;</span><span style="color:#000000;">}</span> <span style="color:#00008b;">else</span> <span style="color:#000000;">{</span><span style="color:#8b0000;">&quot;True&quot;</span><span style="color:#000000;">}</span>
            <span style="color:#ff4500;">$String</span> <span style="color:#a9a9a9;">=</span> <span style="color:#8b0000;">&quot;Server=$Server;Database=$Database;Trusted_Connection=$Trusted;&quot;</span>            

            <span style="color:#006400;">#Если указан параметр $Credential, то вытаскиваем из него имя и пароль</span>
            <span style="color:#006400;">#и помещаем в строку подключения.</span>
            <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Credential</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#006400;">#При необходимости удаляем \ в начале строки.</span>
                <span style="color:#ff4500;">$String</span> <span style="color:#a9a9a9;">+=</span> <span style="color:#8b0000;">&quot;User ID=$($Credential.UserName -replace '^\\');&quot;</span>
                <span style="color:#ff4500;">$String</span> <span style="color:#a9a9a9;">+=</span> <span style="color:#8b0000;">&quot;Password=$($Credential.GetNetworkCredential().password);&quot;</span>
            <span style="color:#000000;">}</span>
            <span style="color:#006400;">#Присваиваем строку объекту подключения.</span>
            <span style="color:#ff4500;">$Connection</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">ConnectionString</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$String</span>
        <span style="color:#000000;">}</span>
        <span style="color:#00008b;">else</span>
        <span style="color:#000000;">{</span>
            <span style="color:#006400;">#Присваиваем строку объекту подключения.</span>
            <span style="color:#ff4500;">$Connection</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">ConnectionString</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$ConnectionString</span>
        <span style="color:#000000;">}</span>
        <span style="color:#006400;">#Выводим отладочную информацию.</span>
        <span style="color:#0000ff;">Write-Verbose</span> <span style="color:#000000;">(</span><span style="color:#8b0000;">&quot;ConnectionString is: &quot;</span> <span style="color:#a9a9a9;">+</span> <span style="color:#ff4500;">$Connection</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">ConnectionString</span><span style="color:#000000;">)</span>
        <span style="color:#006400;">#Открываем соединение. Если не закрыть его методом .Close() то оно</span>
        <span style="color:#006400;">#будет закрыто автоматически по таймауту (15 мин по умолчанию).</span>
        <span style="color:#ff4500;">$Connection</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Open</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>
        <span style="color:#006400;">#Если не получилось открыть соединение - вываливаем ошибку.</span>
        <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Connection</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">State</span> <span style="color:#a9a9a9;">-ne</span> <span style="color:#8b0000;">&quot;Open&quot;</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            <span style="color:#00008b;">Throw</span> <span style="color:#8b0000;">&quot;Unable to open SQL connection&quot;</span>
        <span style="color:#000000;">}</span>
        <span style="color:#006400;">#Создаем строку $Commands. Она будет содержать полный текст сценария SQL</span>
        <span style="color:#006400;">#если по конвейеру будет передано несколько команд.</span>
        <span style="color:#ff4500;">$Commands</span> <span style="color:#a9a9a9;">=</span> <span style="color:#8b0000;">&quot;&quot;</span>
    <span style="color:#000000;">}</span>            

    <span style="color:#006400;">#Блок PROCESS выполняется по разу для каждого объекта полученного по конвейеру</span>
    <span style="color:#006400;">#или для каждого элемента массива $Command если он был передан как аргумент.</span>
    <span style="color:#006400;">#Если как аргумент была передана одна строка, то блок выполняется 1 раз.</span>
    <span style="color:#006400;">#Обычно в этом блоке происходит непосредственная обработка и вывод данных, но </span>
    <span style="color:#006400;">#в данном случае он нужен лишь для склейки строк из конвейера в одну.</span>
    <span style="color:#00008b;">PROCESS</span>
    <span style="color:#000000;">{</span>
        <span style="color:#006400;">#Прицепляем к $Commands содержимое элемента $Command и перенос строки.</span>
        <span style="color:#ff4500;">$Commands</span> <span style="color:#a9a9a9;">+=</span> <span style="color:#8b0000;">&quot;$Command`n&quot;</span>
    <span style="color:#000000;">}</span>            

    <span style="color:#006400;">#Блок END Выполняется 1 раз, в конце работы командлета, когда все элементы </span>
    <span style="color:#006400;">#переданные по конвейеру уже были обработаны в блоке PROCESS.</span>
    <span style="color:#006400;">#В этом блоке принято производить удаление временных данных, завершение сессий</span>
    <span style="color:#006400;">#и т.п. Однако в данном командлете здесь выполняется непосредственно команда SQL,</span>
    <span style="color:#006400;">#а уже затем происходит завершение сессии SQL.</span>
    <span style="color:#00008b;">END</span>
    <span style="color:#000000;">{</span>
        <span style="color:#006400;">#Конструкция Try, Catch, Finally нужна для обработки ошибок. Если внутри try</span>
        <span style="color:#006400;">#произойдет ошибка, то она будет перехвачена, и управление будет передано </span>
        <span style="color:#006400;">#блоку Catch. Finally выполняется всегда, независимо от того произошла ошибка</span>
        <span style="color:#006400;">#или нет - соединение к SQL нам надо закрыть в любом случае.</span>
        <span style="color:#00008b;">try</span>
        <span style="color:#000000;">{</span>
            <span style="color:#006400;">#Это условие единственное что необходимо для реализации стандартных ключей</span>
            <span style="color:#006400;">#-WhatIf, -Confirm и -Verbose. Как аргумент для ShouldProcess передается</span>
            <span style="color:#006400;">#текущий элемент (команда SQL). Это имя будет использоваться для вывода </span>
            <span style="color:#006400;">#информации при использовании аргументов. Внутри блока If находится код </span>
            <span style="color:#006400;">#который будет выполнен в том случае если не указан ключ -WhatIf. Если же</span>
            <span style="color:#006400;">#указан ключ -Confirm, то выполнение этого кода будет зависеть от ответа</span>
            <span style="color:#006400;">#пользователя.</span>
            <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$PSCmdlet</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">ShouldProcess</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$Commands</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Trim</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#006400;">#Создаем объект SQLCommand, и присваиваем ему текст команды и объект</span>
                <span style="color:#006400;">#соединения.</span>
                <span style="color:#ff4500;">$SqlCommand</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">New-Object</span> <span style="color:#8a2be2;">System.Data.SQLClient.SQLCommand</span>
                <span style="color:#ff4500;">$SqlCommand</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Connection</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$Connection</span>
                <span style="color:#ff4500;">$SqlCommand</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">CommandText</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$Commands</span>
                <span style="color:#006400;">#Выполняем команду, и получаем объект Reader, который будем использовать</span>
                <span style="color:#006400;">#для чтения результатов.</span>
                <span style="color:#ff4500;">$Reader</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$SQLCommand</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">ExecuteReader</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>            

                <span style="color:#006400;">#Если в результатах есть строки, то выводим их содержимое.</span>
                <span style="color:#00008b;">If</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Reader</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">HasRows</span><span style="color:#000000;">)</span>
                <span style="color:#000000;">{</span>
                    <span style="color:#006400;">#Инициализируем переменную для подсчета строк.</span>
                    <span style="color:#ff4500;">$RowsCount</span> <span style="color:#a9a9a9;">=</span> <span style="color:#800080;">0</span>
                    <span style="color:#006400;">#Смотрим количество возвращенных столбцов.</span>
                    <span style="color:#ff4500;">$FieldCount</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$Reader</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">FieldCount</span>
                    <span style="color:#006400;">#Пока есть необработанные данные, читаем их.</span>
                    <span style="color:#00008b;">while</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Reader</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Read</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
                    <span style="color:#000000;">{</span>
                        <span style="color:#006400;">#Увеличиваем счетчик строк.</span>
                        <span style="color:#ff4500;">$RowsCount</span> <span style="color:#a9a9a9;">++</span>
                        <span style="color:#006400;">#Создаем &quot;пустой&quot; объект.</span>
                        <span style="color:#ff4500;">$Obj</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">New-Object</span> <span style="color:#8a2be2;">psobject</span>
                        <span style="color:#006400;">#Для каждого столбца...</span>
                        <span style="color:#00008b;">for</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$i</span><span style="color:#a9a9a9;">=</span><span style="color:#800080;">0</span><span style="color:#000000;">;</span> <span style="color:#ff4500;">$i</span> <span style="color:#a9a9a9;">-lt</span> <span style="color:#ff4500;">$FieldCount</span><span style="color:#000000;">;</span> <span style="color:#ff4500;">$i</span><span style="color:#a9a9a9;">++</span><span style="color:#000000;">)</span>
                        <span style="color:#000000;">{</span>
                            <span style="color:#006400;">#Добавляем к объекту свойство с именем столбца, где </span>
                            <span style="color:#006400;">#значение - значение столбца.</span>
                            <span style="color:#ff4500;">$Obj</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">Add-Member</span> <span style="color:#000080;">-MemberType</span> <span style="color:#8a2be2;">NoteProperty</span> <span style="color:#000000;">`
</span>                            <span style="color:#000080;">-Name</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Reader</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">GetName</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$i</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span> <span style="color:#000080;">-Value</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Reader</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">GetValue</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$i</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
                        <span style="color:#000000;">}</span>
                        <span style="color:#006400;">#Выводим получившийся объект.</span>
                        <span style="color:#0000ff;">Write-Output</span> <span style="color:#ff4500;">$Obj</span>
                    <span style="color:#000000;">}</span>
                <span style="color:#000000;">}</span>            

                <span style="color:#006400;">#Если были затронуты (созданы/изменены/удалены) записи, то выводим</span>
                <span style="color:#006400;">#их количество.</span>
                <span style="color:#00008b;">If</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Reader</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">RecordsAffected</span> <span style="color:#a9a9a9;">-gt</span> <span style="color:#800080;">0</span><span style="color:#000000;">)</span>
                <span style="color:#000000;">{</span>
                    <span style="color:#0000ff;">Write-Output</span> <span style="color:#ff4500;">$Reader</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">RecordsAffected</span>
                <span style="color:#000000;">}</span>
            <span style="color:#000000;">}</span>
        <span style="color:#000000;">}</span>
        <span style="color:#00008b;">Catch</span>
        <span style="color:#000000;">{</span>
            <span style="color:#006400;">#Если произошла ошибка, то достаем и выводим её текст, плюс помещаем</span>
            <span style="color:#006400;">#оригинальный объект исключения в поле Exception.</span>
            <span style="color:#0000ff;">Write-Error</span> <span style="color:#000080;">-Message</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">exception</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">innerexception</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">message</span><span style="color:#000000;">)</span> <span style="color:#000000;">`
</span>            <span style="color:#000080;">-Exception</span> <span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Exception</span>
        <span style="color:#000000;">}</span>
        <span style="color:#00008b;">Finally</span>
        <span style="color:#000000;">{</span>
            <span style="color:#006400;">#Закрываем соединение с SQL.</span>
            <span style="color:#ff4500;">$Connection</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Close</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">}</span>
    <span style="color:#000000;">}</span>
<span style="color:#000000;">}</span>            </pre>
<p>&#160;</p>
<p>Напоследок небольшое замечание. Помните что MSSQL был создан для быстрой обработки данных, а PowerShell – для быстрого написания сценариев и удобной интерактивной работы. Поэтому старайтесь максимум обработки оставить на стороне MSSQL – он справится гораздо быстрее.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/787/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/787/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/787/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/787/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/787/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/787/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/787/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/787/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/787/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/787/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/787/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/787/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/787/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/787/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=787&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2010/08/16/invoke-sql/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/08/thumbnailca2cqqeo_thumb.jpg" medium="image">
			<media:title type="html">thumbnailCA2CQQEO</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/08/wlemoticonsmile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/08/wlemoticonsmile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>
	</item>
		<item>
		<title>Я снова читаю курс по Windows PowerShell, на этот раз 2.0!</title>
		<link>http://xaegr.wordpress.com/2010/06/28/powershell-2-course/</link>
		<comments>http://xaegr.wordpress.com/2010/06/28/powershell-2-course/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 12:11:39 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/2010/06/28/powershell-2-course/</guid>
		<description><![CDATA[Итак, совершенно внезапно, я снова читаю курс по PowerShell. На этот раз курс будет о PowerShell 2.0 и так как на этот раз он пятидневный, то получилось поместить в него гораздо больше интересного. В частности будет и про автоматизацию Exchange 2010, SharePoint 2010, ISA/TMG 2010 и ConfigMgr 2007. С полной программой можно ознакомится здесь. Содержание [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=781&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.atraining.ru/about"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;margin:10px 15px 10px 10px;" title="SNC00007" border="0" alt="SNC00007" align="left" src="http://xaegr.files.wordpress.com/2010/06/snc00007.jpg?w=184&#038;h=244" width="184" height="244" /></a>
<p>Итак, совершенно внезапно, я снова читаю <a href="http://www.atraining.ru/component/content/article/center-news/44-powershell-vasily-gusev">курс по PowerShell</a>. На этот раз курс будет о PowerShell 2.0 и так как на этот раз он пятидневный, то получилось поместить в него гораздо больше интересного. В частности будет и про автоматизацию Exchange 2010, SharePoint 2010, ISA/TMG 2010 и ConfigMgr 2007. С полной программой можно ознакомится <a href="http://www.atraining.ru/courses/microsoft/windows-server-2008/ms-posh2">здесь</a>. Содержание курса уникальное, больше нигде не найдете <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Уровень курса указан как 200, но это спорное определение. Тут как в конвейере PowerShell, на вход можно подавать совсем новичков, лишь слышавших о скриптинге, а на выходе получатся настоящие гуру PowerShell, которые легко будут понимать всё что я пишу в этом блоге и создавать свои скрипты не хуже <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Курс я буду читать в учебном центре <a href="http://www.atraining.ru/about">Advanced Training</a>, расположенном <a href="http://www.atraining.ru/contacts">недалеко от метро</a>. Кроме того он еще отличается отличными современными компьютерами (Core i7 920, 8 ядер, 12гигов DDR3), так что проблем с тормозящими лабами не возникнет, несмотря на то что последние версии Exchange и SharePoint достаточно требовательные к ресурсам.</p>
<p>PS: Ну и бонусная скидка для читателей блога – 5% <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Кстати доступно еще множество других <a href="http://www.atraining.ru/discount">скидок</a>, в том числе работают скидки из других учебных центров.</p>
</p>
<p>PPS: Фотка из Advanced Training, там еще классные курсы по Cisco можно послушать <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/781/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/781/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/781/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/781/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/781/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/781/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/781/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/781/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/781/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/781/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/781/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/781/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/781/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/781/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=781&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2010/06/28/powershell-2-course/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/06/snc00007.jpg" medium="image">
			<media:title type="html">SNC00007</media:title>
		</media:content>
	</item>
		<item>
		<title>Выкачивание драйверов с сайта HP</title>
		<link>http://xaegr.wordpress.com/2010/05/09/download-hp-drivers/</link>
		<comments>http://xaegr.wordpress.com/2010/05/09/download-hp-drivers/#comments</comments>
		<pubDate>Sun, 09 May 2010 07:13:00 +0000</pubDate>
		<dc:creator>Xaegr</dc:creator>
				<category><![CDATA[2.0]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Regular Expressions]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[Drivers]]></category>
		<category><![CDATA[HP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">https://xaegr.wordpress.com/?p=771</guid>
		<description><![CDATA[Не так давно мне понадобилось скачать драйверы и утилиты для множества моделей компьютеров HP. Учитывая что обычно для каждой модели приводится несколько десятков драйверов, скачивать их вручную и раскладывать по папкам мне показалось слишком долго и нудно. Кроме того я не хотел устанавливать какие либо менеджеры закачек которые помогли бы просто выдрать все ссылки со [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=771&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;margin:0 10px 10px 0;" title="usbVacuum" border="0" alt="usbVacuum" align="left" src="http://xaegr.files.wordpress.com/2010/05/usbvacuum.jpg?w=188&#038;h=244" width="188" height="244" /> Не так давно мне понадобилось скачать драйверы и утилиты для множества моделей компьютеров HP. Учитывая что обычно для каждой модели приводится несколько десятков драйверов, скачивать их вручную и раскладывать по папкам мне показалось слишком долго и нудно. Кроме того я не хотел устанавливать какие либо менеджеры закачек которые помогли бы просто выдрать все ссылки со страницы, да они и не смогли бы правильно разложить файлы по категориям… Поэтому я решил написать простенький сценарий, который бы разбирал html страницы с драйверами для модели, понимал бы к какой категории относится драйвер или утилита, скачивал бы их, и раскладывал бы в соответствующие папки (при необходимости создавая эти папки самостоятельно).</p>
</p>
<p> <span id="more-771"></span>
<p>На вход сценарий принимает адрес страницы с которой необходимо скачать драйверы, например такой <a title="http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareIndex.jsp?lang=ru&amp;cc=ru&amp;prodNameId=462858&amp;prodTypeId=321957&amp;prodSeriesId=462857&amp;swLang=33&amp;taskId=135&amp;swEnvOID=1093" href="http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareIndex.jsp?lang=ru&amp;cc=ru&amp;prodNameId=462858&amp;prodTypeId=321957&amp;prodSeriesId=462857&amp;swLang=33&amp;taskId=135&amp;swEnvOID=1093">http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareIndex.jsp?lang=ru&amp;cc=ru&amp;prodNameId=462858&amp;prodTypeId=321957&amp;prodSeriesId=462857&amp;swLang=33&amp;taskId=135&amp;swEnvOID=1093</a></p>
<p>Если вы приглядитесь к кнопкам “Загрузить” на этой странице, то вы увидите что в них содержится ftp ссылка на файл, так что для закачки нам не подойдет простой <a href="http://xaegr.wordpress.com/2009/10/31/extract-webpage-links/">System.Net.WebClient</a> или <a href="http://xaegr.wordpress.com/2009/10/14/bitstransfer/">BitsTransfer</a> а понадобится System.Net.FtpWebRequest. Он несколько сложнее в использовании, но я нашел хороший пример функции для скачивания файлов по FTP <a href="http://powershell.com/cs/media/p/804.aspx">здесь</a>, и включил его в тело сценария. Разумеется можно просто поместить его в свой профиль, но я посчитал что лучше сделать сценарий самодостаточным и независимым от окружения.</p>
<p>Кроме страницы для скачивания, сценарию можно указать еще параметры Destination (папка куда скачивать файлы, по умолчанию текущий каталог) и ключ Plain (если он указан, то файлы сваливаются в одну кучу, без раскладывания по папкам).</p>
<p>Ну и наконец Get-HPDrivers.ps1:</p>
<pre class="PowerShellColorizedScript"><span style="color:#00008b;">param</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Url</span><span style="color:#a9a9a9;">,</span> <span style="color:#ff4500;">$Destination</span><span style="color:#a9a9a9;">=</span><span style="color:#ff4500;">$Pwd</span><span style="color:#a9a9a9;">,</span> <span style="color:#008080;">[switch]</span><span style="color:#ff4500;">$Plain</span><span style="color:#000000;">)</span>            

<span style="color:#006400;">#Функция Get-FTPFile взята отсюда - http://powershell.com/cs/media/p/804.aspx</span>
<span style="color:#00008b;">function</span> <span style="color:#8a2be2;">Get-FTPFile</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Source</span><span style="color:#a9a9a9;">,</span><span style="color:#ff4500;">$Target</span><span style="color:#a9a9a9;">,</span><span style="color:#ff4500;">$UserName</span><span style="color:#a9a9a9;">,</span><span style="color:#ff4500;">$Password</span><span style="color:#000000;">)</span>
<span style="color:#000000;">{</span>              

 <span style="color:#006400;"># Create a FTPWebRequest object to handle the connection to the ftp server  </span>
 <span style="color:#ff4500;">$ftprequest</span> <span style="color:#a9a9a9;">=</span> <span style="color:#008080;">[System.Net.FtpWebRequest]</span><span style="color:#a9a9a9;">::</span><span style="color:#000000;">create</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$Source</span><span style="color:#000000;">)</span>              

 <span style="color:#006400;"># set the request's network credentials for an authenticated connection  </span>
 <span style="color:#ff4500;">$ftprequest</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Credentials</span> <span style="color:#a9a9a9;">=</span>
     <span style="color:#0000ff;">New-Object</span> <span style="color:#8a2be2;">System.Net.NetworkCredential</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$username</span><span style="color:#a9a9a9;">,</span><span style="color:#ff4500;">$password</span><span style="color:#000000;">)</span>              

 <span style="color:#ff4500;">$ftprequest</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Method</span> <span style="color:#a9a9a9;">=</span> <span style="color:#008080;">[System.Net.WebRequestMethods+Ftp]</span><span style="color:#a9a9a9;">::</span><span style="color:#000000;">DownloadFile</span>
 <span style="color:#ff4500;">$ftprequest</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">UseBinary</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$true</span>
 <span style="color:#ff4500;">$ftprequest</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">KeepAlive</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$false</span>              

 <span style="color:#006400;"># send the ftp request to the server  </span>
 <span style="color:#ff4500;">$ftpresponse</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$ftprequest</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">GetResponse</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>              

 <span style="color:#006400;"># get a download stream from the server response  </span>
 <span style="color:#ff4500;">$responsestream</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$ftpresponse</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">GetResponseStream</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>              

 <span style="color:#006400;"># create the target file on the local system and the download buffer  </span>
 <span style="color:#ff4500;">$targetfile</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">New-Object</span> <span style="color:#8a2be2;">IO.FileStream</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Target</span><span style="color:#a9a9a9;">,</span><span style="color:#008080;">[IO.FileMode]</span><span style="color:#a9a9a9;">::</span><span style="color:#000000;">Create</span><span style="color:#000000;">)</span>
 <span style="color:#008080;">[byte[]]</span><span style="color:#ff4500;">$readbuffer</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">New-Object</span> <span style="color:#8a2be2;">byte[]</span> <span style="color:#800080;">1024</span>              

 <span style="color:#006400;"># loop through the download stream and send the data to the target file  </span>
 <span style="color:#00008b;">do</span><span style="color:#000000;">{</span>
     <span style="color:#ff4500;">$readlength</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$responsestream</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Read</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$readbuffer</span><span style="color:#a9a9a9;">,</span><span style="color:#800080;">0</span><span style="color:#a9a9a9;">,</span><span style="color:#800080;">1024</span><span style="color:#000000;">)</span>
     <span style="color:#ff4500;">$targetfile</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Write</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$readbuffer</span><span style="color:#a9a9a9;">,</span><span style="color:#800080;">0</span><span style="color:#a9a9a9;">,</span><span style="color:#ff4500;">$readlength</span><span style="color:#000000;">)</span>
 <span style="color:#000000;">}</span>
 <span style="color:#00008b;">while</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$readlength</span> <span style="color:#a9a9a9;">-ne</span> <span style="color:#800080;">0</span><span style="color:#000000;">)</span>              

 <span style="color:#ff4500;">$targetfile</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">close</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>
<span style="color:#000000;">}</span>              

<span style="color:#006400;">#Выводим на экран текущее выполняемое действие:</span>
<span style="color:#0000ff;">Write-Progress</span> <span style="color:#8b0000;">&quot;Receiving metadata&quot;</span> <span style="color:#8b0000;">&quot;Downloading&quot;</span>
<span style="color:#006400;">#Создаем объект WebClient для выкачивания текста страницы</span>
<span style="color:#ff4500;">$wc</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">new-object</span> <span style="color:#8a2be2;">System.Net.WebClient</span>
<span style="color:#006400;">#Устанавливаем для него кодировку</span>
<span style="color:#ff4500;">$wc</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Encoding</span> <span style="color:#a9a9a9;">=</span> <span style="color:#008080;">[System.Text.Encoding]</span><span style="color:#a9a9a9;">::</span><span style="color:#000000;">GetEncoding</span><span style="color:#000000;">(</span><span style="color:#8b0000;">&quot;UTF-8&quot;</span><span style="color:#000000;">)</span>
<span style="color:#006400;">#Указываем что надо использовать учетные данные той учетной записи </span>
<span style="color:#006400;">#под которой запущен сценарий</span>
<span style="color:#ff4500;">$wc</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">UseDefaultCredentials</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$true</span>
<span style="color:#006400;">#Загружаем страницу в переменную $Page</span>
<span style="color:#ff4500;">$Page</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$wc</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">DownloadString</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$url</span><span style="color:#000000;">)</span>            

<span style="color:#006400;">#Обновляем статус</span>
<span style="color:#0000ff;">Write-Progress</span> <span style="color:#8b0000;">&quot;Receiving metadata&quot;</span> <span style="color:#8b0000;">&quot;Parsing HTML&quot;</span>
<span style="color:#ff4500;">$Meta</span> <span style="color:#a9a9a9;">=</span> <span style="color:#000000;">$(</span>
    <span style="color:#006400;">#С помощью конструкции switch разбираем текст страницы используя регулярные выражения</span>
    <span style="color:#006400;">#Так как разные элементы (категория, имя, ссылка) находятся на разных строках, я использовал</span>
    <span style="color:#006400;">#переменные $Category и $Name для сохранения их значений</span>
 <span style="color:#00008b;">switch</span> <span style="color:#000080;">-regex</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$page</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">split</span><span style="color:#000000;">(</span><span style="color:#8b0000;">&quot;`n&quot;</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
 <span style="color:#000000;">{</span>
        <span style="color:#006400;">#Это категория, устанавливаем переменную $Category</span>
  <span style="color:#8b0000;">'&lt;a name="\d+"&gt;&lt;/a&gt;&lt;b&gt;([^&lt;]+)&lt;/b&gt;'</span> <span style="color:#000000;">{</span><span style="color:#ff4500;">$Category</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$matches</span><span style="color:#a9a9a9;">[</span><span style="color:#800080;">1</span><span style="color:#a9a9a9;">]</span><span style="color:#000000;">}</span>
        <span style="color:#006400;">#Это имя пакета, помещаем его в $Name</span>
  <span style="color:#8b0000;">'SoftwareDescription.jsp[^&quot;]+&quot;&gt;([^&lt;]+)'</span> <span style="color:#000000;">{</span><span style="color:#ff4500;">$Name</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$matches</span><span style="color:#a9a9a9;">[</span><span style="color:#800080;">1</span><span style="color:#a9a9a9;">]</span><span style="color:#000000;">}</span>
        <span style="color:#006400;">#Это уже ссылка</span>
  <span style="color:#8b0000;">'targetPage=([^&amp;]+exe)'</span> <span style="color:#000000;">{</span>
            <span style="color:#006400;">#Размаскировываем ссылку и помещаем в переменную $Link</span>
   <span style="color:#ff4500;">$Link</span> <span style="color:#a9a9a9;">=</span> <span style="color:#008080;">[system.uri]</span><span style="color:#a9a9a9;">::</span><span style="color:#000000;">UnescapeDataString</span><span style="color:#000000;">(</span><span style="color:#ff4500;">$matches</span><span style="color:#a9a9a9;">[</span><span style="color:#800080;">1</span><span style="color:#a9a9a9;">]</span><span style="color:#000000;">)</span>
            <span style="color:#006400;">#Создаем новый объект со свойствами Name, Category и Link.</span>
   <span style="color:#0000ff;">New-Object</span> <span style="color:#8a2be2;">PSObject</span> <span style="color:#000080;">-Property</span> <span style="color:#000000;">@{</span><span style="color:#000000;">Name</span><span style="color:#a9a9a9;">=</span><span style="color:#ff4500;">$Name</span><span style="color:#000000;">;</span> <span style="color:#000000;">Category</span><span style="color:#a9a9a9;">=</span><span style="color:#ff4500;">$Category</span><span style="color:#000000;">;</span> <span style="color:#000000;">Link</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$Link</span><span style="color:#000000;">}</span>
  <span style="color:#000000;">}</span>
 <span style="color:#000000;">}</span>
<span style="color:#000000;">)</span>
<span style="color:#006400;">#Страница разобрана, полученные объекты помещены в массив $Meta</span>            

<span style="color:#006400;">#Получаем имя для файла со списком распарсенного, </span>
<span style="color:#006400;">#он будет лежать для справки в корне целевой папки</span>
<span style="color:#ff4500;">$FileName</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">Join-Path</span> <span style="color:#ff4500;">$Destination</span> <span style="color:#8b0000;">&quot;Index.csv&quot;</span>
<span style="color:#006400;">#Отображаем состояние</span>
<span style="color:#0000ff;">Write-Progress</span> <span style="color:#8b0000;">&quot;Exporting Metadata&quot;</span> <span style="color:#ff4500;">$FileName</span>
<span style="color:#006400;">#Экспортируем $Meta в файл</span>
<span style="color:#ff4500;">$Meta</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">Export-Csv</span> <span style="color:#ff4500;">$FileName</span> <span style="color:#000080;">-Encoding</span> <span style="color:#8a2be2;">UTF8</span> <span style="color:#000080;">-NoTypeInformation</span> <span style="color:#000080;">-Delimiter</span> <span style="color:#8b0000;">&quot;,&quot;</span>            

<span style="color:#006400;">#Для каждого объекта в массиве $Meta...</span>
<span style="color:#00008b;">foreach</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Driver</span> <span style="color:#00008b;">in</span> <span style="color:#ff4500;">$Meta</span><span style="color:#000000;">)</span>
<span style="color:#000000;">{</span>
    <span style="color:#006400;">#Выводим статус и имя текущего драйвера/программы</span>
 <span style="color:#0000ff;">Write-Progress</span> <span style="color:#8b0000;">&quot;Downloading files&quot;</span> <span style="color:#ff4500;">$Driver</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Name</span>
    <span style="color:#006400;">#Если не указан ключ $Plain то...</span>
 <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#a9a9a9;">!</span><span style="color:#ff4500;">$Plain</span><span style="color:#000000;">)</span>
 <span style="color:#000000;">{</span>
        <span style="color:#006400;">#Определяем папки для категории и файла, и при необходимости создаем их</span>
  <span style="color:#ff4500;">$CategoryFolder</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">Join-Path</span> <span style="color:#ff4500;">$Destination</span> <span style="color:#ff4500;">$Driver</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Category</span>
  <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#a9a9a9;">-not</span> <span style="color:#000000;">(</span><span style="color:#0000ff;">test-path</span> <span style="color:#ff4500;">$CategoryFolder</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span> <span style="color:#000000;">{</span><span style="color:#0000ff;">md</span> <span style="color:#ff4500;">$CategoryFolder</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">out-null</span><span style="color:#000000;">}</span>
  <span style="color:#ff4500;">$DriverFolder</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">Join-Path</span> <span style="color:#ff4500;">$CategoryFolder</span> <span style="color:#ff4500;">$Driver</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Name</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">replace</span><span style="color:#000000;">(</span><span style="color:#8b0000;">&quot;/&quot;</span><span style="color:#a9a9a9;">,</span><span style="color:#8b0000;">&quot;&quot;</span><span style="color:#000000;">)</span>
  <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#a9a9a9;">-not</span> <span style="color:#000000;">(</span><span style="color:#0000ff;">test-path</span> <span style="color:#ff4500;">$DriverFolder</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span> <span style="color:#000000;">{</span><span style="color:#0000ff;">md</span> <span style="color:#ff4500;">$DriverFolder</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">out-null</span><span style="color:#000000;">}</span>
        <span style="color:#006400;">#Устанавливаем имя под которым будет сохранен файл в соответствующей папке</span>
  <span style="color:#ff4500;">$FileName</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">Join-Path</span> <span style="color:#ff4500;">$DriverFolder</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Driver</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Link</span> <span style="color:#a9a9a9;">-replace</span> <span style="color:#8b0000;">'^.+/'</span><span style="color:#000000;">)</span>
 <span style="color:#000000;">}</span>
 <span style="color:#00008b;">Else</span>
 <span style="color:#000000;">{</span>
        <span style="color:#006400;">#Устанавливаем имя под которым будет сохранен файл в корне папки</span>
  <span style="color:#ff4500;">$FileName</span> <span style="color:#a9a9a9;">=</span> <span style="color:#0000ff;">Join-Path</span> <span style="color:#ff4500;">$Destination</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$Driver</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Link</span> <span style="color:#a9a9a9;">-replace</span> <span style="color:#8b0000;">'^.+/'</span><span style="color:#000000;">)</span>
 <span style="color:#000000;">}</span>
    <span style="color:#006400;">#Если файл еще не существует...</span>
 <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#a9a9a9;">-not</span> <span style="color:#000000;">(</span><span style="color:#0000ff;">test-path</span> <span style="color:#ff4500;">$FileName</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span> <span style="color:#000000;">{</span>
        <span style="color:#006400;">#Вызываем функцию Get-FTPFile для его скачивания</span>
  <span style="color:#0000ff;">Get-FTPFile</span> <span style="color:#000080;">-Source</span> <span style="color:#ff4500;">$Driver</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Link</span> <span style="color:#000080;">-Target</span> <span style="color:#ff4500;">$Filename</span> <span style="color:#000080;">-User</span> <span style="color:#8b0000;">&quot;Anonymous&quot;</span> <span style="color:#000080;">-Pass</span> <span style="color:#8b0000;">&quot;anon@hp.com&quot;</span>
 <span style="color:#000000;">}</span> <span style="color:#00008b;">else</span> <span style="color:#000000;">{</span>
        <span style="color:#006400;">#Иначе выдаем предупреждение, и продолжаем работу</span>
  <span style="color:#0000ff;">Write-Warning</span> <span style="color:#8b0000;">&quot;File $FileName already exists, skipping...&quot;</span>
 <span style="color:#000000;">}</span>
<span style="color:#000000;">}</span></pre>
<p>Так как моделей у меня было много, я не стал для каждой ссылки вызывать сценарий, а просто сохранил ссылки в текстовый файл urls.txt и запустил следующую команду:</p>
<pre>Get-Content .\urls.txt | foreach { C:\Root\Get-HPDrivers.ps1 -Url $_ }</pre>
<p>Ну и вот как то так оно выглядит в работе <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://xaegr.files.wordpress.com/2010/05/hpdownload.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="hpdownload" border="0" alt="hpdownload" src="http://xaegr.files.wordpress.com/2010/05/hpdownload_thumb.png?w=764&#038;h=326" width="764" height="326" /></a></p>
<p>Стоит выразить отдельную благодарность Hewlett-Packard за хорошо структурированную страницу, которую можно разобрать подобным образом. Не многие поставщики способны похвастаться таким.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/xaegr.wordpress.com/771/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/xaegr.wordpress.com/771/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/xaegr.wordpress.com/771/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/xaegr.wordpress.com/771/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/xaegr.wordpress.com/771/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/xaegr.wordpress.com/771/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/xaegr.wordpress.com/771/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/xaegr.wordpress.com/771/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/xaegr.wordpress.com/771/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/xaegr.wordpress.com/771/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/xaegr.wordpress.com/771/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/xaegr.wordpress.com/771/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/xaegr.wordpress.com/771/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/xaegr.wordpress.com/771/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=xaegr.wordpress.com&amp;blog=1963309&amp;post=771&amp;subd=xaegr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://xaegr.wordpress.com/2010/05/09/download-hp-drivers/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/aa41717e3819fe6ebc9c35b245fa23e4?s=96&#38;d=monsterid&#38;r=PG" medium="image">
			<media:title type="html">Xaegr</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/05/usbvacuum.jpg" medium="image">
			<media:title type="html">usbVacuum</media:title>
		</media:content>

		<media:content url="http://xaegr.files.wordpress.com/2010/05/hpdownload_thumb.png" medium="image">
			<media:title type="html">hpdownload</media:title>
		</media:content>
	</item>
	</channel>
</rss>
