如何使用Powershell重新搜索用户';第一个启用的管理器的报告结构
在工作中处理带有PS代码的用户终止的人力资源项目。目前的挑战是: 1.如果启用/禁用,则测试用户帐户。 2.如果禁用,则测试其经理的SAMAccount(如果启用/禁用)。 3.重复此操作,直到找到已启用的帐户 4.返回该帐户的SAMAccount 迄今为止的工作守则:如何使用Powershell重新搜索用户';第一个启用的管理器的报告结构,powershell,active-directory,Powershell,Active Directory,在工作中处理带有PS代码的用户终止的人力资源项目。目前的挑战是: 1.如果启用/禁用,则测试用户帐户。 2.如果禁用,则测试其经理的SAMAccount(如果启用/禁用)。 3.重复此操作,直到找到已启用的帐户 4.返回该帐户的SAMAccount 迄今为止的工作守则: $testuser = "johndoe" If ($(get-aduser $testuser).enabled -eq $true{ $usermgr1 = get-aduser $testuser -properties
$testuser = "johndoe"
If ($(get-aduser $testuser).enabled -eq $true{
$usermgr1 = get-aduser $testuser -properties * | select @{Name='Manager';Expression={(Get-ADUser $_.Manager).SAMAccountName}}
}
上面的输出格式如下所示。我当然也不想要头球
Manager
------
JaneDoe
然后,我尝试将其扩展到第一个测试,查看经理的帐户是否已启用:
If ($get-aduser $usermgr1).enabled -eq $true) | select @{Name='Manager';Expression={(Get-ADUser $_.Manager).SAMAccountName}}
Else Write-Host "Manager Account Disabled"
}
if ($user.enabled -eq $false){
$usermgr1 = get-aduser $user.manager
if ($usermgr1.enabled -eq $true){
$mgr1 = $usermgr1.SamAccountName
$mgr1email = get-aduser $mgr1 -properties EmailAddress
$mgr1email.emailaddress
}
Set-Mailbox $testuser -ForwardingAddress $mgr1email.EmailAddress -DeliverToMailboxAndForward $False
Set-MailboxAutoReplyConfiguration -identity $testuser -AutoReplyState Enabled -InternalMessage $internal -ExternalMessage $external
Write-Host $testuser "Completed"
}
else{
此尝试返回一个错误:
Get-ADUser : Cannot validate argument on parameter 'Identity'. The Identity property on the argument is null or empty.
At line:4 char:18
+ If ($(get-aduser $usermgr1).enabled -eq $true){write-host "Enabled"}
此处的预期输出是此用户的管理器的SAMAccount(如果启用);如果禁用,我将继续向代码中添加更多级别,最多四到五个级别。我还不知道有足够的powershell可以循环并动态重新测试,以避免硬编码
-编辑-
使用itchydon的示例,我选择将递归限制在目标用户之上的两个级别。同时禁用三个或三个以上级别的可能性很低。因此,工作守则是:
$testuser = "janedoe"
$user = get-aduser $testuser -properties manager
if ($user.enabled -eq $false){
$usermgr1 = get-aduser $user.manager
if ($usermgr1.enabled -eq $true){Write-Host $usermgr1.SamAccountName}
else{
$user1 = get-aduser $usermgr1 -properties manager
if ($user1.enabled -eq $false){
$usermgr2 = get-aduser $user1.manager
if ($usermgr2.enabled -eq $true){
Write-Host $usermgr2.SamAccountName}
else{Write-Host "Recursion cannot complete. Handle manually."}
}
}
}
-编辑-
现在,使用工作代码,尝试使用相同的逻辑设置邮箱属性。我注意到的是,无论管理器是否被禁用,set mailbox命令都会在第一次测试中执行:
If ($get-aduser $usermgr1).enabled -eq $true) | select @{Name='Manager';Expression={(Get-ADUser $_.Manager).SAMAccountName}}
Else Write-Host "Manager Account Disabled"
}
if ($user.enabled -eq $false){
$usermgr1 = get-aduser $user.manager
if ($usermgr1.enabled -eq $true){
$mgr1 = $usermgr1.SamAccountName
$mgr1email = get-aduser $mgr1 -properties EmailAddress
$mgr1email.emailaddress
}
Set-Mailbox $testuser -ForwardingAddress $mgr1email.EmailAddress -DeliverToMailboxAndForward $False
Set-MailboxAutoReplyConfiguration -identity $testuser -AutoReplyState Enabled -InternalMessage $internal -ExternalMessage $external
Write-Host $testuser "Completed"
}
else{
在本例中,测试$usermgr1.enabled-eq$true是否失败,我希望完全跳过set-mailbox命令,然后转到else{语句
我认为这只是在测试声明中移动命令的问题,如下所示:
if ($user.enabled -eq $false){
$usermgr1 = get-aduser $user.manager
if ($usermgr1.enabled -eq $true){
$mgr1 = $usermgr1.SamAccountName
$mgr1email = get-aduser $mgr1 -properties EmailAddress
$mgr1email.emailaddress
Set-Mailbox $testuser -ForwardingAddress $mgr1email.EmailAddress -DeliverToMailboxAndForward $False
Set-MailboxAutoReplyConfiguration -identity $testuser -AutoReplyState Enabled -InternalMessage $internal -ExternalMessage $external
Write-Host $testuser "Completed"
}
}
else{
但是,当启用的测试通过时,最终结果是完全跳过set邮箱命令,而不采取任何操作
-编辑-
修复了邮箱命令问题,将变量声明保留在它们自己的块中,如下所示:
$user = get-aduser $testuser -properties manager
if ($user.enabled -eq $false){
$usermgr1 = get-aduser $user.manager
$mgr1 = $usermgr1.SamAccountName
$mgr1email = get-aduser $mgr1 -properties EmailAddress}
if ($usermgr1.enabled -eq $true){
Set-Mailbox $testuser -ForwardingAddress $mgr1email.EmailAddress -DeliverToMailboxAndForward $False
Set-MailboxAutoReplyConfiguration -identity $testuser -AutoReplyState Enabled -InternalMessage $internal -ExternalMessage $external
Write-Host $testuser "Completed"
}
不幸的是,我无法测试这一点,但我认为这正是你所追求的
$testuser = "johndoe"
$user = get-aduser $testuser -properties manager
if ($user.enabled -eq $true){
$usermgr1 = get-aduser $user.manager
if ($usermgr1.enabled -eq $false){
Write-Host "Manager Account Disabled"
}
else{
write-host $usermgr1.samaccountname
}
}
在上面的例子中,我们没有继续执行
getaduser
操作,而是为testuser执行一次,并将其保存到一个变量($user
)。然后,我们可以访问对象的每个属性-因此我们使用它来检查启用状态,如图所示,例如$user.enabled-eq$true
。如果为true-使用相同的技术进行另一次获取aduser
,以获取管理者的信息谢谢你,Itchy;使用你的建议更新了扩展问题的原始问题orated.Short版本是,现在命令要么在不应该执行的时候执行,要么在应该执行的时候不执行。可能只是一个逻辑错误。是的,大部分情况下。奇怪的是,脚本似乎在一条记录上出现了问题,而在这条记录中,用户帐户实际上是在当时启用的。我原以为会出现.enabed-eq$false的第一行在任何被跳过的已启用帐户中的d。是否有必要在脚本末尾显式声明此条件?我假设它可以被忽略,并且如果第一个条件失败,脚本将完全退出。我不确定是否遵循。目前是如果($user.enabled-eq$false){$usermgr1=get aduser$user.manager