3

システム内の各ドメイン コントローラをループして一連の結果を返す文字列を使用して、Active Directory にクエリを実行しています。このスクリプトは export-csv でうまく機能しますが、カスタム情報フィールド (キャリッジ リターンを含む) のすべてのデータを保持したいので、これを SQL テーブルに直接エクスポートしたいと思います。

Powershell によって報告されたエラーは次のとおりです。

"0" 個の引数を指定して "ExecuteNonQuery" を呼び出し中に例外が発生しました: "挿入エラー: 列名または指定された値の数がテーブル定義と一致しません。"

これはかなり冗長な応答ですが、get-object の出力と正確に一致するように、各テーブルの列を作成して名前を付けました。

パイプからの出力は次のとおりです。

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()

今、私は何かを台無しにしていますが、それはおそらく明らかに明らかです。

4

2 に答える 2

0

ここでは 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

}
于 2013-02-05T09:05:57.283 に答える
0

次のテスト オブジェクトを想定します。

$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 connect を移動してループの外側に閉じ、try/finally ブロックに配置することで、DC エントリごとではなく 1 回だけ実行され、実行中に例外が発生した場合でも Close が呼び出されます。 try ブロックの。Powershell で try/catch/finally ブロックを使用する方法については、こちらを参照してください。

于 2012-07-25T15:54:08.513 に答える