Задавайте вопросы, мы ответим
Вы не зашли.
Задача:
Экспортировать данные из LDAP каталога в MySQL базу данных посредством powershell.
Входные данные:
1. Скрипт для подключения к базе данных Mysql через который можно отослать любую команду. Вот как он выглядит:
[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
# Open Connection
$connStr = "server=127.0.0.1;port=3306;uid=root;pwd=password;database=test;Pooling=False"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
# Create a MySqlCommand and MySqlDataAdapter object
$cmd = New-Object MySql.Data.MySqlClient.MySqlCommand("SHOW TABLES", $conn)
$da = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($cmd)
Дальше можно делать всё, что угодно, например показать результат:
# Populate a dataset and output the query result
$ds = New-Object System.Data.DataSet
$da.Fill($ds) > $null
$result = $ds.Tables[0]
$result | Format-Table *
2. Данные, полученные из Active Directory в некую переменную, $ad_users. Это таблица, содержащая все данные по всем пользователям из active directory. Вот одна строка этой таблицы экспортированная в формат CSV (чтобы Вы имели представление о полях). Первыми идут поля. Потом одна строка с данными.
"objectsid","objectclass","objectguid","sn","adspath","whencreated","whenchanged","givenname","l","facsimileTelephoneNumber","mail","mobile","physicalDeliveryOfficeName","telephoneNumber","st","wWWHomePage","City","Company","Department","Email","Fax","FirstName","HomePhone","Initials","LastName","LogonName","Manager","MobilePhone","Office","Pager","PhoneNumber","PostalCode","PostOfficeBox","PrimaryGroupId","StateOrProvince","StreetAddress","Title","WebPage","HomeDirectory","HomeDrive","ProfilePath","LogonScript","UserPrincipalName","TsProfilePath","TsHomeDirectory","TsHomeDrive","TsAllowLogon","TsRemoteControl","TsMaxDisconnectionTime","TsMaxConnectionTime","TsMaxIdleTime","TsReconnectionAction","TsBrokenConnectionAction","TsConnectClientDrives","TsConnectPrinterDrives","TsDefaultToMainPrinter","TsWorkDirectory","TsInitialProgram","AccountExpires","PasswordLastSet","PasswordAge","PasswordExpires","LastLogonTimestamp","LastLogon","LastLogoff","AccountIsDisabled","AccountIsLockedOut","PasswordNeverExpires","UserMustChangePassword","AccountIsExpired","PasswordIsExpired","AccountExpirationStatus","PasswordStatus","NTAccountName","SamAccountName","Security","Domain","LastKnownParent","MemberOf","NestedMemberOf","Notes","AllMemberOf","Path","DN","CanonicalName","CreationDate","ModificationDate","ParentContainer","ParentContainerDN","Name","ClassName","Type","Guid","Sid","Description","DisplayName","Cache","Connection","DirectoryEntry"
"01050000000000051500000079E3FC53EB25792C16C0EA3266080000","System.Object[]","19ECE7E03A8DB4429116A1B117C91C1A","Галеев","LDAP://rarus.alyans.local/CN=Галеев Рустам,OU=Уволенные,OU=office,DC=alyans,DC=local","05.01.2006 13:39:20","19.01.2009 16:00:57","Рустам",,,,,,,,,,,,,,"Рустам",,,"Галеев","grh",,,,,,,,"513",,,,,,,,"admin.bat","grh@alyans.local",,,,"True","EnableInputNotify","00:00:00","00:00:00","00:00:00","AnyComputer","Disconnect","True","True","True",,,,"06.11.2007 11:55:45","687.03:48:22.1020299",,"29.10.2007 9:00:24","29.10.2007 11:41:50",,"True","False","True","False","False","False","Never","Password never expires","OFFICE\grh","grh","Quest.ActiveRoles.ArsPowerShellSnapIn.UI.SecurityDescriptor","OFFICE\",,"System.String[]","System.String[]",,"System.String[]","LDAP://rarus.alyans.local/CN=Галеев Рустам,OU=Уволенные,OU=office,DC=alyans,DC=local","CN=Галеев Рустам,OU=Уволенные,OU=office,DC=alyans,DC=local","alyans.local/office/Уволенные/Галеев Рустам","05.01.2006 13:39:20","19.01.2009 16:00:57","alyans.local/office/Уволенные","OU=Уволенные,OU=office,DC=alyans,DC=local","Галеев Рустам","user","user","e0e7ec19-8d3a-42b4-9116-a1b117c91c1a","S-1-5-21-1409082233-746137067-854245398-2150",,"Галеев Рустам","Quest.ActiveRoles.ArsPowerShellSnapIn.BusinessLogic.ObjectCache","Quest.ActiveRoles.ArsPowerShellSnapIn.Data.ArsADConnection","System.DirectoryServices.DirectoryEntry"
И наконец - задачка: Экспорт из этой переменной в MySQL ВСЕХ ДАННЫХ. Вот тут моя фантазия из за отсутствий знаний по MySQL даёт сбой. Прошу пнуть в правильном направлении.
Отредактированно BlackFalcon (24.09.2009 09:48:27)
Неактивен
LOAD DATA INFILE Вас спасет — просто натравите его на файлик с CSV
Неактивен
paulus написал:
LOAD DATA INFILE Вас спасет — просто натравите его на файлик с CSV
В принципе - эта идея меня уже посещала. Экcпортнуть в CSV, затем импортировать в MySQL по pipe... В принципе - решение. Попробую.
Хотелось бы еще что-нибудь умное попробовать :-)
Неактивен
Если задача в «потренироваться написать что-нибудь», то разбейте сначала по строкам,
потом по запятым, сформируйте соответствующие запросы, и выполните их в базе
Неактивен
paulus написал:
LOAD DATA INFILE Вас спасет — просто натравите его на файлик с CSV
Окей, натравил.
Всё нормально. Почти. Вот запрос:
LOAD DATA LOCAL INFILE 'ADUsers.csv'
INTO TABLE ad_users
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
IGNORE 2 LINES;
Всё отлично, до того момента, как в записях попадаеться знак '\', который, похоже, интерпретируется как некая последовательность. Результат поражает:
Запись OFFICE\bochkov в таблице выглядит как OFFICEochkov (а посерёдке какой-то неотображаемый знак...)
Ну и в конце строки сбой импорта, там запись типа "Quest.ActiveRoles.ArsPowerShellSnapIn.UI.SecurityDescriptor","OFFICE\",,"System.String[]", где кавычка идущая за '\' не воспринимается, и соответсвенно поле заканчивается не там, где нужно.
Подскажите, как побороть это досадное недоразумение...
Отредактированно BlackFalcon (25.09.2009 09:45:41)
Неактивен
Если там точно не может встретиться кавычка, то можно поменять символ
ESCAPED BY — по умолчанию это обратный слеш, что и приводит к такому
результату.
Альтернативно, можете сначала пройтись по этому файлику и заменить там,
где нужно, символы \ на \\ — тогда MySQL будет интерпретировать их как
один правильный символ.
Неактивен
Yes! Всё работает.
Спасибо Вам большое за дельный и грамотный совет.
Тему можно закрывать
Неактивен