PowerShell Office 365 脚本一起获取用户和邮箱信息
PowerShell Office 365 Script to get user and mailbox information together
我是 PowerShell 的新手(今天早上开始)。我已成功连接到我的 Office 365,并且能够从 Office 365 中获取用户列表,并从 Exchange 部分获取邮箱字段。我想不通的是如何将它们结合起来。
我正在寻找的是从邮箱对象中导出某些字段的能力,但仅限于那些属于未阻止的、许可的 Office 365 用户的邮箱。我们有很多用户,他们的邮箱没有被删除,但他们可能不再被许可或被阻止。
这是我现在 运行ning 的两个出口。它们是完整的出口。我试图通过 isLicensed 过滤到 Office 265 用户,但我从未得到任何结果,所以我只是下载了所有内容并 post 使用 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
的所有 O365 用户的列表BlockCredential
属性 是 $false
。在这些用户中,您希望从他们的邮箱对象中提取一些数据; DisplayName、名称、PrimarySMTPAddress 和 CustomAttribute2。
有几种方法可以做到这一点。第一个更容易放在 shell 中,但实际上 运行 需要更长的时间。第二个需要一些设置,但很快就能完成。
第一种方法
既然我们知道我们想要从 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
如果您只 运行 到目前为止的所有内容,您会在 shell 中获得我们现在要导入的所有帐户的 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
循环非常相似。您可以在 this Scripting Guy post.
中详细了解它们的差异
继续前进...
Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2
我们用最后一个 Select-Object
来总结您想要的信息。然后,您可以查看 shell 中的结果或通过管道输入 Export-Csv
以在 Excel.
中使用
现在...由于管道按顺序工作,因此会产生一些开销。我们正在 运行 执行一个命令,收集结果,然后将这些结果一次一个地传递到下一个命令。当我们到达 Get-Mailbox
时,我们实际上为我们收集的每个 UPN 运行ning 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
中的每个项目都通过管道传输到 Where-Object
,然后我们在其中检查 UserPrincipalName
属性 是否等于 $User
的当前值。然后所有匹配项都存储在 $Results
中,可以再次通过管道传输到 Export-Csv
以便在 Excel.
中工作
虽然此方法在 shell 中更难写出,并且需要一些额外的初始设置,但它 运行 速度明显更快;我的组织需要 22 秒,而第一种方法需要 2.5 分钟。
我还应该指出,将 UserPrincipalName
与邮箱数据集一起使用只是为了帮助确保它们与帐户数据集之间的可靠匹配。如果您不希望它出现在最终结果中,您可以随时将 $Results
传送到另一个 Select-Object
并仅指定您关心的属性。
希望对您有所帮助!
我是 PowerShell 的新手(今天早上开始)。我已成功连接到我的 Office 365,并且能够从 Office 365 中获取用户列表,并从 Exchange 部分获取邮箱字段。我想不通的是如何将它们结合起来。
我正在寻找的是从邮箱对象中导出某些字段的能力,但仅限于那些属于未阻止的、许可的 Office 365 用户的邮箱。我们有很多用户,他们的邮箱没有被删除,但他们可能不再被许可或被阻止。
这是我现在 运行ning 的两个出口。它们是完整的出口。我试图通过 isLicensed 过滤到 Office 265 用户,但我从未得到任何结果,所以我只是下载了所有内容并 post 使用 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
的所有 O365 用户的列表BlockCredential
属性 是 $false
。在这些用户中,您希望从他们的邮箱对象中提取一些数据; DisplayName、名称、PrimarySMTPAddress 和 CustomAttribute2。
有几种方法可以做到这一点。第一个更容易放在 shell 中,但实际上 运行 需要更长的时间。第二个需要一些设置,但很快就能完成。
第一种方法
既然我们知道我们想要从 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
如果您只 运行 到目前为止的所有内容,您会在 shell 中获得我们现在要导入的所有帐户的 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
循环非常相似。您可以在 this Scripting Guy post.
继续前进...
Select-Object DisplayName,Name,PrimarySMTPAddress,CustomAttribute2
我们用最后一个 Select-Object
来总结您想要的信息。然后,您可以查看 shell 中的结果或通过管道输入 Export-Csv
以在 Excel.
现在...由于管道按顺序工作,因此会产生一些开销。我们正在 运行 执行一个命令,收集结果,然后将这些结果一次一个地传递到下一个命令。当我们到达 Get-Mailbox
时,我们实际上为我们收集的每个 UPN 运行ning 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
中的每个项目都通过管道传输到 Where-Object
,然后我们在其中检查 UserPrincipalName
属性 是否等于 $User
的当前值。然后所有匹配项都存储在 $Results
中,可以再次通过管道传输到 Export-Csv
以便在 Excel.
虽然此方法在 shell 中更难写出,并且需要一些额外的初始设置,但它 运行 速度明显更快;我的组织需要 22 秒,而第一种方法需要 2.5 分钟。
我还应该指出,将 UserPrincipalName
与邮箱数据集一起使用只是为了帮助确保它们与帐户数据集之间的可靠匹配。如果您不希望它出现在最终结果中,您可以随时将 $Results
传送到另一个 Select-Object
并仅指定您关心的属性。
希望对您有所帮助!