0

我正在编写一个脚本来通过 powershell 自动创建用户帐户。其中之一是为新用户建立一个电子邮件地址。我们将邮箱(或多或少)平均分布在 3 个数据库上:Default01、Default02 和 Default03。

为了确定帐户数量最少的数据库,我计算了当前的统计数据。

      function Get-MDBMailboxCount ([string]$DN) {
            $Searcher = New-Object System.DirectoryServices.DirectorySearcher
            $Searcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://$(([system.directoryservices.activedirectory.domain]::GetCurrentDomain()).Name)")
            $Searcher.Filter = "(&(objectClass=user)(homeMDB=$DN))"
            $Searcher.PageSize = 10000
            $Searcher.SearchScope = "Subtree"
            $results = $Searcher.FindAll()
            $returnValue = $results.Count

            #dispose of the search and results properly to avoid a memory leak
            $Searcher.Dispose()
            $results.Dispose()

            return $returnValue

       }
$Databases = (Get-MailboxDatabase)  Where {$_.Name -like 'Default*'} | Select-Object Name, @{Name="Count";Expression={Get-MDBMailboxCount -DN $_.DistinguishedName}} | Sort-Object count


}

这将返回一个对象 $databases ,其中包含NameCount列。然后我提取计数最低的数据库。

$DB = $Databases |Sort-Object Count |Select-Object -First 1

到目前为止一切顺利:) 但是由于我的脚本能够一次创建多个帐户,所以我想在每次在 $databases 对象中创建用户时更新计数器。(我不想再次运行该功能,因为它可能需要几秒钟来处理)。我可以像这样更新对象:

($databases | Where {$_.Name -eq $($DB.Name)}).Count = $NewCount

但我想知道是否有更简单的方法来更新 Powershell 对象中的元素。就像是

$Databases["Default01"].Count = $NewCount

这样的事情可能吗?还是没有其他/更好的方法来更新对象中的元素?

Get-MDBMailboxCount 函数的功劳转到 链接

4

1 回答 1

0

如果您已经拥有对当前 DB 对象的引用,则只需Count直接更新其属性即可。语法是$DB.Count = <new value>$DB.Count += <amount to add>

$databases = <do expensive get operation, get initial counts>

foreach($newUser in $userList)
{
   $DB = $databases | Sort-Object Count | Select-Object -First 1
   < go add users to the particular $DB, keep track of how many new users >
   $DB.Count += $numNewUsers   # or $DB.Count = $totalUserCount, whatever you like
}

$DB$databases是指向与数组中相同的底层对象的引用。因此,当您设置 时$DB.Count,它也会更新 中的正确元素$databases,并且下次对数组进行排序时,它将使用新的计数。

于 2012-09-14T17:20:33.273 回答