我需要弄清楚谁已登录到端点。我们有一个SID历史表,我将其用作转换表。这将导致用户名而不是SID。连接正常,但它只从事件日志中插入一个事件。
我将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 :(得分:0)
我不确定dot net是如何工作的,从不使用它,但是看看你的代码,你正在循环并实际对每条记录进行查询。也许它只是提交最后一条记录或只是其中一条记录,不确定因为我不知道dot net。但是你可以做的一件事是运行一次插入所有值的查询,这是一个基于你的代码的解决方案。
$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"
我希望这会有所帮助。