PowerShell Office 365脚本将用户和邮箱信息放在一起

时间:2017-09-28 14:23:04

标签: powershell office365 exchange-server

我是PowerShell的新手(今天早上开始)。我已成功连接到Office 365,并且能够从Exchange部分获取Office 365和邮箱字段中的用户列表。我无法弄清楚的是如何将它们结合起来。

我正在寻找的是能够从邮箱对象导出某些字段,但仅限于那些属于非阻止,许可的Office 365用户的邮箱。我们有很多用户的邮箱尚未被删除,但他们可能不再获得许可,或者可能被阻止。

以下是我现在运行的两个导出。它们是完整的出口。我尝试通过isLicensed过滤到Office 265用户但我从未得到任何结果所以我只是下载了所有内容并使用Excel进行后处理。但我需要定期运行这个......

以下是代码:

Get-Mailbox -ResultSize Unlimited | Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2 | Export-CSV  C:\temp\o365\mailboxes.csv
Get-MsolUser -all | Select-Object SignInName, DisplayName, Office, Department, Title, IsLicensed | export-csv c:\temp\o365\Users.csv

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

好的,我了解您要做的事情......您想获得IsLicensed属性为$true的所有O365用户列表以及{{1} } property是BlockCredential。在那些用户中,您希望从其邮箱对象中提取一些数据; DisplayName,Name,PrimarySMTPAddress和CustomAttribute2。

有几种方法可以做到这一点。第一个更容易在shell中放在一起,但实际运行需要更长的时间。第二个需要一些设置,但很快就会完成。

第一种方法

由于我们知道我们对$false所需内容的标准是什么,因此我们将使用该管道提取我们想要的内容并将其直接投入Get-MsolUser

Get-Mailbox

O365 PowerShell不喜欢给我们过滤初始查询的方法,所以我们在第二步处理,在这里......

Get-MsolUser -All | Where-Object {$_.IsLicensed -eq $true -and $_.BlockCredential -eq $false} | Select-Object UserPrincipalName | ForEach-Object {Get-Mailbox -Identity $_.UserPrincipalName | Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2}

这意味着,对于从Where-Object {$_.IsLicensed -eq $true -and $_.BlockCredential -eq $false}传入的每个项目,我们只希望将属性Get-MsolUser -All设置为$ true且Islicensed设置为$ false的项目。

现在,我们只关心BlockCredential的结果,以确定要查找的邮箱,因此我们将从匹配我们之前过滤器的每个对象中获取一个属性。

Get-MsolUser

如果到目前为止只运行了所有内容,那么您的shell中的UPN列表将显示我们现在将要导入Select-Object UserPrincipalName的所有帐户。

继续我们的循环...如果你还没有学习Get-Mailbox,那么它用于运行一个脚本块(ForEach-Object之间的所有内容)对应管道中的每个项目,一个一次。

{}

欢迎使用管道运营商(Get-Mailbox -Identity $_.UserPrincipalName)。我们之前的$_正在通过管道提供一组对象,这个占位符变量将在我们处理它们时保存每个对象。由于这些对象都具有Select-Object属性,因此我们引用该值以传递给UserPrincipalName的{​​{1}}参数。

边栏

这是一个如何运作的简单例子。

Identity

每个项目都沿着管道传递,我们一次一个地写出来。这与您的标准Get-Mailbox循环非常相似。您可以在this Scripting Guy post中了解有关他们之间差异的更多信息。

继续......

PS> 1,2,3 | ForEach-Object {Write-Host $_} 1 2 3

我们用最后一个foreach将其包装起来,以获取您想要的信息。然后,您可以将shell或管道中的结果查看到Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2以便在Excel中使用。

现在......由于管道按顺序工作,因此有一些开销。我们正在运行一个命令,收集结果,然后将这些结果一次传递给下一个命令。当我们到达Select-Object时,对于我们收集的每个UPN,我们实际上运行Export-Csv一次。这在我的组织中大约需要2.5分钟,而且我们的邮箱少于500个。如果你正在使用更大的数字,那么运行它的时间会很快增长。

第二种方法

由于第一种方法中的大量处理开销是使用管道,我们可以通过尽可能早地和彻底地处理我们的数据收集来消除大部分。

Get-Mailbox

前两行非常明显。我们获得了我们关心的所有用户帐户信息(只是UPN),然后我们获取了我们关心的所有邮箱属性。

Get-Mailbox

$Users = Get-MsolUser -All | Where-Object {$_.IsLicensed -eq $true -and $_.BlockCredential -eq $false} | Select-Object -ExpandProperty UserPrincipalName $Mailboxes = Get-Mailbox | Select-Object UserPrincipalName,DisplayName,Name,PrimarySMTPAddress,CustomAttribute2 $Results = foreach ($User in $Users) { $Mailboxes | Where-Object UserPrincipalName -eq $User } $Results | Export-Csv myFile.csv 中的每个条目都将存储在foreach ($User in $Users)中,然后我们会在后面的脚本块中使用它(在$Users中)。

$User

{}中的每个项都通过管道传输到$Mailboxes | Where-Object UserPrincipalName -eq $User,然后我们会检查$Mailboxes属性是否等于Where-Object的当前值。然后,所有匹配项都存储在UserPrincipalName中,可以再次通过管道传送到$User以便在Excel中工作。

虽然这种方法在shell中更难写出来,并且需要一些额外的初始设置,但运行速度要快得多;我的组织为22秒,第一种方法为2.5分钟。

我还应该指出,$Results与邮箱数据集的使用只是为了确保这些与帐户数据集之间的完全匹配。如果您不希望在最终结果中使用它,则可以始终将Export-Csv传递到另一个UserPrincipalName并仅指定您关注的属性。

希望这有帮助!