当前位置: 首页 > news >正文

[Quest ActiveRoles Management Shell for Active Directory] QADProxyAddress命令相关的bug。

This post also be published in English: http://www.cnblogs.com/LarryAtCNBlog/p/3923882.html

称之为bug真得好吗?不过想想也没错呀,因为QADProxyAddress相关的命令基本上都不能用了都。

事情大概是这样,

我们公司因为业务以前有很多smtp address,现在大统一要清除AD里面一些SMTP domain,公司用的是Quest ARServer管理权限,因此实际上我本人虽然身为管理员,其实权限对AD本身就是一个普通user,所有的操作都必须通过Quest console来实现,很高兴的是Quest公司出品了powershell版的console,让我可以通过命令行来做batch job。

当然,这次的smtp domain清理大行动又落在了我身上,咦~~我为什么要说又~

打开ISE,开始码代码,其实写脚本,或者说编程,核心干活的代码绝不能排在第一位,logging至少是与其并列,log是当事情干完之后一旦出问题,唯一能够拯救世界的东西。

扯远了,代码并不复杂,根据project team每次所给我的batch job,我只需要读该文本,取出user名字,用Get-QADUser的方法从AD里把该user抓到,然后判断其ProxyAddresses属性有没有匹配到目标domain就好了,没有匹配到的话,则跳过该user,匹配到的话就提取出匹配项,然后执行Remove-QADProxyAddress命令就行了。这么简单想想都有点小激动呢。

代码写一半,打算用自己的账号测试一下Remove-QADProxyAddress这个cmdlet的用法及错误返回。

哟,果然what the hell了,心凉一截,这错儿是怎么事儿?感觉要被坑呢?

明明通过console UI界面操作,不用每一个type的address都要有一个primary才对呀,可以直接做才对呀,果断搜了一搜,发现如下某人给Dell (没错Quest被Dell收购啦) report了同样的问题,话说Dell没人管是怎么事儿?这都快2年了!

http://en.community.dell.com/techcenter/powergui/f/4834/t/19574623.aspx

我公司用的还是ARS 6.7.0, ARS powershell module的相应版本是1.5.1,最新的是ARS 6.8.0,不清楚该bug修复了没有,无论怎么样服务器端要有对应的版本,不然光下载个最近的客户端也连接不上服务器,会被拒绝。

怎么办呢?其实问题很简单,QADProxyAddress相关的几个cmdlet在运行的时候都会检查每个proxy address的type,每种type都要有一个primary,没设置的话是不行的。而且,就算为了修正该问题,想对每个type都设一个primary,也是不行。困为如果同时存在两种以上的type没有primary,在纠正其中一个type的时候,会报另外的type没有primary的错误,比如同时有sip和x500两个type没有primary,在运行如下命令纠正sip的时候,就会报x500没有primary,称为被坑不为过呀

怎么办怎么办,都不要脸地答应人project manager了,现在说做不到不是要丢死人了吗?

AD账号本身又没权限,通过ARS又有该bug,最后想到exchange 2010,我的账号是有修改mailbox的权限的,看看mailbox上有没有同样的属性先。

于是果断登上exchange,打开powershell,Get-Mailbox | fl * 一瞅果断有同样的属性。这就是传说中的救命稻草,赶紧把Y按地上。用Set-Mailbox果然能无视primary修改proxy address,于是脚本改成用exchange powershell执行。于是有了下面的脚本,会读取Process.list.txt里的user list,然后从user的address找smtp地址的匹配,找到的话就删掉,没有找到就跳过。

. 'D:\Program Files\Microsoft\Exchange Server\v14\bin\RemoteExchange.ps1'
Connect-ExchangeServer -auto

$users = cat '.\Process.list.txt' | ?{$_} | %{$_.Trim()}
$addressToRemove = 'regular expression'

$Date = Get-Date
$strDate = $Date.ToString('yyyy-MM-dd')
$strLogFile = "$strDate.log"

function Add-Log{
    PARAM(
        [String]$Path,
        [String]$Value,
        [String]$Type
    )
    $Type = $Type.ToUpper()
    Write-Host "$((Get-Date).ToString('[HH:mm:ss] '))[$Type] $Value"
    if($Path){
        Add-Content -Path $Path -Value "$((Get-Date).ToString('[HH:mm:ss] '))[$Type] $Value"
    }
}

$Total = $users.Count
Add-Log -Path $strLogFile -Value "Users count: [$Total]" -Type Info

$users | %{$Processed = 0}{
    $Processed++
    Add-Log -Path $strLogFile -Value "Processing: [$Processed/$Total][$_]" -Type Info
    $mailbox = $null
    $mailbox = Get-Mailbox -Identity $_
    if(!$mailbox)
    {
        Add-Log -Path $strLogFile -Value "Failed to get user's mailbox" -Type Error
        return
    }
    Add-Log -Path $strLogFile -Value "All 1: [$(($mailbox.EmailAddresses | %{$_.ProxyAddressString}) -join '], [')]" -Type Info
    $addresses = $mailbox.EmailAddresses | ?{$_.Prefix.DisplayName -eq 'SMTP'} | %{$_.SmtpAddress}
    $addressMatch = $null
    $addressMatch = $addresses -imatch $addressToRemove
    if($addressMatch)
    {
        Add-Log -Path $strLogFile -Value "Matched: [$($addressMatch -join '], [')]" -Type Info
        $mailbox | Set-Mailbox -EmailAddresses @{remove=$addressMatch} -ErrorAction:SilentlyContinue
        if(!$?)
        {
            Add-Log -Path $strLogFile -Value 'Remove address failed, cause:' -Type Error
            Add-Log -Path $strLogFile -Value $Error[0] -Type Error
        }
        $mailbox = Get-Mailbox -Identity $_
        Add-Log -Path $strLogFile -Value "All 2: [$(($mailbox.EmailAddresses | %{$_.ProxyAddressString}) -join '], [')]" -Type Info
    }
    else
    {
        Add-Log -Path $strLogFile -Value "No SMTP address matched, move to next." -Type Info
        return
    }
}

转载于:https://www.cnblogs.com/LarryAtCNBlog/p/3922579.html

相关文章:

  • cursor:hand 与 cursor:pointer 的区别
  • win7中USB音箱没有声音解决的方法
  • 绘制思维导图的注意事项有哪些?
  • Sql去重语句
  • js算法-归并排序(merge_sort)
  • sessionStorage和localStorage
  • 昼猫笔记 JavaScript -- 面向对象(I)
  • 在Activity中为什么要用managedQuery()
  • uoj#352. 新年的五维几何(概率期望+爆搜)
  • 自己编写的一个Javascript正则表达式对象
  • 几张关于IT业人才成长的统计图片
  • POJ 2029
  • sed命令教程
  • jquery版本
  • 【M19】了解临时对象的来源
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS3 变换
  • Github访问慢解决办法
  • JavaScript HTML DOM
  • Java面向对象及其三大特征
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Leetcode 27 Remove Element
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Sass 快速入门教程
  • 模型微调
  • 前端_面试
  • 跳前端坑前,先看看这个!!
  • 硬币翻转问题,区间操作
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 回归生活:清理微信公众号
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​第20课 在Android Native开发中加入新的C++类
  • #{} 和 ${}区别
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (¥1011)-(一千零一拾一元整)输出
  • (1)bark-ml
  • (14)Hive调优——合并小文件
  • (C++17) std算法之执行策略 execution
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (算法二)滑动窗口
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net CHARTING图表控件下载地址
  • .NET Core WebAPI中封装Swagger配置
  • .net和jar包windows服务部署
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ??eclipse的安装配置问题!??
  • @EnableAsync和@Async开始异步任务支持