![](/img/trans.png)
[英]PowerShell - Office 365 mailbox - get emails from specific folder
[英]PowerShell Office 365 Script to get user and mailbox information together
我是PowerShell的新手(今天早上开始)。 我已经成功连接到我的Office 365,并且能够从Office 365中获得用户列表,并能够从Exchange部分获得邮箱字段。 我不知道如何结合它们。
我正在寻找的功能是能够从邮箱对象中导出某些字段,但只能导出属于非阻塞,许可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
任何援助将不胜感激。
好的,据我所知,您要尝试执行的操作...您想获取IsLicensed
属性为$true
且BlockCredential
属性为$false
的所有O365用户的列表。 然后,在这些用户中,您想从其邮箱对象中提取一些数据; DisplayName,Name,PrimarySMTPAddress和CustomAttribute2。
我们可以通过两种方法来做到这一点。 第一种方法更容易放在外壳中,但是实际运行需要更长的时间。 第二个步骤需要进行一些设置,但可以快速完成。
由于我们知道从Get-MsolUser
条件的标准,因此我们将使用管道提取所需的信息并将其直接扔到Get-Mailbox
。
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}
O365 PowerShell不喜欢给我们提供过滤初始查询的方法,因此我们在第二步(此处)进行处理。
Where-Object {$_.IsLicensed -eq $true -and $_.BlockCredential -eq $false}
这意味着,对于从Get-MsolUser -All
传入的每个项目,我们只希望将属性Islicensed
设置为$ true并将BlockCredential
设置为$ false的那些项。
现在,在确定要查找哪些邮箱方面,我们只关心Get-MsolUser
的结果,因此我们将从与我们先前的过滤器匹配的每个对象中获取一个属性。
Select-Object UserPrincipalName
如果您只运行到目前为止的所有内容,那么您将在外壳程序中获得UPN的列表,该列表包含了我们现在要传递到Get-Mailbox
所有帐户。
继续我们的循环...如果您还没有学习ForEach-Object
,它用于对管道中的每个项目一次运行一个脚本块( {}
之间的所有内容)。
Get-Mailbox -Identity $_.UserPrincipalName
欢迎使用管道运算符( $_
)。 我们之前的Select-Object
通过管道提供了一组对象,并且在我们处理它们时,该占位符变量将容纳每个对象。 由于这些对象都具有UserPrincipalName
属性,因此我们将其引用以将值传递给Get-Mailbox
的Identity
参数。
这是一个简单的例子。
PS> 1,2,3 | ForEach-Object {Write-Host $_}
1
2
3
每一项都沿着管道传递,我们在其中一次将它们写出来。 这与您的标准foreach
循环非常相似。 您可以在此Scripting Guy帖子中了解有关它们差异的更多信息 。
继续...
Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2
我们用最后一个Select-Object
包装了您想要的信息。 然后,您可以查看外壳程序或导入Export-Csv
以便在Excel中使用的结果。
现在...由于管道按顺序工作,因此有一些开销。 我们正在运行一个命令,收集结果,然后一次将这些结果传递给下一个命令。 当我们到达Get-Mailbox
,实际上对于收集到的每个UPN都运行一次Get-Mailbox
。 在我的组织中,这大约需要2.5分钟,而我们的邮箱不到500个。 如果您要处理大量文件,则运行此文件的时间可能会很快增加。
由于第一种方法的大量处理开销与使用管道有关,因此我们可以通过尽早而彻底地处理我们的数据收集来消除大部分开销。
$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
前两行很不言自明。 我们获得了我们关心的所有用户帐户信息(仅是UPN),然后获取了我们关心的所有邮箱属性。
foreach ($User in $Users)
$Users
每个条目将存储在$User
,然后在后面的脚本块(在{}
)中使用它。
$Mailboxes | Where-Object UserPrincipalName -eq $User
$Mailboxes
每个项目都通过管道UserPrincipalName
到Where-Object
,然后我们Where-Object
其中检查UserPrincipalName
属性是否等于$User
的当前值。 然后,所有匹配项都存储在$Results
,该值可以再次通过管道传输到Export-Csv
以在Excel中工作。
尽管此方法很难在Shell中写出,并且需要一些额外的初始设置,但运行速度明显更快。 我的组织机构需要22秒,而第一种方法需要2.5分钟。
我还应该指出,将UserPrincipalName
与邮箱数据集一起使用UserPrincipalName
是为了帮助确保它们与帐户数据集之间的牢固匹配。 如果您不希望在最终结果中使用它,则始终可以将$Results
管道Select-Object
到另一个Select-Object
并仅指定您关心的属性。
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.