Office365 PowerShell打开邮箱审计功能
最近总公司要求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的值,和其他属性不太一样,然后跟踪管道参数的变化
|
1
2
3
4
|
PS C:\temp> get-mailbox "yuan.li"| select name, displayname,id,aliasName DisplayName Id Alias ---- ----------- -- ----- Yuan Li Yuan Lee Yuan Li yuan.li |
跟踪变化
|
1
2
3
|
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也给我写个日志,以便日后查看。板面的做法和配料
下面是完整的脚本
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#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-PSSessionif (($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 -AllowRedirection Import-PSSession $ExoSession}#Find Mailboxes that haven't enabled auditing$users=get-mailbox -Filter {AuditEnabled -eq $false} | select name, alias, auditenabled, auditlogagelimit, distinguishednameforeach($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.name Write-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 Viewertry{ $eventcritea = @{logname='Application';id=666} $Events =get-winevent -FilterHashtable $eventcritea -ErrorAction Stop ForEach ($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 上确认一下状态已经改变!

Office365 PowerShell打开邮箱审计功能的更多相关文章
- SQLSERVER2008新增的审核/审计功能
SQLSERVER2008新增的审核/审计功能 很多时候我们都需要对数据库或者数据库服务器实例进行审核/审计 例如对失败的登录次数进行审计,某个数据库上的DDL语句进行审计,某个数据库表里面的dele ...
- sqlserver2012的审计功能的相关理解
1.sqlserver2012可以做实例的审计,以及数据库的审计,基本包括了所有的操作.可以符合我们的要求. 2.审计功能需要实例级别的配置数据库级别的配置,实例上建立“审核”,数据库上建立“数据 ...
- php实现邮箱激活功能
php实现邮箱激活功能 一.样例 二.文件结构 其中swiftmailer-master是第三方插件,用来发验证邮件 三.核心代码 doAction.php 响应页面 <?php header( ...
- MariaDB开启日志审计功能
对于MySQL.Percona.MariaDB三家都有自己的审计插件,但是MySQL的审计插件是只有企业版才有的,同时也有很多第三方的的MySQL的审计插件,而Percona和MariaDB都是GPL ...
- 解析大型.NET ERP系统 数据审计功能
数据审计,英语表达是Audit,是追踪数据变化的过程,记录数据变化前后的值,供参考分析.通过设置,ERP可以追踪一个表的所有字段的变化,也可以只记录指定的字段的值变化.欧美企业每年都有独立的审计部门, ...
- 利用paramiko模块实现堡垒机+审计功能
paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...
- [转]ORACLE 审计功能
审计是对选定的用户动作的监控和记录,通常用于: u 审查可疑的活动.例如:数据被非授权用户所删除,此时安全管理员可决定对该 数据库的所有连接进行审计,以及对数据库的所有表的成功地或不 ...
- mysql基于init-connect+binlog完成审计功能
目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用 ...
- 转-利用Oracle审计功能来监测试环境的变化
http://blog.csdn.net/luowangjun/article/details/5627102利用Oracle审计功能来监测试环境的变化 做过测试的人都应该会碰到这样的情况:测试发现的 ...
随机推荐
- Swift基础知识点的学习
每一个程序员都有一颗不满足当下知识的学习,学习Swift更是每一个iOS程序员必学技能!!! 一说道基础点的学习,当然涵盖的方面也是很多很多啦....然而每一个小知识点的学习,写一个博客,我也觉得没什 ...
- CTF攻防练习之综合训练1
主机:192.168.32.152 靶机:192.168.32.166 首先使用nmap,nikto -host ,dirb扫描,探测靶场开放了 21,22,80d端口已经发现有一下关键信息 进入lo ...
- office web apps安装部署,配置https,负载均衡(五)配置服务器场
前提条件:您已经完成了域控制器的配置,拥有域账号,并且已经安装了OWA启动所需要的必要软件: 具体步骤可以参考: office web apps安装部署,配置https,负载均衡(一)背景介绍 off ...
- C#编程 Excel操作
使用OLEDB操作Excel,关于OLEDB介绍参考http://www.cnblogs.com/moss_tan_jun/archive/2012/07/28/2612889.html 连接字符串: ...
- 【神经网络与深度学习】卷积神经网络(CNN)
[神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...
- subquery 子查询
#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Enum ...
- flask standrad class 使用
from flask import Flask,views,url_for app = Flask(__name__) class IndexView(views.View): def dispatc ...
- 学习shell的第二天
重定向和管道符: 1.重定向 程序 = 指令 + 数据 命令 变量 在程序中,数据如何输入?又如何输出? 数据输入:键盘 -- 标准输入,但是并不是唯一输入方式: ...
- Spring IOC 和Aspectj AOP
1.Aspectj AOP 是一套独立的AOP 解决方案,不仅限于java应用,不依赖其他方案,属于编译时增强,有自己单独的编译器.Spring AOP 是基于Spring 容器的的AOP解决方式,属 ...
- 纯前端表格控件SpreadJS V12.1 隆重登场,专注易用性,提升用户体验
一款优秀的开发工具,在更新迭代中,除了要满足不同场景的业务需求,也需不断优化已有功能,尤其是细节方面,要能为用户带来使用体验和开发效率的提升. 作为一款备受业界专家和开发者认可的纯前端类Excel ...