Одной из интересных функций PowerShell является возможность подключения к базам данных на удаленных серверах, в том числе MySQL. Таким образом, прямо из консоли PowerShell можно обращаться к таблицам MySQL для доступа к данным. В этой статье мы рассмотрим примеры подключения к MySQL из Powershell скрипта и команды для чтения и записи данных в таблицах БД. Для подключения к серверу MySQLнам понадобится специальный коннектор MySQL .NET Connector , который можно скачать непосредственно на официальном сайте MySQL.
На момент написания статьи последняя версия коннектора — Connector/Net 6.9.8
Скачайте файл mysql-connector-net-6.9.8.msi и установите MySQL .NET Connector в минимальной конфигурации.
На сервере MySQL предварительно создадим базу данных, с которой будем работать. Все операции на сервере СУБД мы выполняем из командой строки MySQL CLI (рассматривали ранее), но можно воспользоваться графической phpmyadmin или любой другой утилитой.
Создадим базу данных aduser:
mysql> CREATE DATABASE aduser;
На сервере MySQL создадим отдельного пользователя с правом удаленного подключения к БД aduser. Предоставим данному пользователю право удаленного подключения к БД с IP адреса 10.10.1.95
mysql>GRANT ALL PRIVILEGES ON aduser.* TO posh@'10.10.1.95' IDENTIFIED BY '[email protected]' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
mysql> USE aduser;
И создадим простейшую таблицу из 3 полей: идентификатор, имя пользователя в AD и его email-адрес.
mysql> CREATE TABLE users (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), email VARCHAR(100), PRIMARY KEY (ID));
Вернемся на сервер, с которого будем подключаться к MySQL базе. Допустим, мы хотим, чтобы в таблице содержались все имена и email адреса пользователей AD. Эту информацию можно получить с помощью командлета Get-ADUser.
Следующий Powershell скрипт осуществляет подключение к БД, и записывает в нее список пользователей и email, полученный из AD.
Set-ExecutionPolicy RemoteSigned
#подключаем библиотеку MySql.Data.dll
Add-Type –Path ‘C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
# строка подключения к БД, server - имя севрера, uid - имя mysql пользователя, pwd- пароль, database - имя БД на сервере
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.10.1.13;uid=posh;[email protected];database=aduser'}
$Connection.Open()
$sql = New-Object MySql.Data.MySqlClient.MySqlCommand
$sql.Connection = $Connection
#формируем список пользователей с именами и email адресами
Import-Module activedirectory
$UserList=Get-ADUser -SearchBase ‘OU=Users,OU=London,DC=contoso,DC=ru’ -filter * -properties name, EmailAddress
ForEach($user in $UserList)
{
$uname=$user.Name;
$uemail=$user.EmailAddress;
#записываем информацию о каждом пользователе в табдицу БД
$sql.CommandText = "INSERT INTO users (Name,Email) VALUES ('$uname','$uemail')"
$sql.ExecuteNonQuery()
}
$Reader.Close()
$Connection.Close()
Следующий скрипт используется для чтения ранее записанных в таблицу БД данных и отображения их в консоли PowerShell. Мы вывели из базы значения полей с именами пользователей и их почтовыми адресами:
Set-ExecutionPolicy RemoteSigned
Add-Type –Path ‘C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.10.1.13;uid=posh;[email protected];database=aduser'}
$Connection.Open()
$MYSQLCommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$MYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter
$MYSQLDataSet = New-Object System.Data.DataSet
$MYSQLCommand.Connection=$Connection
$MYSQLCommand.CommandText='SELECT * from users'
$MYSQLDataAdapter.SelectCommand=$MYSQLCommand
$NumberOfDataSets=$MYSQLDataAdapter.Fill($MYSQLDataSet, "data")
foreach($DataSet in $MYSQLDataSet.tables[0])
{
write-host "User:" $DataSet.name "Email:" $DataSet.email
}
$Connection.Close()
В следующих статьях мы рассмотрим пример использования MySQL базы для сбора и хранения информации из журналов событий Windows:
Доброго дня!
Из исходных данных:
MySQL Connector Net 8.0.15
Win 10 1809
Версия сервера MySQL: 5.7.23-0ubuntu0.16.04.1 — (Ubuntu)
$PSVersionTable.PSVersion: Major 5, Build 17763, Revision 134
При выполнении $Connection.Open() выдается ошибка:
Исключение при вызове «Open» с «0» аргументами: «Unable to connect to any of the specified MySQL hosts.»
Подозреваю, что проблемы с разрешением подключений из вне, но не совсем понимаю куда конкретно копать. Создал отдельного пользователя для базы, сначала пробовал под root, но это не помогло. MySQL и клиентский компьютер в одной локальной сети.
В какую сторону смотреть, подскажите, плиз!
Добрый день.
По умолчанию mysql принимает только локальные подключения (с того же хоста). Чтобы разрешить удаленный коннект к базе db для пользователя web с IP адреса 10.0.0.22, выполните в консоли mysql следующие команды:
mysql> update db set Host=’10.0.0.22′ where Db=’db’;
mysql> update user set Host=’10.0.0.22′ where user=’web’;
Ну и возможно включен файервол на стороне сервера или клиента. Нужно разрешить удаленное подключение на порт 3306 (по умолчанию)
Win 10 Pro 1809
MySQL Connector/NET 8.0.17
Исключение при вызове «Open» с «0» аргументами: «Не удалось загрузить файл или сборку «Renci.SshNet, Version=2
016.1.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106″ либо одну из их зависимостей. Не удается найти указанный файл.»
Есть такая проблема с MySLQ Connector/NET v8.0.17. Попробуйте скачать предыдущую версию — v8.0.16. В ней все работает (на сайте включите фильтр «Other Releases»).
решение — загрузить сборку renci
Add-Type -Path «C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.17\Assemblies\v4.5.2\MySQL.Data.dll»
Add-Type -Path ‘C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.17\Assemblies\v4.5.2\Renci.SshNet.dll’
такая же проблема. как решить?
Если кто-то столкнулся с проблемой
«Исключение при вызове «Open» с «0» аргументами: «Unable to connect to any of the specified MySQL hosts.»»
То советую попробовать прописать коннект иначе:
Server=myServerAddress; Port=1234; Database=myDataBase; Uid=myUsername; Pwd=myPassword;
Честно
стыреноподсмотрено здесь: