2015-09-28 4 views
0

Мне нужно выяснить, кто зашел в конечную точку. У нас есть таблица истории SID, которую я использую в качестве таблицы преобразования. Это приведет к имени пользователя вместо SID. Соединение работает нормально, но оно только вставляет одно событие из журнала событий.foreach loop ot вставить несколько строк в базу данных

Я включил инструкцию insert в цикл foreach. Что мне не хватает?

Пример хоста, на котором выполняется эта операция, содержит более 15 событий, мне нужно вставить все 15 из этих событий в базу данных MySQL, чтобы я мог запросить, на каких машинах был зарегистрирован конкретный SID.

Ниже приведен простой и уродливый код. Соединение работает, но только вставляет одну строку за раз.

# MySQL Connection string # 
function Connect-MySQL([string]$user,[string]$pass, [string]$MySQLHost,[string]$database) { 
    # Load MySQL .NET Connector Objects 
    [void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data") 

    $connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database="+$database+";Pooling=FALSE" 
    $conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr) 
    $conn.Open() 
    return $conn 
} 

# Close Conn 
function Disconnect-MySQL($conn) { 
    $conn.Close() 
} 

# MySQL Connection Vars # 
$user = '' 
$pass = '' 
$database = '' 
$MySQLHost = '' 

$conn = Connect-MySQL $user $pass $MySQLHost $database 

function Execute-MySQLNonQuery($conn, [string]$query) { 
    $command = $conn.CreateCommand() 
    $command.CommandText = $query 
    $RowsInserted = $command.ExecuteNonQuery() 
    $command.Dispose() 

    if ($RowsInserted) { 
    return $RowInserted 
    } else { 
    return $false 
    } 
} 

$ErrorActionPreference = 'silentlycontinue' 

$events = Get-Eventlog -Log system -ComputerName '.' | Where-Object { 
    (($_.EventID -like "*7001*") -or 
    ($_.EventID -like "*7002*")) 
} | Select-Object replacementstrings, machinename, timegenerated ; 
foreach ($event in $events) { 
    $outObj = new-object psobject -Property @{ 
    user = $event.ReplacementStrings[1] 
    time = $event.timegenerated 
    machine = $event.machinename 
    } 

    $uservar = $outObj.user 
    $timevar = $outObj.time 
    $machinevar = $outObj.machine 

    $query = "INSERT INTO infosec.ewarp_testing (data1,data2,data3) VALUES ('$uservar', '$timevar','$machinevar')" 
    echo "$uservar $timevar $machinevar" 
    $Rows = Execute-MySQLNonQuery $conn $query 
} 
+0

Удалите строку '$ ErrorActionPreference = 'silentlycontinue'' и посмотрите, что-то сломается. Кроме того, убедитесь, что '$ events' фактически содержит более одного элемента. –

+0

ничего не ломают, когда я беру EA. $ События имеют более 15 результатов, когда я повторяю их вне или внутри цикла. Если я эхо $ uservar за пределами цикла, я получаю только один возврат к консольным событиям $, которые я получаю из них ....:/ – Charles

ответ

0

Я не уверен, как точка чистые работы, никогда не использовал его, но, глядя на свой код, вы перекручивание и фактически делает запрос для каждой записи. Может быть, это только фиксация последней записи или только одна из них, не уверен, так как я не знаю точки сети. Но одно, что вы можете сделать, - запустить один запрос, вставив все значения за один раз, вот решение, основанное на вашем коде.

$query = "INSERT INTO infosec.ewarp_testing (data1,data2,data3) VALUES ('$uservar', '$timevar','$machinevar')" 

изменения, которые выстраиваются в линию, где она конкатенации строку значений, которые хотели бы так:

$values = "" 
$values = $values + "('$uservar', '$timevar','$machinevar')," 

Это создаст строку «значений» положить запятую между каждым набором (...), который вам придется удалить последнюю с какой-то строковой функцией, которую я бы себе представил.

После того как петля будет завершена, вы бы идти вперед и принимать все значения и запустить один запрос за пределами цикла:

$query = "INSERT INTO infosec.ewarp_testing (data1,data2,data3) VALUES $values" 

Я надеюсь, что это помогает.

+0

это не сработало. Я упростил свой код следующим образом: – Charles

+0

Еогеасп ($ событий в $ событий) { $ 1 = $ event.replacementstrings [1] $ 2 = $ event.timegenerated $ 3 = $ event.machinename $ запроса = «INSERT INTO InfoSec. ewarp_testing (data1, data2, data3) VALUES ('$ 1', '$ 2', '$ 3') " $ Rows = Execute-MySQLNonQuery $ conn $ query } – Charles

+0

Вы все еще выполняете несколько запросов, я просто пытался покажите, как вставить несколько записей с одним запросом, меньше накладных расходов ... –

Смежные вопросы