Поиск на сайте: Расширенный поиск


Новые программы oszone.net Читать ленту новостей RSS
CheckBootSpeed - это диагностический пакет на основе скриптов PowerShell, создающий отчет о скорости загрузки Windows 7 ...
Вы когда-нибудь хотели создать установочный диск Windows, который бы автоматически установил систему, не задавая вопросо...
Если после установки Windows XP у вас перестала загружаться Windows Vista или Windows 7, вам необходимо восстановить заг...
Программа подготовки документов и ведения учетных и отчетных данных по командировкам. Используются формы, утвержденные п...
Red Button – это мощная утилита для оптимизации и очистки всех актуальных клиентских версий операционной системы Windows...
OSzone.net Microsoft PowerShell Работа с базами данных средствами PowerShell RSS

Работа с базами данных средствами PowerShell

Текущий рейтинг: 3.4 (проголосовало 5)
 Посетителей: 5929 | Просмотров: 7726 (сегодня 0)  Шрифт: - +

Базы данных являются самым популярным способом хранения данных. Так почему бы не задействовать базы данных в такой СУБД, как SQL Server для хранения некоторой административной информации, которая могла бы облегчить вам жизнь? Можно было бы хранить имена серверов, версии Windows, номера пакетов исправлений, имя последнего вошедшего в систему администратора и т. п.

Это довольно легко сделать средствами Windows PowerShell, потому что эту технологию можно использовать для доступа, используя функциональность доступа к базам данных из Microsoft .NET Framework. Поэтому это будет меньше всего напоминать Windows PowerShell и больше всего — программу на C#. Однако требуемый код довольно легко превратить в шаблон. Вы можете просто взять то, что я покажу в этой статье, и, внеся минимальные исправления, применить практически к любой ситуации.

Сценарии для SQL

Допустим, у вас есть база данных SQL Server 2008 по имени SYSINFO. В базе есть таблица SERVERS. В таблице пять столбцов: ServerName (то есть имя сервера), UserName (имя пользователя), LastLogon (последний вход в систему), Reason (причина) и SPVersion (версия пакета исправлений). Это могут быть простые текстовые столбцы типа varchar.

Единственное исключение — LastLogon, в котором хранятся данные типа datetime. Надо настроить SQL Server так, чтобы в качестве значения этого столбца по умолчанию использовалась функция NOW. Таким образом, при добавлении новой строки она будет содержать текущую дату и время, и их не придется указывать вручную. Столбцу Reason надо назначить тип varchar(MAX), чтобы в нем можно было при необходимости разместить много текста.

Создайте сценарий входа в объекте групповой политики (GPO), который привяжите к подразделению (OU), в котором располагаются ваши серверы. Сценарий будет исполняться при каждом входе в систему сервера. Задействуйте сценарий Windows PowerShell, который можно создать на компьютере, где установлен пакет Windows PowerShell 2.0. Чтобы при редактировании была доступна возможность определения в качестве сценария входа сценария на Windows PowerShell, нужно использовать шаблон GPO из Windows Server 2008 R2 (либо пакета Windows 7 Remote Server Administration Toolkit (RSAT)).

Вот сценарий, который нам нужен. Обратите внимание, что я указываю, где нужно нажимать Enter. Чтобы все работало правильно, нажимайте Enter только в тех местах, где есть символ возврата каретки (в HTML этот символ обозначается как ↵):

$reason = Read-Host 'Reason are you logging on'↵
$reason.replace("'","''")↵

Эти две строки предлагают пользователю сообщить причину входа в систему сервера — это важная информация, которую надо отслеживать. Функция Replace заменяет одиночные одинарные кавычки на двойные, обеспечивая, что инструкция SQL, которую мы позже создадим, будет работать без ошибок. Это не предназначено для защиты от изощренных атак с использованием внедрения SQL-кода. В конце концов, мы ведь говорим об администраторах, которым доверяем, не так ли?

Эта строка извлекает информацию об операционной системе:

$os = Get-WmiInfo Win32_OperatingSystem↵

Здесь важны имя сервера и версия текущего установленного пакета исправлений. Может также понадобиться свойство BuildNumber, которое сообщает имеющуюся версию Windows.

Эта строка загружает ту часть .NET Framework, которая отвечает за работу с базами данных:

[assembly.reflection]::loadwithpartialname('System.Data')↵

Эти строки создают новое подключение к базе данных:

$conn = New-Object System.Data.SqlClient.SqlConnection↵
$conn.ConnectionString = "Data Source=SQLSERVER;Initial Catalog=SYSINFO;Integrated Security=SSPI;"↵

Если вы используете SQL Server 2008, строка подключения может немного отличаться (на сайте ConnectionStrings.com вы можете найти нужный вариант среди множества примеров подключения к самым разным базам данных):

$conn.open()↵

Теперь подключение открыто и готово к использованию.

Следующие две строки создают команду SQL, которую я отправлю в качестве запроса на SQL Server. Я присвоил соответствующему свойству подключения значение «open», чтобы среда Windows PowerShell могла послать команду:

$cmd = New-Object System.Data.SqlClient.SqlCommand↵
$cmd.connection = $conn↵

Дальше выполняется сложная часть работы. Создается SQL-запрос с INSERT для вставки новой строки в таблицу базы данных. Заметьте, что я использую оператор форматирования –f, чтобы вставить в запрос четыре куска текста. Текст вставляется в знаки подстановки, заключенные в фигурные скобки в том же порядке, в котором они следуют в разделенном запятыми списке, следующем за оператором:

$cmd.commandtext = "INSERT INTO servers (servername,username,spversion,reason) VALUES('{0}','{1}','{2}','{3}')" -f
$os.__SERVER,$env.username,$os.servicepackmajorversion,$reason↵

Теперь можно выполнить запрос и закрыть подключение к базе данных:

$cmd.executenonquery()↵
$conn.close()↵

Не забудьте закрыть это подключение, чтобы не нарываться на визит недовольного администратора базы данных. Как можно увидеть на сайте ConnectionStrings.com, можно получить доступ к большому числу баз данных.

При использовании базы данных, отличной от SQL Server, надо заменить «SqlClient» в именах объектов на «OleDb». Также не рекомендуется использовать основанные на файлах базы данных, такие как Access. В этом случае понадобится драйвер, который можно получить, установив Access на всех серверах, а это исключительно неудачная идея. Кроме того, производительность этих баз данных оставляет желать лучшего и не отвечает нашим задачам.

Если у вас нет экземпляра SQL Server для размещения базы данных, установите где-нибудь редакцию Express. Для обслуживания небольшой нагрузки нашего сценария ее будет достаточно.

Конечно, вы можете усовершенствовать сценарий так, что он будет выполнять много работы. Вы можете добавить в базу данных дополнительные столбцы и заставить сценарий собирать дополнительную информацию. Тогда вам придется освоить язык SQL. Не нужно становиться гуру — достаточно будет способности писать базовые запросы

Если вам нужно введение в язык SQL (на базовом уровне он практически одинаков во всех основных СУБД), посмотрите мои видеоролики, с полным курсом стандартного SQL. В этом курсе также рассказывается об основных различиях между такими платформами, как SQL Server, Oracle, MySQL и другими.

Вот весь текст сценария:

$reason = Read-Host 'Reason are you logging on'↵
$reason.replace("'","''")↵
$os = Get-WmiInfo Win32_OperatingSystem↵
[assembly.reflection]::loadwithpartialname('System.Data')↵
$conn = New-Object System.Data.SqlClient.SqlConnection↵
$conn.ConnectionString = "Data Source=SQLSERVER;Initial Catalog=SYSINFO;Integrated Security=SSPI;"↵
$conn.open()↵
$cmd = New-Object System.Data.SqlClient.SqlCommand↵
$cmd.connection = $conn↵
$cmd.commandtext = "INSERT INTO servers (servername,username,spversion,reason) VALUES('{0}','{1}','{2}','{3}')" -f $os.__SERVER,$env.username,$os.servicepackmajorversion,$reason↵
$cmd.executenonquery()↵
$conn.close()↵
Автор: Дон Джонс  •  Иcточник: TechNet Magazine  •  Опубликована: 21.11.2011
Нашли ошибку в тексте? Сообщите о ней автору: выделите мышкой и нажмите CTRL + ENTER
Теги:   Powershell.


Оценить статью:
Вверх
Комментарии посетителей
Комментарии отключены. С вопросами по статьям обращайтесь в форум.