<?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/"
	>

<channel>
	<title>wAdmin.ru &#187; SQL Server</title>
	<atom:link href="http://blog.wadmin.ru/tag/sql-server/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.wadmin.ru</link>
	<description>Записки сисадмина</description>
	<lastBuildDate>Sun, 05 Feb 2012 12:00:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>TSQL &#8211; просмотр статуса выполняемых бэкапов</title>
		<link>http://blog.wadmin.ru/2011/07/tsql-view-backup-status/</link>
		<comments>http://blog.wadmin.ru/2011/07/tsql-view-backup-status/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 07:01:24 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Заметки]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=3974</guid>
		<description><![CDATA[Задался вопросом &#8211; как посмотреть процент выполнения текущего задания по резервному копированию? Немного предыстории. На одном из продуктивных Microsoft SQL 2008 серверов перестраивал задания по бэкапам, база слегка разжирела и стала терабайт с хвостом, запустил [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3805" title="SQL Server" src="http://blog.wadmin.ru/wp-content/uploads/2011/06/f2fe07a30827d7454ffd87b5ee18cf701.jpg" alt="SQL Server" width="150" height="123" />Задался вопросом &#8211; как посмотреть процент выполнения текущего задания по резервному копированию?</p>
<p>Немного предыстории.</p>
<p>На одном из продуктивных Microsoft SQL 2008 серверов перестраивал задания по бэкапам, база слегка разжирела и стала терабайт с хвостом, запустил полный бэкап, долго созерцал статус выполнения т.е. ничего&#8230;.</p>
<p>Сунувшись в интернет, в поисках ответа на вопрос о том как увидеть статус, в <strong>Microsoft Script Gallery</strong> нарыл простой рецепт.</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">SELECT</span> command<span class="sy0">,</span><br />
s<span class="sy0">.</span>text<span class="sy0">,</span><br />
start_time<span class="sy0">,</span><br />
percent_complete<span class="sy0">,</span><br />
CAST<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>DATEDIFF<span class="br0">&#40;</span>s<span class="sy0">,</span>start_time<span class="sy0">,</span>GetDate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">/</span>3600<span class="br0">&#41;</span> <span class="kw1">AS</span> varchar<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&#8216; hour(s), &#8216;</span><br />
<span class="sy0">+</span> CAST<span class="br0">&#40;</span><span class="br0">&#40;</span>DATEDIFF<span class="br0">&#40;</span>s<span class="sy0">,</span>start_time<span class="sy0">,</span>GetDate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>%3600<span class="br0">&#41;</span><span class="sy0">/</span>60 <span class="kw1">AS</span> varchar<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&#8216;min, &#8216;</span><br />
<span class="sy0">+</span> CAST<span class="br0">&#40;</span><span class="br0">&#40;</span>DATEDIFF<span class="br0">&#40;</span>s<span class="sy0">,</span>start_time<span class="sy0">,</span>GetDate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>%60<span class="br0">&#41;</span> <span class="kw1">AS</span> varchar<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&#8216; sec&#8217;</span> <span class="kw1">AS</span> running_time<span class="sy0">,</span><br />
CAST<span class="br0">&#40;</span><span class="br0">&#40;</span>estimated_completion_time<span class="sy0">/</span>3600000<span class="br0">&#41;</span> <span class="kw1">AS</span> varchar<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&#8216; hour(s), &#8216;</span><br />
<span class="sy0">+</span> CAST<span class="br0">&#40;</span><span class="br0">&#40;</span>estimated_completion_time %3600000<span class="br0">&#41;</span><span class="sy0">/</span>60000 <span class="kw1">AS</span> varchar<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&#8216;min, &#8216;</span><br />
<span class="sy0">+</span> CAST<span class="br0">&#40;</span><span class="br0">&#40;</span>estimated_completion_time %60000<span class="br0">&#41;</span><span class="sy0">/</span>1000 <span class="kw1">AS</span> varchar<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&#8216; sec&#8217;</span> <span class="kw1">AS</span> est_time_to_go<span class="sy0">,</span><br />
dateadd<span class="br0">&#40;</span>second<span class="sy0">,</span>estimated_completion_time<span class="sy0">/</span>1000<span class="sy0">,</span> getdate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">AS</span> est_completion_time<br />
<span class="kw1">FROM</span> sys<span class="sy0">.</span>dm_exec_requests r<br />
<span class="kw1">CROSS</span> APPLY sys<span class="sy0">.</span>dm_exec_sql_text<span class="br0">&#40;</span>r<span class="sy0">.</span>sql_handle<span class="br0">&#41;</span> s<br />
<span class="kw1">WHERE</span> r<span class="sy0">.</span>command <span class="kw1">IN</span> <span class="br0">&#40;</span><span class="st0">&#8216;RESTORE DATABASE&#8217;</span><span class="sy0">,</span> <span class="st0">&#8216;BACKUP DATABASE&#8217;</span><span class="sy0">,</span> <span class="st0">&#8216;RESTORE LOG&#8217;</span><span class="sy0">,</span> <span class="st0">&#8216;BACKUP LOG&#8217;</span><span class="br0">&#41;</span></div>
</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/07/tsql-view-backup-status/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Информация о бэкапах средствами TSQL</title>
		<link>http://blog.wadmin.ru/2011/06/sql-backup-info/</link>
		<comments>http://blog.wadmin.ru/2011/06/sql-backup-info/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 06:55:52 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Заметки]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=3807</guid>
		<description><![CDATA[Сегодня понадобилось поднять историческую информацию о выполненных резервных копиях на одном из SQL серверов. Раскапывать логи в графической консоли было лень и я покопавшись в интернете нашел методику которая позволяет сильно сэкономить время и нервы. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3805" title="SQL Server" src="http://blog.wadmin.ru/wp-content/uploads/2011/06/f2fe07a30827d7454ffd87b5ee18cf701.jpg" alt="SQL Server" width="150" height="123" />Сегодня понадобилось поднять историческую информацию о выполненных резервных копиях на одном из SQL серверов. Раскапывать логи в графической консоли было лень и я покопавшись в интернете нашел методику которая позволяет сильно сэкономить время и нервы.</p>
<p>Первым делом нужно собрать информацию по резервным копиям для всех баз данных. После отработки скрипта (выполняется он в контексте анализируемого сервера из SQL Management Studio) вы получите табличку с информацией о базе данных и временем последнего полного бэкапа.</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">SELECT</span> db<span class="sy0">.</span>name <span class="kw1">AS</span> <span class="br0">&#91;</span><span class="kw1">DATABASE</span><span class="br0">&#93;</span><span class="sy0">,</span> max<span class="br0">&#40;</span>backup_finish_date<span class="br0">&#41;</span> <span class="kw1">AS</span> <span class="br0">&#91;</span>LastBackupDate<span class="br0">&#93;</span><br />
<span class="kw1">FROM</span> <span class="br0">&#91;</span>master<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>dbo<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>sysdatabases<span class="br0">&#93;</span> db <span class="kw1">LEFT</span> <span class="kw1">OUTER</span> <span class="kw1">JOIN</span> <span class="br0">&#91;</span>msdb<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>dbo<span class="br0">&#93;</span><span class="sy0">.</span><span class="br0">&#91;</span>backupset<span class="br0">&#93;</span> bs <span class="kw1">ON</span> &nbsp; &nbsp; &nbsp; &nbsp; bs<span class="sy0">.</span>database_name <span class="sy0">=</span> db<span class="sy0">.</span>name <span class="kw1">AND</span> bs<span class="sy0">.</span>type <span class="sy0">=</span> <span class="st0">&#8216;D&#8217;</span><br />
<span class="kw1">GROUP</span> <span class="kw1">BY</span> db<span class="sy0">.</span>name<br />
<span class="kw1">ORDER</span> <span class="kw1">BY</span> db<span class="sy0">.</span>name</div>
</div>
<p>Для наглядности можно запросить более подробную информацию о том когда была полная копия и дифференциальная плюс количество дней прошедших с момента резервного копирования.</p>
<p>В случае если с момента последней полной копии прошло более 7 дней скрипт выведет предупреждение &#8217;Possible Problem&#8217;  для полной копии и при двух днях для разностной.</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">SELECT</span> s<span class="sy0">.</span>name <span class="kw1">AS</span> database_name<span class="sy0">,</span> backup_type <span class="sy0">=</span><br />
CASE<br />
WHEN b<span class="sy0">.</span>type <span class="sy0">=</span> <span class="st0">&#8216;D&#8217;</span> THEN <span class="st0">&#8216;Full&#8217;</span><br />
WHEN b<span class="sy0">.</span>type <span class="sy0">=</span> <span class="st0">&#8216;I&#8217;</span> THEN <span class="st0">&#8216;Diff&#8217;</span><br />
END<span class="sy0">,</span><br />
MAX<span class="br0">&#40;</span>b<span class="sy0">.</span>backup_start_date<span class="br0">&#41;</span> <span class="kw1">AS</span> last_backup_start_time<span class="sy0">,</span><br />
DATEDIFF<span class="br0">&#40;</span>d<span class="sy0">,</span> MAX<span class="br0">&#40;</span>b<span class="sy0">.</span>backup_start_date<span class="br0">&#41;</span><span class="sy0">,</span> getdate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">AS</span> days_since_last_backup<span class="sy0">,</span> <span class="kw1">STATUS</span> <span class="sy0">=</span><br />
CASE<br />
WHEN b<span class="sy0">.</span>type <span class="sy0">=</span> <span class="st0">&#8216;D&#8217;</span> <span class="kw1">AND</span> DATEDIFF<span class="br0">&#40;</span>d<span class="sy0">,</span> MAX<span class="br0">&#40;</span>b<span class="sy0">.</span>backup_start_date<span class="br0">&#41;</span><span class="sy0">,</span> getdate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp;lt;<span class="sy0">=</span> <span class="nu0">7</span> THEN <span class="st0">&#8216;OK&#8217;</span><br />
WHEN b<span class="sy0">.</span>type <span class="sy0">=</span> <span class="st0">&#8216;D&#8217;</span> <span class="kw1">AND</span> DATEDIFF<span class="br0">&#40;</span>d<span class="sy0">,</span> MAX<span class="br0">&#40;</span>b<span class="sy0">.</span>backup_start_date<span class="br0">&#41;</span><span class="sy0">,</span> getdate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp;gt; <span class="nu0">7</span> THEN <span class="st0">&#8216;Possible Problem&#8217;</span><br />
WHEN b<span class="sy0">.</span>type <span class="sy0">=</span> <span class="st0">&#8216;I&#8217;</span> <span class="kw1">AND</span> DATEDIFF<span class="br0">&#40;</span>d<span class="sy0">,</span> MAX<span class="br0">&#40;</span>b<span class="sy0">.</span>backup_start_date<span class="br0">&#41;</span><span class="sy0">,</span> getdate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp;lt;<span class="sy0">=</span> <span class="nu0">2</span> THEN <span class="st0">&#8216;OK&#8217;</span><br />
WHEN b<span class="sy0">.</span>type <span class="sy0">=</span> <span class="st0">&#8216;I&#8217;</span> <span class="kw1">AND</span> DATEDIFF<span class="br0">&#40;</span>d<span class="sy0">,</span> MAX<span class="br0">&#40;</span>b<span class="sy0">.</span>backup_start_date<span class="br0">&#41;</span><span class="sy0">,</span> getdate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp;gt; <span class="nu0">2</span> THEN <span class="st0">&#8216;Possible Problem&#8217;</span><br />
WHEN MAX<span class="br0">&#40;</span>b<span class="sy0">.</span>backup_start_date<span class="br0">&#41;</span> <span class="kw1">IS</span> <span class="kw1">NULL</span> THEN <span class="st0">&#8216;No Backup Exists&#8217;</span><br />
END<br />
<span class="kw1">FROM</span> sys<span class="sy0">.</span><span class="kw1">DATABASES</span> s <span class="kw1">LEFT</span> <span class="kw1">JOIN</span> msdb<span class="sy0">..</span>backupset b<br />
<span class="kw1">ON</span> s<span class="sy0">.</span>name <span class="sy0">=</span> b<span class="sy0">.</span>database_name<br />
<span class="kw1">WHERE</span> s<span class="sy0">.</span>name &amp;lt;&amp;gt; <span class="st0">&#8216;master&#8217;</span> <span class="kw1">AND</span> s<span class="sy0">.</span>name &amp;lt;&amp;gt; <span class="st0">&#8216;model&#8217;</span> <span class="kw1">AND</span> s<span class="sy0">.</span>name &amp;lt;&amp;gt; <span class="st0">&#8216;msdb&#8217;</span> <span class="kw1">AND</span> s<span class="sy0">.</span>name &amp;lt;&amp;gt; <span class="st0">&#8216;tempdb&#8217;</span><br />
<span class="kw1">GROUP</span> <span class="kw1">BY</span> s<span class="sy0">.</span>name<span class="sy0">,</span> b<span class="sy0">.</span>type<br />
<span class="kw1">ORDER</span> <span class="kw1">BY</span> s<span class="sy0">.</span>name</div>
</div>
<p>Для получения подробной информации о размере бэкапов, местоположении файлов, времени выполнения и пр. используйте скрипт который представлен ниже.</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">SELECT</span> msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupmediafamily<span class="sy0">.</span>physical_device_name <span class="kw1">AS</span> FILE_LOCATION<span class="sy0">,</span><br />
msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupset<span class="sy0">.</span>database_name <span class="kw1">AS</span> DATABASE_NAME<span class="sy0">,</span><br />
CAST<span class="br0">&#40;</span>CAST<span class="br0">&#40;</span>msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupset<span class="sy0">.</span>backup_size <span class="sy0">/</span> 1000000 <span class="kw1">AS</span> INT<span class="br0">&#41;</span> <span class="kw1">AS</span> VARCHAR<span class="br0">&#40;</span><span class="nu0">14</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">+</span> <span class="st0">&#8216; &#8216;</span> <span class="sy0">+</span> <span class="st0">&#8216;MB&#8217;</span> <span class="kw1">AS</span> BACKUP_SIZE<span class="sy0">,</span><br />
CAST<span class="br0">&#40;</span>DATEDIFF<span class="br0">&#40;</span>second<span class="sy0">,</span> msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupset<span class="sy0">.</span>backup_start_date<span class="sy0">,</span> msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupset<span class="sy0">.</span>backup_finish_date<span class="br0">&#41;</span> <span class="kw1">AS</span> VARCHAR<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&#8216; &#8216;</span><span class="sy0">+</span> <span class="st0">&#8216;Seconds&#8217;</span> <span class="kw1">AS</span> BACKUP_TIME_TAKEN<span class="sy0">,</span><br />
msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupset<span class="sy0">.</span>backup_start_date <span class="kw1">AS</span> BACKUP_DATE_TIME<span class="sy0">,</span><br />
CASE msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupset<span class="sy0">.</span><span class="br0">&#91;</span>type<span class="br0">&#93;</span><br />
WHEN <span class="st0">&#8216;D&#8217;</span> THEN <span class="st0">&#8216;Full&#8217;</span><br />
WHEN <span class="st0">&#8216;I&#8217;</span> THEN <span class="st0">&#8216;Differential&#8217;</span><br />
WHEN <span class="st0">&#8216;L&#8217;</span> THEN <span class="st0">&#8216;Transaction Log&#8217;</span><br />
END <span class="kw1">AS</span> BACKUP_TYPE<br />
<span class="kw1">FROM</span><br />
msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupset<br />
<span class="kw1">INNER</span> <span class="kw1">JOIN</span> msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupmediafamily<br />
<span class="kw1">ON</span> msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupset<span class="sy0">.</span>media_set_id <span class="sy0">=</span> msdb<span class="sy0">.</span>dbo<span class="sy0">.</span>backupmediafamily<span class="sy0">.</span>media_set_id</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/06/sql-backup-info/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Страшная история или SQL тут не виноват</title>
		<link>http://blog.wadmin.ru/2011/06/horror/</link>
		<comments>http://blog.wadmin.ru/2011/06/horror/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 17:02:48 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Заметки]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=3748</guid>
		<description><![CDATA[В очередной раз столкнувшись с наплевательским отношением к безопасностью, вернее с полным пренебреженим элементарными правилами безопасности, решил написать небольшую заметку о том как не надо поступать при планировании своих приложений. Нежданно негаданно, как снег на [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3750" title="кошмарный сон сисадмина" src="http://blog.wadmin.ru/wp-content/uploads/2011/06/freddy-krueger.jpg" alt="кошмарный сон сисадмина" width="150" height="100" />В очередной раз столкнувшись с наплевательским отношением к безопасностью, вернее с полным пренебреженим элементарными правилами безопасности, решил написать небольшую заметку о том как не надо поступать при планировании своих приложений.</p>
<p>Нежданно негаданно, как снег на голову, нарисовался старый знакомый который попросил потестировать приложение установленное на MS SQL 2008, которое разворачивает у них контора &laquo;Х&raquo; (читать как Икс <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p>Договорились о работах на выходных, приехал на объект, там уже была делегация по встрече с лицами полными предвкушения торжества&#8230;</p>
<p>Знали бы они что их ждет через 30 минут так бы не радовались <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Кадр №1, условно назовем его &laquo;Разработчик&raquo;, презрительно смерив меня взглядом неспешно проводил демонтстрацию продукта. Жертвой было приложение которое судя по пространным рассказам генерило какие то отчеты и довольно привлекательные диаграммы. Выдержав получасовую пытку мозга рассказами об эффективности данного приложения я прервав &laquo;разработчика&raquo; спросил о том что именно они хотят от меня в данном случае.<br />
- Надо проверить насколько безопасно приложение. &#8211; ответил собеседник.<br />
- Ну надо так надо&#8230; &#8211; выдохнул я и сел за предоставленный ноутбук.</p>
<h3>Осмотр пациента</h3>
<p>Не буду никого грузить подробностями того что мне довелось изучить, сразу перейду к заключению.</p>
<p>При беглом просмотре бинарника средствами FAR-а, никак не думал что натолкнусь на &laquo;школьную комбинацию&raquo; <strong>ID=sa</strong> и <strong>;Password=xxxxxxx</strong>.<br />
Элементарная проверка</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;">xp_cmdshell<span class="st0">&#8216;whoami.exe&#8217;</span><br />
GO</div>
</div>
<p>Показала что включена процедура <strong>xp_cmdshell</strong> и что пользователь <strong>sa</strong> является тем кем он должен быть.</p>
<p>Показал результат &laquo;экзаменаторам&raquo;<br />
- Ну и что? &#8211; спросил &laquo;разработчик&raquo;.<br />
- Это ничего не дает. &#8211; добавил знакомый.<br />
- Вы в этом уверены? Вы используете пользователя <strong>sa</strong> и процедуру <strong>cmd_shell</strong>?</p>
<p>Что было сказано дальше повергло меня в тихий шок.<br />
- Мы используем его для мониторинга свободного места на дисках.<br />
- &#8230;.<br />
- Еще мы используем его для бэкапов.<br />
- &#8230;.<br />
- Что вы улыбаетесь? Что в этом такого?</p>
<h3>Расправа</h3>
<p>Пришлось показывать на примере.</p>
<p>Запуск первой команды совершенно спокойно создал пользователя под именем <strong>test1</strong></p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;">xp_cmdshell<span class="st0">&#8216;net user test1 P@SSW0rd12345 /ADD&#8217;</span><br />
GO</div>
</div>
<p>Запуск второй команды добавил его в локальную группу администраторов</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;">xp_cmdshell <span class="st0">&#8216;net localgroup Admininstrators test1 /ADD&#8217;</span><br />
GO</div>
</div>
<p>Третьим шагом через RDP зашел на сервер, отключил антивирус, осмотрелся, нашел задание по бэкапу (странный скрипт) который стартовал, меня это ни сколько не удивило, из под доменного администратора.</p>
<p>Дальше процедуру создания нового доменного админа и запуск задания описывать не буду. Уверен что всем она прекрасно известна.</p>
<h3>Итог</h3>
<p>Фактически на &laquo;взлом&raquo; SQL сервера ушло не более 10 минут, на получение полномочий доменного администратора еще немного.</p>
<p>Знакомый опять пропал, думаю что надолго&#8230; Наверное пошел думать о жизни <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>К чему я все это?</p>
<p>Да, наверно к тому что безопасностью очень часто пренебрегают и не стараются следовать рекомендациям из Best Practice, и довольно часто не стесняясь (возможно и не подозревая что в этом может быть) используют повышенные привилегии.</p>
<p>PS все написанное выше предназначено для ознакомления и никак не для практики <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/06/horror/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Переименование SQL сервера</title>
		<link>http://blog.wadmin.ru/2011/02/rename-sql/</link>
		<comments>http://blog.wadmin.ru/2011/02/rename-sql/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 13:49:16 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Настройка]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=2611</guid>
		<description><![CDATA[Задача &#8211; переименование SQL сервера. Решение: Шаг 1 &#8211; переименование хоста. Методику описывать не буду т.к. по ней вопросов быть не должно. Шаг 2 &#8211; выполнение процедуры для изменения настроек SQL. Выполните процедуры описанные ниже. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-2639" title="sql" src="http://blog.wadmin.ru/wp-content/uploads/2011/02/sql.gif" alt="sql" width="200" height="148" /><strong>Задача</strong> &#8211; переименование SQL сервера.<br />
<strong>Решение</strong>:<br />
<strong>Шаг 1</strong> &#8211; переименование хоста.<br />
Методику описывать не буду т.к. по ней вопросов быть не должно.<br />
<strong>Шаг 2</strong> &#8211; выполнение процедуры для изменения настроек SQL.<br />
Выполните процедуры описанные ниже.<br />
<span id="more-2611"></span></p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;">sp_dropserver <span class="st0">&#8216;OLD_NAME&#8217;</span><br />
GO<br />
sp_addserver <span class="st0">&quot;NEW_NAME&quot;</span><span class="sy0">,</span> <span class="kw1">LOCAL</span><br />
GO</div>
</div>
<p>Производим перезапуск служб SQL.</p>
<p>Для переименование SQL-инстанций выполните следующую процедуру.</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;">sp_dropserver <span class="st0">&#8216;OLD_NAME<span class="es0">\i</span>nstancename&#8217;</span><br />
GO<br />
sp_addserver <span class="st0">&#8216;NEW_NAME<span class="es0">\i</span>nstancename&#8217;</span><span class="sy0">,</span> <span class="kw1">LOCAL</span><br />
GO</div>
</div>
<p><strong>Шаг 3</strong> &#8211; проверка результатов.<br />
Для проверки правильности выполненных операций требуется провести еще одну процедуру.</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">SELECT</span> @@SERVERNAME <span class="kw1">AS</span> <span class="st0">&#8216;Server Name&#8217;</span></div>
</div>
<p>Если вы видите в поле &#8216;Server Name&#8217; то что вы задали то процедура прошла успешно.</p>
<p>Вы можете оставить комментарий ниже или обсудить статью в <a href="http://forum.wadmin.ru/topic/8" rel="nofollow">форуме</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/02/rename-sql/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Получение всех пользователей c ролью sysadmin с SQL</title>
		<link>http://blog.wadmin.ru/2011/02/get-sql-sysadmins-users/</link>
		<comments>http://blog.wadmin.ru/2011/02/get-sql-sysadmins-users/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 11:33:44 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=2530</guid>
		<description><![CDATA[Навожу порядок на своих SQL-серверах и первое что бросается в глаза это обилие излишних полномочий. Безусловно оно только вредит пример чего можно найти в статье о том как не надо создавать приложения. Теперь к делу. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-2540 alignright" title="SQL-sysadmin-role" src="http://blog.wadmin.ru/wp-content/uploads/2011/02/SQL-sysadmin-role.jpg" alt="SQL-sysadmin-role" width="151" height="196" />Навожу порядок на своих SQL-серверах и первое что бросается в глаза это обилие излишних полномочий.</p>
<p>Безусловно оно только вредит пример чего можно найти в <a title="Страшная история или SQL тут не виноват" href="http://blog.wadmin.ru/2011/06/horror/">статье</a> о том как не надо создавать приложения.</p>
<p>Теперь к делу.</p>
<p>На одном из серверов нашелся пользователь <strong>test</strong> ну с очень большими и излишними привелегиями. При разборе полетов выяснилось что его родителями являются разработчики которые &laquo;что то там тестировали&raquo;.</p>
<p>После небольшого <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  изумления принялся разыскивать остальных &laquo;залетчиков&raquo;.<br />
Наваял файлик <strong>servers.txt</strong> со списком нужных SQL-серверов и порывшись в архивах сообразил вот такой скриптик.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="co1"># получаем список серверов из заранее приготовленного файла</span><br />
<span class="re0">$servers</span> <span class="sy0">=</span> <span class="kw1">get-content</span> servers.txt</p>
<p><span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$server</span> <span class="kw3">in</span> <span class="re0">$servers</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="co1"># создаем соединение</span><br />
<span class="re0">$SqlConnection</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlConnection<br />
<span class="co1"># задаем строку соединения</span><br />
<span class="re0">$SqlConnection</span>.ConnectionString <span class="sy0">=</span> <span class="st0">&quot;Server=$($server);Database=master;Integrated Security=True&quot;</span><br />
<span class="re0">$SqlCmd</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlCommand</p>
<p><span class="co1"># сам запрос</span><br />
<span class="re0">$SqlCmd</span>.CommandText <span class="sy0">=</span> <span class="st0">&quot;SELECT DISTINCT syslogins.loginname, syslogins.dbname,<br />
@@SERVERNAME AS &#8216;ServerName&#8217;<br />
FROM sysprotects, syslogins<br />
WHERE sysadmin = 1&quot;</span></p>
<p><span class="re0">$SqlCmd</span>.Connection <span class="sy0">=</span> <span class="re0">$SqlConnection</span></p>
<p><span class="re0">$SqlAdapter</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlDataAdapter<br />
<span class="re0">$SqlAdapter</span>.SelectCommand <span class="sy0">=</span> <span class="re0">$SqlCmd</span></p>
<p><span class="re0">$DataSet</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.DataSet</p>
<p><span class="re0">$SqlAdapter</span>.Fill<span class="br0">&#40;</span><span class="re0">$DataSet</span><span class="br0">&#41;</span></p>
<p><span class="re0">$SqlConnection</span>.Close<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="re0">$DataSet</span>.Tables<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Поставленная задача решена. Можно спать спокойно <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/02/get-sql-sysadmins-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Reporting Services &#8211; подготовка IIS</title>
		<link>http://blog.wadmin.ru/2011/01/prepera-iis-for-sql-reporting/</link>
		<comments>http://blog.wadmin.ru/2011/01/prepera-iis-for-sql-reporting/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 07:22:33 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Заметки]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=2361</guid>
		<description><![CDATA[Перед установкой SQL Reporting Services необходимо поставить компоненты IIS-а Добавляем роль сервера Web Server (IIS) со следующими настройками Static Content Default Document Directory Browsing HTTP Errors HTTP Redirection в ветке Application Developmentвыбираем ASP.NET в ветке Security выбираем [...]]]></description>
			<content:encoded><![CDATA[<p>Перед установкой <strong>SQL Reporting Services</strong> необходимо поставить компоненты IIS-а</p>
<ul>
<li>Добавляем роль сервера Web Server (IIS) со следующими настройками</li>
<li>Static Content</li>
<li>Default Document</li>
<li>Directory Browsing</li>
<li>HTTP Errors</li>
<li>HTTP Redirection</li>
<li>в ветке Application Developmentвыбираем ASP.NET</li>
<li>в ветке Security выбираем Windows Authentication</li>
<li>в ветке Management Tools, выбираем IIS 6 Management Capability и в нем вот это
<ul>
<li>IIS Metabase Compatibility</li>
<li>IIS 6 WMI Compatibility</li>
<li>IIS 6 Scripting Tools</li>
<li>IIS 6 Management Console</li>
</ul>
</li>
</ul>
<p>Все что нужно выбрано, нажимаем Install</p>
<p>Дожидаемся окончания установки и переходим непосредственно к установке SQL.</p>
<p>После старта установки, в случае если вы правильно поставили все компоненты IIS, на этапе проверки вылезет хорошая картинка</p>
<p><img class="size-full wp-image-2289 alignnone" title="sql01" src="http://blog.wadmin.ru/wp-content/uploads/2011/01/sql01.png" alt="" width="493" height="450" /></p>
<p>Жмем &laquo;Next&raquo;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/01/prepera-iis-for-sql-reporting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Получение ключа SQL Server</title>
		<link>http://blog.wadmin.ru/2010/11/get-sql-server-product-key/</link>
		<comments>http://blog.wadmin.ru/2010/11/get-sql-server-product-key/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 08:00:28 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=1622</guid>
		<description><![CDATA[Я уже писал ранее о том как получить ключ продукта для Windows. Покопавшись в реестре и в документации на Microsoft SQL Server 2008 набрел на ветку реестра: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\Setup Где нашлось значение DigitalProductId через [...]]]></description>
			<content:encoded><![CDATA[<p>Я уже писал <a href="http://blog.wadmin.ru/2010/11/get-windows-product-key/">ранее</a> о том как получить ключ продукта для Windows. Покопавшись в реестре и в документации на Microsoft SQL Server 2008 набрел на ветку реестра:</p>
<pre>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\Setup
</pre>
<p>Где нашлось значение DigitalProductId</p>
<p>через некоторое время получился вот такой скрипт.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="kw3">function</span> Get<span class="sy0">-</span>SQLKey <span class="br0">&#123;</span></p>
<p><span class="kw3">param</span> <span class="br0">&#40;</span><span class="re0">$targets</span> <span class="sy0">=</span> <span class="st0">&quot;.&quot;</span><span class="br0">&#41;</span></p>
<p><span class="re0">$hklm</span> <span class="sy0">=</span> 2147483650<br />
<span class="re0">$regPath</span> <span class="sy0">=</span> <span class="st0">&quot;SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\Setup&quot;</span><br />
<span class="re0">$regVal1</span> <span class="sy0">=</span> <span class="st0">&quot;DigitalProductId&quot;</span><br />
<span class="re0">$regVal2</span> <span class="sy0">=</span> <span class="st0">&quot;PatchLevel&quot;</span><br />
<span class="re0">$regVal3</span> <span class="sy0">=</span> <span class="st0">&quot;Edition&quot;</span></p>
<p><span class="kw3">Foreach</span> <span class="br0">&#40;</span><span class="re0">$target</span> <span class="kw3">in</span> <span class="re0">$targets</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re0">$productKey</span> <span class="sy0">=</span> <span class="re0">$null</span><br />
<span class="re0">$osData</span> <span class="sy0">=</span> <span class="re0">$null</span><br />
<span class="re0">$wmi</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="re3">WMIClass</span><span class="br0">&#93;</span><span class="st0">&quot;\\$target\root\default:stdRegProv&quot;</span><br />
<span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$wmi</span>.GetBinaryValue<span class="br0">&#40;</span><span class="re0">$hklm</span><span class="sy0">,</span><span class="re0">$regPath</span><span class="sy0">,</span><span class="re0">$regVal1</span><span class="br0">&#41;</span><br />
<span class="br0">&#91;</span><span class="re3">string</span><span class="br0">&#93;</span><span class="re0">$version</span> <span class="sy0">=</span> <span class="re0">$wmi</span>.GetstringValue<span class="br0">&#40;</span><span class="re0">$hklm</span><span class="sy0">,</span><span class="re0">$regPath</span><span class="sy0">,</span><span class="re0">$regVal2</span><span class="br0">&#41;</span>.svalue<br />
<span class="br0">&#91;</span><span class="re3">string</span><span class="br0">&#93;</span><span class="re0">$edition</span> <span class="sy0">=</span> <span class="re0">$wmi</span>.GetstringValue<span class="br0">&#40;</span><span class="re0">$hklm</span><span class="sy0">,</span><span class="re0">$regPath</span><span class="sy0">,</span><span class="re0">$regVal3</span><span class="br0">&#41;</span>.svalue<br />
<span class="re0">$binArray</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="re0">$data</span>.uValue<span class="br0">&#41;</span><span class="br0">&#91;</span>52..66<span class="br0">&#93;</span><br />
<span class="re0">$charsArray</span> <span class="sy0">=</span> <span class="st0">&quot;B&quot;</span><span class="sy0">,</span><span class="st0">&quot;C&quot;</span><span class="sy0">,</span><span class="st0">&quot;D&quot;</span><span class="sy0">,</span><span class="st0">&quot;F&quot;</span><span class="sy0">,</span><span class="st0">&quot;G&quot;</span><span class="sy0">,</span><span class="st0">&quot;H&quot;</span><span class="sy0">,</span><span class="st0">&quot;J&quot;</span><span class="sy0">,</span><span class="st0">&quot;K&quot;</span><span class="sy0">,</span><span class="st0">&quot;M&quot;</span><span class="sy0">,</span><span class="st0">&quot;P&quot;</span><span class="sy0">,</span><span class="st0">&quot;Q&quot;</span><span class="sy0">,</span><span class="st0">&quot;R&quot;</span><span class="sy0">,</span></p>
<p><span class="st0">&quot;T&quot;</span><span class="sy0">,</span><span class="st0">&quot;V&quot;</span><span class="sy0">,</span><span class="st0">&quot;W&quot;</span><span class="sy0">,</span><span class="st0">&quot;X&quot;</span><span class="sy0">,</span><span class="st0">&quot;Y&quot;</span><span class="sy0">,</span><span class="st0">&quot;2&quot;</span><span class="sy0">,</span><span class="st0">&quot;3&quot;</span><span class="sy0">,</span><span class="st0">&quot;4&quot;</span><span class="sy0">,</span><span class="st0">&quot;6&quot;</span><span class="sy0">,</span><span class="st0">&quot;7&quot;</span><span class="sy0">,</span><span class="st0">&quot;8&quot;</span><span class="sy0">,</span><span class="st0">&quot;9&quot;</span></p>
<p><span class="kw3">For</span> <span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">=</span> <span class="nu0">24</span>; <span class="re0">$i</span> <span class="kw4">-ge</span> <span class="nu0">0</span>; <span class="re0">$i</span><span class="sy0">&#8211;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re0">$k</span> <span class="sy0">=</span> 0<br />
<span class="kw3">For</span> <span class="br0">&#40;</span><span class="re0">$j</span> <span class="sy0">=</span> <span class="nu0">14</span>; <span class="re0">$j</span> <span class="kw4">-ge</span> <span class="nu0">0</span>; <span class="re0">$j</span><span class="sy0">&#8211;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re0">$k</span> <span class="sy0">=</span> <span class="re0">$k</span> <span class="sy0">*</span> 256 <span class="sy0">-</span>bxor <span class="re0">$binArray</span><span class="br0">&#91;</span><span class="re0">$j</span><span class="br0">&#93;</span><br />
<span class="re0">$binArray</span><span class="br0">&#91;</span><span class="re0">$j</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="br0">&#91;</span>math<span class="br0">&#93;</span>::truncate<span class="br0">&#40;</span><span class="re0">$k</span> <span class="sy0">/</span> 24<span class="br0">&#41;</span><br />
<span class="re0">$k</span> <span class="sy0">=</span> <span class="re0">$k</span> <span class="sy0">%</span> 24<br />
<span class="br0">&#125;</span></p>
<p><span class="re0">$productKey</span> <span class="sy0">=</span> <span class="re0">$charsArray</span><span class="br0">&#91;</span><span class="re0">$k</span><span class="br0">&#93;</span> <span class="sy0">+</span> <span class="re0">$productKey</span><br />
<span class="kw3">If</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$i</span> <span class="sy0">%</span> 5 <span class="kw4">-eq</span> 0<span class="br0">&#41;</span> <span class="kw4">-and</span> <span class="br0">&#40;</span><span class="re0">$i</span> <span class="kw4">-ne</span> 0<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re0">$productKey</span> <span class="sy0">=</span> <span class="st0">&quot;-&quot;</span> <span class="sy0">+</span> <span class="re0">$productKey</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="re0">$osData</span> <span class="sy0">=</span> <span class="kw1">Get-WmiObject</span> Win32_OperatingSystem <span class="sy0">-</span>computer <span class="re0">$target</span><br />
<span class="re0">$obj</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> Object<br />
<span class="re0">$obj</span> <span class="sy0">|</span> <span class="kw1">Add-Member</span> Noteproperty Computer <span class="kw5">-value</span> <span class="re0">$target</span><br />
<span class="re0">$obj</span> <span class="sy0">|</span> <span class="kw1">Add-Member</span> Noteproperty OSCaption <span class="kw5">-value</span> <span class="re0">$osData</span>.Caption<br />
<span class="re0">$obj</span> <span class="sy0">|</span> <span class="kw1">Add-Member</span> Noteproperty OSArch <span class="kw5">-value</span> <span class="re0">$osData</span>.OSArchitecture<br />
<span class="re0">$obj</span> <span class="sy0">|</span> <span class="kw1">Add-Member</span> Noteproperty SQLver <span class="kw5">-value</span> <span class="re0">$version</span><br />
<span class="re0">$obj</span> <span class="sy0">|</span> <span class="kw1">Add-Member</span> Noteproperty SQLedition <span class="kw5">-value</span> <span class="re0">$edition</span><br />
<span class="re0">$obj</span> <span class="sy0">|</span> <span class="kw1">Add-Member</span> Noteproperty ProductKey <span class="kw5">-value</span> <span class="re0">$productkey</span><br />
<span class="re0">$obj</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Вызов скрипта для текущего сервера</p>
<pre>Get-SQLKey
</pre>
<p>для удаленного сервера или нескольких серверов</p>
<pre>Get-SQLKey "SQL-01", "SQL-02"
</pre>
<p>Если у вас есть необходимость получить значение для Microsoft SQL 2000 то нужная ветка реестра находится в другом месте.</p>
<pre>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\80\Registration
</pre>
<p>Ключи DigitalProductID и ProductID.</p>
<p</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2010/11/get-sql-server-product-key/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сборка данных о бэкапах старше Х дней</title>
		<link>http://blog.wadmin.ru/2010/07/collect-backup-statistics/</link>
		<comments>http://blog.wadmin.ru/2010/07/collect-backup-statistics/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 06:05:35 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=1213</guid>
		<description><![CDATA[При аудите серверов БД возникла необходимость проверить состояние бэкапов примерно на сотне серверов Microsoft SQL. Почесав затылок от перспективы &#171;с пользой&#187; провести массу времени, предпринял попытку вспомнить инструментарий который позволяет достичь поставленной задачи. По первым [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wadmin.ru/wp-content/uploads/2010/02/poweshell_img.png"><img class="alignright size-full wp-image-790" title="poweshell_img" src="http://blog.wadmin.ru/wp-content/uploads/2010/02/poweshell_img.png" alt="Powershell Logo" width="150" height="150" /></a><br />
При аудите серверов БД возникла необходимость проверить состояние бэкапов примерно на сотне серверов Microsoft SQL. Почесав затылок от перспективы &laquo;с пользой&raquo; провести массу времени, предпринял попытку вспомнить инструментарий который позволяет достичь поставленной задачи.</p>
<p>По первым линкам найденным в интернете выяснилось что некоторые продукты стоят денег, некоторые дают не ту информацию, некоторые дают совсем не ту информацию.</p>
<p>Выдохнул, включил в процесс голову и в процессе поисков наткнулся на SQL-скрипт для достижения нужного результата. Примерно за пять минут дописал к нему обертку из powershell-а и вот что получилось.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="co1"># get-backup-statistics.ps1</span></p>
<p><span class="co1"># получаем список серверов из заранее приготовленного файла</span><br />
<span class="re0">$servers</span> <span class="sy0">=</span> <span class="kw1">get-content</span> servers.txt</p>
<p><span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$server</span> <span class="kw3">in</span> <span class="re0">$servers</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw1">Write-Output</span> <span class="st0">&quot;======&quot;</span><br />
<span class="kw1">Write-Output</span> <span class="re0">$server</span><br />
<span class="co1"># создаем соединение</span><br />
<span class="re0">$SqlConnection</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlConnection<br />
<span class="co1"># задаем строку соединения</span><br />
<span class="re0">$SqlConnection</span>.ConnectionString <span class="sy0">=</span> <span class="st0">&quot;Server=$($server);Database=master;Integrated Security=True&quot;</span><br />
<span class="re0">$SqlCmd</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlCommand</p>
<p><span class="co1"># сам запрос</span><br />
<span class="re0">$SqlCmd</span>.CommandText <span class="sy0">=</span> <span class="st0">&quot;SELECT database_name = sd.name, backup_finish_date, type<br />
FROM master.dbo.sysdatabases sd LEFT OUTER JOIN (<br />
SELECT bs.database_name, backup_finish_date, type = case type WHEN &#8216;D&#8217; THEN &#8216;Database&#8217;<br />
WHEN &#8216;I&#8217; THEN &#8216;Database Differential&#8217;<br />
WHEN &#8216;L&#8217; THEN &#8216;Log&#8217;<br />
WHEN &#8216;F&#8217; THEN &#8216;File or Filegroup&#8217;<br />
end, backup_size<br />
FROM msdb.dbo.backupset bs, (<br />
SELECT database_name,max_backup_finish_date = max(backup_finish_date)<br />
FROM msdb.dbo.backupset group by database_name) bs1<br />
WHERE bs.database_name = bs1.database_name<br />
AND bs.backup_finish_date = bs1.max_backup_finish_date ) bs3<br />
ON bs3.database_name = sd.name<br />
WHERE sd.name NOT IN (&#8216;tempdb&#8217;)<br />
AND (backup_finish_date &amp;lt; getdate() -7 or backup_finish_date IS NULL<br />
)<br />
ORDER BY sd.name ASC, backup_finish_date DESC&quot;</span></p>
<p><span class="re0">$SqlCmd</span>.Connection <span class="sy0">=</span> <span class="re0">$SqlConnection</span></p>
<p><span class="re0">$SqlAdapter</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlDataAdapter<br />
<span class="re0">$SqlAdapter</span>.SelectCommand <span class="sy0">=</span> <span class="re0">$SqlCmd</span></p>
<p><span class="re0">$DataSet</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.DataSet</p>
<p><span class="re0">$SqlAdapter</span>.Fill<span class="br0">&#40;</span><span class="re0">$DataSet</span><span class="br0">&#41;</span></p>
<p><span class="re0">$SqlConnection</span>.Close<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="re0">$DataSet</span>.Tables<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>В приведенном примере из файла <strong>servers.txt</strong> берется список серверов БД и к ним выполняется запрос на получения списка баз данных для которых не выполнялись бэкапы более семи дней.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2010/07/collect-backup-statistics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Парсинг журналов событий и сохранение результатов в БД</title>
		<link>http://blog.wadmin.ru/2010/04/parse-event-to-sql/</link>
		<comments>http://blog.wadmin.ru/2010/04/parse-event-to-sql/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 13:46:11 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[МикроЗаметки]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=1058</guid>
		<description><![CDATA[Очередная микро-заметка из разряда себе на память и авось кому пригодится. Продолжая разговор о парсинге событий хочется описать методику сохранения событий из системных журналов в таблицу на MS SQL сервере. Предположим что вам необходимо отслеживать [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wadmin.ru/wp-content/uploads/2010/02/poweshell_img.png"><img src="http://blog.wadmin.ru/wp-content/uploads/2010/02/poweshell_img.png" alt="Powershell Logo" title="poweshell_img" width="150" height="150" class="alignright size-full wp-image-790" /></a><br />
Очередная микро-заметка из разряда себе на память и авось кому пригодится.</p>
<p>Продолжая разговор о парсинге событий хочется описать методику сохранения событий из системных журналов в таблицу на MS SQL сервере.</p>
<p>Предположим что вам необходимо отслеживать события из журнала приложений и архивировать их в БД для последующего анализа. Изначально считаем что у вас есть предварительно настроенный SQL сервер и установлен powershell на сервере где запускается скрипт.</p>
<p>В приведенном ниже скрипте берутся события из журнала <strong>Application</strong> за последний час <strong>$1HourAgo = [DateTime]::Now.AddHours(-1)</strong> и из источника <strong>if ($source -like &laquo;MSExchangeIS*&raquo;)</strong>. Далее данные помещаются в таблицу <strong>ExchangeAuditLog</strong>.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="kw3">function</span> parseLog<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw3">param</span> <span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="br0">&#91;</span><span class="re3">string</span><span class="br0">&#93;</span> <span class="re0">$SQLSERVER</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <span class="br0">&#91;</span><span class="re3">string</span><span class="br0">&#93;</span> <span class="re0">$Database</span><br />
&nbsp; <span class="br0">&#41;</span><br />
&nbsp; <span class="re0">$SqlConnection</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlConnection<br />
&nbsp; <span class="re0">$SqlConnection</span>.ConnectionString <span class="sy0">=</span> <span class="st0">&quot;Server=$SQLSERVER;Database=$Database;Integrated Security=True&quot;</span><br />
&nbsp; <br />
&nbsp; <span class="re0">$SqlCmd</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlCommand<br />
&nbsp; <span class="re0">$SqlCmd</span>.Connection <span class="sy0">=</span> <span class="re0">$SqlConnection</span><br />
&nbsp; <span class="re0">$SqlAdapter</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.SqlClient.SqlDataAdapter</p>
<p>&nbsp; <span class="re0">$1HourAgo</span> <span class="sy0">=</span> <span class="br0">&#91;</span>DateTime<span class="br0">&#93;</span>::Now.AddHours<span class="br0">&#40;</span><span class="sy0">-</span>1<span class="br0">&#41;</span><br />
&nbsp; <span class="re0">$strings</span> <span class="sy0">=</span> <span class="kw1">Get-eventlog</span> application <span class="sy0">|</span> <span class="kw3">where</span> <span class="br0">&#123;</span><span class="re0">$1hourago</span> <span class="kw4">-le</span> <a href="about:blank"><span class="kw6">$_</span></a>.timewritten<span class="br0">&#125;</span><br />
&nbsp; <br />
&nbsp; <span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$string</span> <span class="kw3">in</span> <span class="re0">$strings</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$source</span> &nbsp; &nbsp; <span class="sy0">=</span> <span class="re0">$string</span>.source</p>
<p>&nbsp; &nbsp; <span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$source</span> <span class="kw4">-like</span> <span class="st0">&quot;MSExchangeIS*&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$source</span> &nbsp; &nbsp; <span class="sy0">=</span> <span class="re0">$string</span>.source<br />
&nbsp; &nbsp; &nbsp; <span class="re0">$midx</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re0">$string</span>.index<br />
&nbsp; &nbsp; &nbsp; <span class="re0">$type</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re0">$string</span>.<span class="kw2">type</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$eventid</span> &nbsp; &nbsp;<span class="sy0">=</span> <span class="re0">$string</span>.eventid<br />
&nbsp; &nbsp; &nbsp; <span class="re0">$time</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re0">$string</span>.timegenerated<br />
&nbsp; &nbsp; &nbsp; <span class="re0">$username</span> &nbsp; <span class="sy0">=</span> <span class="re0">$string</span>.username</p>
<p>&nbsp; &nbsp; &nbsp; <span class="re0">$messageout</span> <span class="sy0">=</span> <span class="re0">$string</span>.message<br />
&nbsp; &nbsp; &nbsp; <span class="re0">$message</span> <span class="sy0">=</span> <span class="re0">$messageout</span> <span class="kw4">-replace</span> <span class="st0">&quot;&#8217;&quot;</span><span class="sy0">,</span> <span class="st0">&quot; &quot;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$message</span> <span class="sy0">=</span> <span class="re0">$message</span> <span class="kw4">-replace</span> <span class="st0">&quot; &nbsp;&quot;</span><span class="sy0">,</span> <span class="st0">&quot;&quot;</span></p>
<p>&nbsp; &nbsp; &nbsp; <span class="re0">$SqlCmd</span>.CommandText <span class="sy0">=</span> <span class="st0">&quot;insert into ExchangeAuditLog (midx, time, type, source, eventid, message, username) values (&#8216;$midx&#8217;, &#8216;$time&#8217;, &#8216;$type&#8217;, &#8216;$source&#8217;, &#8216;$eventid&#8217;, &#8216;$message&#8217;, &#8216;$username&#8217;)&quot;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$SqlAdapter</span>.SelectCommand <span class="sy0">=</span> <span class="re0">$SqlCmd</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$DataSet</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> System.Data.DataSet<br />
&nbsp; &nbsp; &nbsp; <span class="re0">$SqlAdapter</span>.Fill<span class="br0">&#40;</span><span class="re0">$DataSet</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="re0">$SqlConnection</span>.Close<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#125;</span></p>
<p>parseLog <span class="st0">&quot;SQL-01&quot;</span> <span class="st0">&quot;auditDb&quot;</span></div>
</div>
<p>Вместо послесловия.<br />
Скрипт был написан под задачу мониторинга событий на Exchange 2003 и успешно выполнив ее был отключен.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2010/04/parse-event-to-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Powershell &#8211; Правка количества CAL на SQL 2000</title>
		<link>http://blog.wadmin.ru/2010/01/collect-cal-from-sql-2000/</link>
		<comments>http://blog.wadmin.ru/2010/01/collect-cal-from-sql-2000/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 14:35:09 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=623</guid>
		<description><![CDATA[Представляю вашему вниманию простой скрипт  который устанавливает необходимое количество CAL на MS SQL Server 2000. Для его работы необходимо сформировать файл со списком серверов. server01 server02 server03 В переменной $cal укажите необходимую цифру CAL которую [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-790" title="poweshell_img" src="http://blog.wadmin.ru/wp-content/uploads/2010/02/poweshell_img.png" alt="powershell logo" width="150" height="150" />Представляю вашему вниманию простой скрипт  который устанавливает необходимое количество  CAL на MS SQL Server 2000.</p>
<p>Для его работы необходимо сформировать файл со списком серверов.</p>
<div class="codesnip-container" >server01<br />
server02<br />
server03</div>
<p>В переменной <strong>$cal</strong> укажите необходимую цифру CAL которую вам требуется задать.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="re0">$servers</span> <span class="sy0">=</span> <span class="kw1">Get-Content</span> <span class="st0">&quot;servers.txt&quot;</span><br />
<span class="re0">$cal</span><span class="sy0">=</span>50</p>
<p><span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$server</span> <span class="kw3">in</span> <span class="re0">$servers</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw1">Write-Host</span> <span class="st0">&quot;Working with Server $server&quot;</span><br />
<span class="re0">$MachineName</span> <span class="sy0">=</span> <span class="re0">$server</span><br />
<span class="re0">$reg</span> <span class="sy0">=</span> <span class="br0">&#91;</span>Microsoft.Win32.RegistryKey<span class="br0">&#93;</span>::OpenRemoteBaseKey<span class="br0">&#40;</span><span class="st0">&#8216;LocalMachine&#8217;</span><span class="sy0">,</span> <span class="re0">$MachineName</span><span class="br0">&#41;</span><br />
<span class="re0">$regKey</span><span class="sy0">=</span> <span class="re0">$reg</span>.OpenSubKey<span class="br0">&#40;</span><span class="st0">&quot;SOFTWARE\\Microsoft\\Microsoft SQL Server\\80\\MSSQLLicenseInfo\\MSSQL8.00&quot;</span><span class="sy0">,</span> <span class="re0">$true</span> <span class="br0">&#41;</span><br />
<span class="re0">$val1</span> <span class="sy0">=</span> <span class="re0">$regkey</span>.GetValue<span class="br0">&#40;</span><span class="st0">&quot;ConcurrentLimit&quot;</span><span class="br0">&#41;</span><br />
<span class="kw1">Write-Host</span> <span class="st0">&quot;Current value = &quot;</span> <span class="re0">$val1</span><br />
<span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$val1</span> <span class="kw4">-ne</span> <span class="re0">$cal</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw1">Write-Host</span> <span class="st0">&quot;Set ConcurrentLimit to $cal&quot;</span><br />
<span class="re0">$regkey</span>.SetValue<span class="br0">&#40;</span><span class="st0">&quot;ConcurrentLimit&quot;</span><span class="sy0">,</span> <span class="re0">$cal</span><span class="br0">&#41;</span><br />
<span class="re0">$regKey</span>.flush<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="re0">$regKey</span>.Close<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#125;</span> <span class="kw3">else</span> <span class="br0">&#123;</span><br />
<span class="kw1">Write-Host</span> <span class="st0">&quot;ConcurrentLimit = &quot;</span> <span class="re0">$val1</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2010/01/collect-cal-from-sql-2000/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

