最近总公司要求Office365需要在所有的邮箱上面打开审计功能。这个功能没法通过图形界面操作,只能通过powershell脚本实现。

微软提供了一个官方的脚本,不过里面有个小bug

https://technet.microsoft.com/en-us/library/dn879651.aspx#step2

我发现Office365的一个bug:我们有个别用户同时存在一个AD同步的账户,也有cloud创建的账户,而且两个账户都是用的同一个名字。Office365允许这么做,而且不会报错。 但是!当我们使用Get-Mailbox XXXX | Set-mailbox的时候,不管XXX是什么,alias name, displayname 或者ID或者 name等等属性,他获取的值都是一样的,然后当他通过管道传递的时候,他传递的始终是displayname而不是其他值,这样一来,当有重名的displayname存在时候,系统就sb了,不知道该修改哪个,直接报错!

以我自己的邮箱为例,我故意修改了displayname的值,和其他属性不太一样,然后跟踪管道参数的变化

PS C:\temp> get-mailbox "yuan.li"| select name, displayname,id,alias
Name    DisplayName Id      Alias
----    ----------- --      -----
Yuan Li Yuan Lee    Yuan Li yuan.li

跟踪变化

Trace-Command -PSHost -name ParameterBinding -Expression {
get-mailbox yuan.li |Set-Mailbox -AuditEnabled $true
}

发现经过一大堆的验证和远程调用,最后他传入的参数是displayname,而不是我管道前面输入的属性。这里甭管我输入啥属性,获取到对象之后传给管道的始终是displayname这个属性

因为上面这个bug,豆子不建议直接用官方提供的get-mailbox | set-mailbox  修改数据,而是手动地写个for循环通过Distinguishedname之类的属性处理,避免意外冲突。

另外还有一个很2的地方是,Office365不能设置默认打开审计,因此所有的新账户都是没有打开的。豆子只能设置一个计划任务,让脚本每天自动执行来修改新账户的设定。

另外,执行完了之后,我希望把修改过的账户都给我发一份邮件通知一下,另外最后windows也给我写个日志,以便日后查看。

下面是完整的脚本

#Create a secure string of the your password
#Read-Host -AsSecureString | ConvertFrom-SecureString > c:\temp\key.txt#Check if O365 session is setup, if not, create a new one
$Sessions=Get-PSSession
if (($Sessions.ComputerName -eq "outlook.office365.com") -and ($Sessions.State -ne 'Broken')){write-host "Detect existing Office365 session, skip.." -ForegroundColor Cyan
}
else{$username = "yuan.li@aus.ddb.com"$secureStringPwd = gc C:\temp\key.txt | ConvertTo-SecureString$creds = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $secureStringPwd$ExoSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $creds -Authentication Basic -AllowRedirectionImport-PSSession $ExoSession
}
#Find Mailboxes that haven't enabled auditing
$users=get-mailbox -Filter {AuditEnabled -eq $false} | select name, alias, auditenabled, auditlogagelimit, distinguishedname
foreach($user in $users){try{Set-Mailbox $user.distinguishedname -AuditEnabled $true -AuditLogAgeLimit 365 -AuditOwner Create,HardDelete,MailboxLogin,MoveToDeletedItems,SoftDelete,Update -ErrorAction Stop# Create a Windows Eventlog if needed$username=$user.nameWrite-Eventlog  -Logname 'Application' -Source 'Application' -EventID 666 -EntryType Information -Message "$username Maibox Auditing is enabled" }catch{Write-Eventlog  -Logname 'Application' -Source 'Application' -EventID 667 -EntryType Error -Message "$user Mailbox Auditing is failed to enable" }}
#There are two ways to check the resut, Event Viewer or Email
#Check again if the status is changed
$result=foreach($user in $users){get-mailbox $user.name | select name, alias, auditenabled, auditlogagelimit, distinguishedname
}
#Send Email to the admin
$from = "yuan.li@syd.ddb.com"
$to = "yuan.li@syd.ddb.com"
$smtp = "smtp.office365.com"
$sub = "Auditing list"
$secureStringPwd = gc C:\temp\key.txt | ConvertTo-SecureString
$creds = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $secureStringPwd
$date=get-date
$htmlbody=$result| ConvertTo-Html -Body " <H1> $date Mailbox Auditing Enabled record </H1>" -CssUri C:\tmp\table.css
Send-MailMessage -To $to -From $from -Subject $sub -Body ($htmlbody|Out-String) -Credential $creds -SmtpServer $smtp -DeliveryNotificationOption Never -BodyAsHtml -UseSsl -port 587
#Check from Event Viewer
try{$eventcritea = @{logname='Application';id=666}$Events =get-winevent -FilterHashtable $eventcritea -ErrorAction StopForEach ($Event in $Events) {    $eventXML = [xml]$Event.ToXml()              $Event | Add-Member -MemberType NoteProperty -Force -Name  Information -Value $eventXML.Event.EventData.Data             $Event.Information         }
}catch [system.Exception] {"Couldn't fine any mailbox auditing logs"
}$events | select information, id, logname, timecreated| Out-GridView -Title Status

测试结果

获取的Windows日志

收到的邮件通知

隔了2天,在https://securescore.office.com/#!/score 上确认一下状态已经改变!

转载于:https://blog.51cto.com/beanxyz/1956406

Office365 PowerShell打开邮箱审计功能相关推荐

  1. mysql审计权限_MySQL对普通用户(没有super)开启审计功能

    最近有发现有坏蛋delete 了数据,找不到是哪个user 哪个host,发现mysql 是可以对没有super 权限的用户开启审计功能,oracle早就 最近有发现有坏蛋delete 了数据,找不到 ...

  2. Oracle审计功能

    1.什么是审计 审计(Audit)用于监视用户所执行的数据库操作,审计记录可存在数据字典表(称为审计记录:存储在system表空间中的 SYS.AUD$表中,可通过视图dba_audit_trail查 ...

  3. Oracle绑定变量和审计功能影响性能吗?Python告诉你

    墨墨导读:SQL中使用绑定变量,以及开通审计功能对数据库影响有多大?本文来自读者投稿,作者用Python进行了一番测试,欢迎评论区交流互动. 一.概述 dba在工作中避不开的两个问题,sql使用绑定变 ...

  4. php实现邮箱激活功能

    php实现邮箱激活功能 一.样例 二.文件结构 其中swiftmailer-master是第三方插件,用来发验证邮件 三.核心代码 doAction.php 响应页面 1 <?php 2 hea ...

  5. oracle审计功能有什么用,Oracle审计功能

    本文参考文章:5 概述:5 审计功能分类:5 一.审计相关实例参数6 ?audit_sys_operations6 一..1 linux/unix6 一..2 windows7 二.标准审计10 (一 ...

  6. win开启审计功能_windows文件共享审计功能开启

    Windows server 2003的DC也是支持开启审计功能的,步骤如下: 1. 在DC上打开"Active Directory Users and Computer". 2. ...

  7. 使用oracle数据库审计,Oracle数据库审计功能详解

    一.审计分类: Oracle中审计总体上可分为"标准审计"和"细粒度审计"后者也称为"基于政策的审计",在Oracle10G之后功能得到很大 ...

  8. Oracle数据库审计功能的使用

    oracle审计功能 查看审计功能是否开启 开启审计功能: 关闭审计功能: 审计功能相关视图 审计功能的使用 数据库打开的语句审计功能 数据库打开的权限审计功能 数据库审计总体情况 数据库语句审计 数 ...

  9. Exchange Server 2010 的多邮箱搜索功能

    多邮箱搜索使用的是由 Exchange 搜索创建的内容索引.Exchange 控制面板为非技术人员,如法律法规事务主管.记录管理员.人力资源.专家等,提供易于使用的搜索界面.多邮箱搜索管理员能通过关键 ...

最新文章

  1. ubuntu 16.04下安装oracle jdk 1.7
  2. 代码之谜(四)- 浮点数(从惊讶到思考)
  3. 1.2.4 TCP/IP参考模型和五层参考模型
  4. Django学习手册 - ORM 数据创建/表操作 汇总
  5. elementui可编辑单元格_ElementUI 表格可编辑单元格
  6. python汉诺塔运行程序_用python编写一个程序,得到汉诺塔的解决方案
  7. [emacs] 用 ido 或 anything 进行选择
  8. HUE配置文件hue.ini 的hbase模块详解(图文详解)(分HA集群和非HA集群)
  9. 东软软件动态生成对数据表更新操作的方法
  10. Redis学习笔记三:Redis的数据类型
  11. android判断进程是否是意外退出
  12. android应用热修复与插件化实践之路
  13. linux dstat,dstat 用法详解
  14. 2021年茶艺师(初级)考试内容及茶艺师(初级)考试总结
  15. RNN网络对新冠疫情进行预测
  16. 用java JFrame,JPanel写的大鱼吃小鱼小游戏
  17. python数据分析基础技术篇_HTML5小游戏---爱心鱼(上)
  18. 方舟手游服务器设置文件翻译,方舟生存进化手游界面中文翻译 语言不通不发愁...
  19. 小程序报错修改Expecting 'STRING','NUMBER'
  20. 线性代数(1)- 向量空间

热门文章

  1. css中em单位和rem单位
  2. 北京市强化电信用户信息安全保护
  3. 基于Raspbian(树莓派)搭建web安全练习环境(一)
  4. linux vsftpd 550 create directory operation failed解决方法
  5. ​EMC存储产品介绍分析(二):大数据利器Isilon (2)
  6. 双十一淘宝、京东服务器瘫痪大揭秘 感悟
  7. Citrix XenDesktop 虚拟桌面 每用户/设备 许可手动释放
  8. Javascript 钩子机制——开会得出的结论
  9. OSPF系列小实验之6:网络类型对邻居关系及路由学习的影响
  10. 11种刷新按钮的方法