【问题标题】:Exchange Powershell script loopingExchange Powershell 脚本循环
【发布时间】:2017-04-17 21:29:08
【问题描述】:

我有一个脚本,我经常在工作中使用它来显示用户帐户上的所有活动同步设备。我需要一个启用或禁用 Activesync 的用户列表,所以我编辑了第一个脚本。然而,现在它循环了很多次,如果我放 -hidetableheadders,它会循环更多次。这段导致循环的代码有什么问题?我将首先放置我需要帮助的代码,然后将我复制的工作代码放在下面。

我认为问题在于“foreach”块,但无论我在其中进行什么更改,即使将其删除,文件都是空的。

启用 Activesync 的代码:

#Settings for file ouput
$fLocation = "D:\Exchange Reports\"

#Read OU imput from console:
$OU = Read-Host -Prompt "Input the OU name to search: (0202 - Dev Bank)"

#lookup users based on the OU
$Ulist = Get-CASMailbox -organizationalunit "OU=$OU,OU=Hosted Exchange Customers,DC=CSIDMZ,DC=local" -ResultSize Unlimited


foreach ($user in $Ulist)
    {
        $aSyncUser = Get-CASMailbox -organizationalunit "OU=$OU,OU=Hosted Exchange Customers,DC=ThisIsMyDC,DC=local" | where { $_.ActiveSyncEnabled -eq 'True'} | ft name, activesyncenabled -autosize

        if ($aSyncUser -ne $null)
            {
                $deviceID = $aSyncUser | out-string
                $Content = "User: $user $deviceID"
                Add-Content $fName $Content
            }

    }

    write-host "The script completed successfully! The output file can be found at $fName" -ForeGroundColor Yellow

原代码:

#Settings for file ouput
$fLocation = "D:\Exchange Reports\"

#Read OU imput from console:
$OU = Read-Host -Prompt "Input the OU name to search: (0202 - Dev Bank)"

#lookup users based on the OU
$Ulist = get-mailbox -OrganizationalUnit "OU=$OU,OU=Hosted Exchange Customers,DC=ThisIsMyDC,DC=local" -ResultSize Unlimited


foreach ($user in $Ulist)
    {
        $aSyncUser = get-activesyncdevice -mailbox $user.SAMAccountName -ErrorAction SilentlyContinue |ft DeviceID -HideTableHeaders

        if ($aSyncUser -ne $null)
            {
                $deviceID = $aSyncUser | out-string
                $Content = "User: $user $deviceID"
                Add-Content $fName $Content
            }
    }

    write-host "The script completed successfully! The output file can be found at $fName" -ForeGroundColor Yellow

这是文件的输出,以 Matt 为例。我已经缩短了第一组,但包括了第二组的全部回报。我在运行命令时得到的日志,根据我的判断返回 OU 中每个用户的完整列表,而不仅仅是这个列表中的用户。这是因为在命令中有两次 ou 选择吗?

User: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData 
Name             ActiveSyncEnabled
----             -----------------
Judy X Langford               True

User: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData 
Name             ActiveSyncEnabled
----             -----------------
Judy X Langford               True

我编辑了命令,得到了这个返回值,这就是告诉我它为每个用户返回一次结果的原因,我只需要一次结果。我包括要显示的整个结果集,用户 Sharla 不在其下方的返回列表中。

User: Domain.local/Hosted Exchange Customers/This is my OU/Sharla x Ryan
Name             ActiveSyncEnabled
----             -----------------
Judy X Langford               True
Sandy X Stuckey               True
0718 test                     True
Shelby D Hansche              True
Toni X Brooks                 True
Katie X Strain                True
Monica Minter                 True
Chloe X Mims                  True
Jay X Davis                   True
Aaron Calvit                  True
Joe Nichols                   True
Sherry X Rice                 True
Tracey X Wardlaw              True
Brad X Davis                  True
Chris X Lannom                True
Haley X Burleson              True
Cody X Deal                   True
Cris X Day                    True
Mitch X Stone                 True



User: Domain.local/Hosted Exchange Customers/This is my OU/Judy X Langford
Name             ActiveSyncEnabled
----             -----------------
Judy X Langford               True

接受 Matt 的建议,我在 $user.samaccountname 的行中添加了回来。这破坏了输出,所以我不得不把它输入,但现在它给了我非常需要的东西。

#lookup users based on the OU

Get-CASMailbox -OrganizationalUnit "OU=$OU,OU=Hosted Exchange Customers,DC=CSIDMZ,DC=local" -ResultSize unlimited | select name,activesyncenabled >>$fLocation+$OU+"_ActiveSyncEnabled.txt"

foreach ($user in $Ulist)
    {
        $aSyncUser = get-activesyncdevice -mailbox $user.SAMAccountName -ErrorAction SilentlyContinue |ft name, activesyncenabled -HideTableHeaders 

        if ($aSyncUser -ne $null)
            {
                $deviceID = $aSyncUser | out-string
                $Content = "User: $user $deviceID"
                Add-Content $fName $Content
            }
    } 

【问题讨论】:

  • 听从the SSCCE的建议。
  • 对不起比尔,我添加了我认为问题发生的地方。我不知道为什么我一开始就没有说明这一点。
  • 仅仅说出你认为问题出在哪里是不够的。重新开始并编写一个小脚本,其中只包含重现问题所需的最少代码量。仔细阅读我发布的链接。

标签: loops powershell exchange-server activesync


【解决方案1】:

这可能不是全部问题,但肯定是其中很大一部分

$aSyncUser = Get-CASMailbox -organizationalunit "OU=$OU,OU=Hosted Exchange Customers,DC=ThisIsMyDC,DC=local" | where { $_.ActiveSyncEnabled -eq 'True'} | ft name, activesyncenabled -autosize
  1. 您没有获得单个用户。每次通过时,您都会在该 OU 中获得 所有 用户。我无法想象这就是你想要的。
  2. 您对 Format-Table 的使用只是在寻找未来的问题。在这里查看我对该主题的回答How can I store output from Format-Table for later use

我需要启用或禁用 Activesync 的用户列表

那么所有用户呢?不确定为什么要在循环外搜索 CAS-Mailboxes 以在循环内的不同 OU 中再次搜索。

【讨论】:

  • 这个想法是生成一个 OU 中启用了 Activesync 的所有用户的列表。我得到的结果是正确的,但它会为每个用户重复。我将在周一返回工作时举一个例子,向您展示我在说什么。
  • @Tekwhat 你看了我的回答了吗?特别是第 1 点。是否所有用户都返回到该 OU 中?
  • Matt,OU中有52个用户,生成的列表有19个用户,这个列表在文件中重复了52次。
  • @Tekwhat 不同之处在于内部循环查询是用where { $_.ActiveSyncEnabled -eq 'True'} 过滤的,所以我猜是 52 个用户中有 19 个用户启用了 ActiveSync。查看您的原始代码,您将看到-mailbox $user.SAMAccountName,它将查询限制为一个用户。
猜你喜欢
  • 2021-11-22
  • 2015-11-22
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2022-10-17
  • 2014-11-10
相关资源
最近更新 更多