Intereting Posts
Строки для значений, разделенных запятыми, с использованием тега XML Что такое будущее Linq to SQL Hibernate – отношение «один ко многим» – внешний ключ всегда «null» Группирование SQL по всем столбцам Как подсчитать разницу по дате, исключая выходные и праздничные дни в MySQL Дизайн-критик / предложения db SELECT UNION и ORDER BY в mysql .. как? Oracle SQL: дополнительное ограничение вызывает проблемы с производительностью Вставить двоичный файл в базу данных SQLite с помощью Python Как использовать обновление sqlite через ContentValues ​​при необходимости обновления зависит от текущего значения и способа получения результата? Несоответствие типа SqlGeography Еженедельные общие суммы Разница между отметками времени в миллисекундах в Oracle Расчет количества дней между двумя датами в DB2? Как вернуть 1 однострочную информацию из двух разных таблиц с динамическим содержимым в sql

Результаты Powershell Get-QADUser для таблицы SQL

Я запрашиваю Active Directory со строкой, которая проходит через каждый контроллер домена в нашей системе и возвращает набор результатов. Сценарий отлично работает с export-csv, но поскольку мы хотим сохранить все данные в пользовательском информационном поле (оно содержит возврат каретки), я хотел бы экспортировать его непосредственно в таблицу SQL.

Ошибка, о которой сообщает Powershell, гласит:

Вызов исключения «ExecuteNonQuery» с аргументом «0»: «Вставить ошибку: имя столбца или> количество заданных значений не соответствует определению таблицы».

Который является довольно подробным ответом, я создал и назвал столбцы каждой таблицы, чтобы точно соответствовать выходу get-объекта.

Вот вывод из трубы:

SamAccountName : testuser DisplayName : Test User (COMPANY) info : Test Entry 1234567890 Test for output. Entering Multiple lines. whenCreated : 09/11/2004 09:08:42 whenChanged : 19/07/2012 09:25:21 AccountExpires : pwdLastSet : 13/06/2012 07:43:43 LastLogonTimestamp : 18/07/2012 15:38:35 userAccountControl : 512 Name : Test User LastLogon : DC : DCNAME1 

И вот код:

 ##--AD data output to SQL script, you need the Quest plugin! $SamAccountName = Read-Host "Enter the username to query for last logon" ##--Query domain for all domain controllers and funnel into a forEach loop Get-QADComputer -ComputerRole DomainController | Foreach-Object{ $dc = $_.Name ##--Query each domain controller for the user object and retrieve the LastLogon timestamp $user = Get-QADUser -Service $dc -SamAccountName $SamAccountName -IncludedProperties info,pwdLastSet,AccountExpires,userAccountControl | Select-Object SamAccountName,displayName,info,whenCreated,whenChanged,accountExpires,pwdLastSet,lastLogonTimestamp,userAccountControl,name,LastLogon,@{n='DC';e={$dc}} | out-host ##--Open database connection $conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=SQLSERVER; Initial Catalog=ADomain; Integrated Security=SSPI") $conn.Open() ##--AAGH! How to grab the results of the Select-Object above? $cmd = $conn.CreateCommand() $cmd.CommandText ="INSERT extract VALUES ('$user')" $cmd.ExecuteNonQuery() ##--Don't forget to close it! $conn.Close() 

Теперь я возился с чем-то, что, вероятно, очевидно очевидно, любая помощь очень ценится.

Предположим, что следующий тестовый объект:

 $exampleObject = New-Object PSObject -Property @{SamAccountName="TestSAN";DisplayName="TestDN"} $user = $exampleObject | Select-Object SamAccountName, DisplayName ##--AAGH! How to grab the results of the Select-Object above? $commandText = "INSERT extract VALUES ('$($user.SamAccountName)','$($user.DisplayName)'" 

Я бы также переместил sql-соединение и приблизился к внешнему контуру цикла и поместил его в блок try / finally, поэтому он выполняется только один раз, а не для каждой записи DC, а Close все еще вызывается, когда есть исключение во время выполнения блока try. См. Здесь для справки об использовании блока try / catch / finally с Powershell.

здесь я использую SqlServerCmdletSnapin, и это Invoke-sqlcmd. Этот скрипт использует базу данных MSSQL EMPLOYEE и таблицу EMPLOYEE_DOMAIN. Надеюсь, поможет. Прекрасно работает для меня ..

 Add-PSSnapin Quest.ActiveRoles.ADManagement Add-PSSnapin SqlServerCmdletSnapin100 Add-PSSnapin SqlServerProviderSnapin100 $db_server = "10.3.18.55" $db = "EMPLOYEE" $table = "EMPLOYEE_DOMAIN" $username = "import" $pwd = "Okinawa84561" # First, clear existing table $sql_query_del = "DELETE FROM $table" Invoke-Sqlcmd -ServerInstance $db_server -Database $db -Username $username -Password $pwd -Query $sql_query_del # Get users with employeeID only and write their accountname and employeeID to DB Get-QADUser -IncludeAllProperties | ? {$_.employeeID} | select sAMAccountName, employeeID | foreach { $an = $_.sAMAccountName $eid = $_.employeeID Write-Host " sAMAccountName : $an employeeID : $eid" $sql_query = "INSERT INTO $table (employeeID, domainName) VALUES ('$eid', '$an')" Invoke-Sqlcmd -ServerInstance $db_server -Database $db -Username $username -Password $pwd -Query $sql_query }