在开始写这篇博客之前先和大家道个歉,由于之前工作一直比较忙也没什么好的题材来供我写,所以没动笔。微软颁发的MVP奖杯和奖品一直在我父母家我到现在还没去拿,算了这也不是很重要,上海又一直下着雷暴雨,周末想出去放个狗钓个鱼总不能如愿,就算天气好又嫌太热。总之,我有暑假综合症,一到暑假就懒的动,最好一直在家里吹着空调玩玩大菠萝3。今年我还计划给自己放个暑假不知道能不能成功。

言归正传,关于这个脚本其实是我的一个德国同事提议的,他抱怨有些用户申请了相当大的邮箱但是根本没放什么东西,浪费存储资源,询问我技术上能否实现脚本查询会报告。我想了想脚本的大概轮廓回复到技术上没问题,不过德国的法律是禁止查询用户的个人信息的。要他先确认是否允许使用这样的脚本。晚上开会的时候德国人说确认下来说允许使用,不过有限制。OK,第二天我就着手开始写了。。

首先是构思和设计,究竟你的脚本是想体现哪种功能给用户,允许用户自定义哪些参数?输出的结果又是哪些?这些必须在开始写之前考虑好。关于这个脚本,我的想法是要一个窗体,给用户几个基本的查询条件,考虑到每个SITE的情况不一样,所以要把用户以SITE区分开。简单的画了下,大概就是这个样子。。。丑是丑了点,自己心里明白就可以。

image

 

核心的代码,额。。。我没学过编程,不知道这个说法正不正确,反正就是这个脚本最核心的那个命令。其他300行代码都是修饰,只有这行才是最重要的。在这个脚本中,这串代码就是

用实际使用掉的邮箱大小 除以 邮箱的配额 以得到这个用户的实际邮箱的使用率

查询实际使用的邮箱大小:

命令: Get-MailboxStatistics -id $user

因为我需要它直接显示出那个数值,所以稍作改变,加上变量就是:

$size = (Get-MailboxStatistics -id $user).totalitemsize.value

再给个参数将这个数值变成Bytes,方便计算

$psize = $size.ToBytes()

查询配额的命令是

$quotaa = (get-mailbox -id $user).ProhibitSendReceiveQuota

image

在这边要做个解释,由于我们公司的配额有些复杂,部分用户使用的是自定义配额,部分用户使用的虽然是unlimited,但是会受到一个参数UseDatabaseQuotaDefauls的限制。也就是说所有在数据库下的邮箱配额都将使用数据库的配额,有些拗口,不过你看下面这个就能明白了。

image

有些朋友可能还没发觉数据库也能制定配额,在这边要注意一下。

我稍微看了下所有的数据库设定的配额都不大,所有我就都选择性忽略了。直接来判断

$quotaa = (get-mailbox -id $user).ProhibitSendReceiveQuota

中$quotaa这个变量的Isunlimited参数。

代码如下:

if ($quotaa.Isunlimited -eq $false)
{   

$pquota = $quotaa.value.ToBytes() #将得到的Quota数值变成Bytes,方便计算


$pusage = ("{0:P2}" -f ($psize/$pquota))

("{0:P2}" -f ()) 的作用是将这两个数值相除后得到的数字再经过取小数点后2位, 外加变成百分比%

小实验:大家可以在自己的POWERSHELL中尝试输入

("{0:P2}" -f (0.8973623818172782))

得到的应该是89.74%

再用一个IF判断语句来判定这个得到的百分比数值(也就是使用率),如果小于50%,就会被我的脚本记录下来呈现在之后的报告中。

加上一些变量,基本脚本的架构已经出来了。。

==============================

$servers = get-mailboxserver  | where {$_.name -like "*sha*"}

$filedate = (get-date).tostring("yyyyMMdd_hhmmss")

foreach ($server in $servers)
{
write-host "Checking Primary mailbox on $server Mailbox Server..." –foregroundcolor green
$users = get-mailbox -server $server -ResultSize 50

    foreach ($user in $users)
    {
   
    $size = (Get-MailboxStatistics -id $user).totalitemsize.value
    $psize = $size.ToBytes()
   
    $quotaa = (get-mailbox -id $user).ProhibitSendReceiveQuota

        if ($quotaa.Isunlimited -eq $false)
        {   

        $pquota = $quotaa.value.ToBytes()
        $pusage = ("{0:P2}" -f ($psize/$pquota))
       
            if ($pquota -gt 200MB -and $pusage -lt "50%")
            {
            $nMsg = $nMsg +
            "
            UserName: $user
            Quota: $quotaa
            Size:  $size
            Usage Rate: $pusage
            ServerName: $server
            "
           
            }

        }

    }

}

$nMsg >> c:\$filedate.txt

invoke-item c:\$filedate.txt

==============================

稍微跑了一下

得到报告结果

image

经过美化之后的输出结果。。看着专业和舒心多了吧。。。

image

美化的方式是用HTML语言,在之前的博客中有提及,这边我就不说了

条件窗体的设计也完成了。。。之前的博客中也提到过。

image

其实这个脚本加测试我弄了一整天,我觉得写脚本只要有思路,写起来其实还挺快的。

谢谢各位支持!

本文完