我使用以下函数连接到PostgreSQL数据库:
function Get-ODBC-Data{
param([string]$query=$(throw 'query is mandatory.'))
$conn = New-Object System.Data.Odbc.OdbcConnection
$conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=192.168.0.120;Port=7050;Database=datbase;Uid=user;Pwd=pass;"
$conn.open()
$comm = New-object System.Data.Odbc.OdbcCommand($query,$conn)
$dase = New-Object system.Data.DataSet
(New-Object system.Data.odbc.odbcDataAdapter($comm)).fill($dase) | out-null
$conn.close()
$dase.Tables[0]
}
以下查询返回所有用户ID和用户代码。用户ID恰好与Active Directory sAMAccountName属性匹配。
$query = "SELECT userid,code FROM pval_users"
$users = Get-ODBC-Data -query $query
$ users的示例内容:
userid code
------- ------
jdoe 34576
bmil 98765
我喜欢将某些AD属性嵌入到未存储在数据库中的$ users中,使输出看起来像:
userid First Last code
------- ------ ----- -----
jdoe John Doe 34576
bmil Bill Miller 98765
实现这一目标的“最佳”解决方案是什么?我有一个使用Get-ADuser -id $_.userid | select givenName, sn
的想法但我无法按照我需要的顺序获得输出。
提前致谢!
答案 0 :(得分:1)
你可以这样做:
$Query = "SELECT userid,code FROM pval_users"
$Users = Get-ODBC-Data -query $Query
$Users | ForEach-Object {
$ADUser = Get-ADuser -id $_.userid | select givenName, surname
If ($ADUser) {
$_ | Add-Member -Name 'First' -Value $ADUser.givenName -MemberType NoteProperty
$_ | Add-Member -Name 'Last' -Value $ADUser.surname -MemberType NoteProperty
}Else{
Write-Warning "$($_.userid) not found in AD"
}
$_
}
说明:
Get-ADUser
建议您恢复给定名称和姓氏属性Add-Member
将这些属性添加到当前用户项此外,如果您想要更有活力,并且不介意最终对象中的属性名称与AD中的属性名称相同,您可以这样做:
$Users | ForEach-Object {
$ADUser = Get-ADuser -id $_.userid | select givenName, surname
If ($ADUser) {
ForEach ($Prop in $ADUser.PSObject.Properties) {
$_ | Add-Member -Name $Prop.Name -Value $Prop.Value -MemberType $Prop.MemberType
}
}Else{
Write-Warning "$($_.userid) not found in AD"
}
$_
}
这使用ForEach循环来遍历Get-ADUser
返回的所有属性,并将它们添加到$Users
集合中的当前用户。