Powershell 将 AD 缩略图导出到数据库

Powershell to export AD thumbnails to database

Poweshell 的新手。尝试将 AD 缩略图导出到数据库 table。我可以将缩略图存储为 varbinary 或 base64 字符串。我遇到的问题是我的脚本只是挂起。我找不到任何导出到数据库的干净示例。非常感谢任何有助于理解为什么挂起的帮助。

$conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=DBSERVER; Initial 
      Catalog=DBName; Integrated Security=SSPI");
$conn.open();
$users = Get-ADUser -Filter {enabled -eq $true -and passwordneverexpires -eq $false -and  
     sAMAccountName -eq "MyUserName"} -SearchBase 
     "OU=MIS_Staff,OU=People,OU=MyCompany,DC=mydomain,DC=com" -Properties * |
     Where-Object { $_.thumbnailphoto -ne $Null } |
    select name,samaccountname,EmployeeNumber,ThumbNailPhoto;
   foreach ($item in $users) {
    $cmd = $conn.createcommand();
    $cmd.commandtext = "INSERT AdPhotos (Username, EmployeeNumber, Image)
       VALUES ('$($item.samaccountname)', '$($item.employeeNumber)', '$($item.thumbnailPhoto)')";
    $cmd.executenonquery(); 
   $conn.close();

我没有可以将其写入的数据库,但有几点我可以不经测试就做出来。我注意到的第一件事是您在每次循环迭代时关闭 SQL 连接。看起来无法通过第一个插入。

我做了一些其他调整,主要是为了可以玩:

$conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=DBSERVER; Initial 
      Catalog=DBName; Integrated Security=SSPI")
$conn.open()

# Should you escape the Bools?
$ADFilter   = "Enabled -eq $true -and passwordneverexpires -eq $false -and sAMAccountName -eq 'MyUserName'"
$SearchBase = "OU=MIS_Staff,OU=People,OU=MyCompany,DC=mydomain,DC=com"
$ADProps    = 'EmployeeNumber', 'ThumbNailPhoto'

$Users = 
Get-ADUser -Filter $ADFilter -SearchBase $SearchBase -Properties $ADProps |
Where-Object { $_.ThumbNailPhoto } |
Select-Object Name,samAccountName,EmployeeNumber,ThumbNailPhoto

ForEach ( $User in $Users ) 
{
    $cmd = $conn.createcommand()
    $cmd.commandtext = "INSERT AdPhotos (Username, EmployeeNumber, Image)
       VALUES ('$($User.samaccountname)', '$($User.employeeNumber)', '$($User.thumbnailPhoto)')"
    $cmd.executenonquery()
}

# Close the connection after the loop:
$conn.close

作为一般做法,您应该只检索您需要的属性。我还将 $Item 替换为 $User,这更像是一种标准模式。我也不认为你需要 Select-Object 没有它代码应该可以正常工作,尽管我确实把它留在了例子中。

不确定这是否是一个问题,但 ThumbNail 属性 将 return 一个 $cmd.commandText = "..." 中的字节数组 ([byte[]]) 应该转换为以空格分隔的字符串。但是,您可能需要检查图像列的 SQL 数据类型以确保它可以获取数据...

顺便说一句,有几种方法可以使用 .Net 类 来处理 SQL 数据库。我对这些事情的代码有点不同,但看看方法和文档,你所做的应该有效。