我在数据库中有一个用户表,我正尝试使用Createdon date更新该表,并使用Active Directory中的数据禁用on date。到目前为止,我得到的是:
$SearchRoot = "OU=NonAIQ,OU=FrontOffice,DC=dev,DC=local"
$serverName = "localhost"
#$SearchRoot = "OU=NonAIQ,OU=FrontOffice,DC=dmz,DC=local"
#$serverName = "spoproddb3.dmz.local"
try {
Import-Module "sqlps" -DisableNameChecking
if ((Get-PSSnapin -Name "Quest.ActiveRoles.ADManagement" -ErrorAction SilentlyContinue) -eq $null ) {
Add-PsSnapin "Quest.ActiveRoles.ADManagement"
}
$externalUsers = Get-QADUser -SizeLimit 0 -SearchRoot $SearchRoot | Select-Object whencreated, whenchanged
$externalUsers | % {
$query = @"
Update tbl_EdgeUsers Set CompanyName = '$_.CreationDate'
Where UserUPN = $_.UserPrincipalName;
"@
Write-Host "The query is $query"
Invoke-SqlCmd -ServerInstance $serverName -Query $query -Database "EdgeDW"
}
} finally {
Remove-Module "sqlps" -ErrorAction SilentlyContinue
Remove-PsSnapin "Quest.ActiveRoles.ADManagement"
}
现在,在创建时,我们只获取所有的值。
但由于AD不会跟踪禁用日期,我使用的是更改日期,因为一旦帐户更改,我们就不会对其进行更改。
我被卡住的部分是关于何时更改日期的逻辑。为此,我必须检查帐户是否被禁用。如果是,则使用该日期更新表。如果帐户未禁用,则忽略该值并将sql表中的值设置为'1/1/9999‘。
你们能帮我解释一下这个逻辑吗?
提前感谢您的帮助。
发布于 2016-10-12 13:40:11
我的头顶可能是这样的东西,尽管现在想想,如果数据集很大,在foreach循环中使用invoke-sql是一种令人讨厌的方式,可能更好的方法是将if语句的结果输出到csv或其他地方,然后对其运行invoke-sql。
$users = Get-ADUser -Filter * -Properties whenchanged | Select-Object -Property UserPrincipalName, whenchanged, enabled
$disabledsql = @"
update tbl_EdgeUsers Set date = '$user.whenchanged'
Where UserUPN = '$user.UserPrincipalName';
"@
$activesql = @"
update tbl_EdgeUsers Set date = '1/1/9999
Where UserUPN = '$user.UserPrincipalName';
"@
foreach ($user in $users)
{
if ($user.enabled -eq 'False')
{
Invoke-Sqlcmd -ServerInstance $serverName -Query $disabledsql -Database 'EdgeDW'
}
else
{
Invoke-Sqlcmd -ServerInstance $serverName -Query $activesql -Database 'EdgeDW'
}
}
https://stackoverflow.com/questions/39902354
复制