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 数据库。我对这些事情的代码有点不同,但看看方法和文档,你所做的应该有效。
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 数据库。我对这些事情的代码有点不同,但看看方法和文档,你所做的应该有效。