将AD属性添加到SQL查询输出

时间:2017-07-11 06:45:20

标签: postgresql powershell active-directory

我使用以下函数连接到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的想法但我无法按照我需要的顺序获得输出。

提前致谢!

1 个答案:

答案 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建议您恢复给定名称和姓氏属性
  • 如果在AD中找到用户,则使用Add-Member将这些属性添加到当前用户项
  • 如果在AD中找不到用户,则输出警告
  • 输出用户

此外,如果您想要更有活力,并且不介意最终对象中的属性名称与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集合中的当前用户。