管理通知处理程序
Microsoft Active Directory 用户和计算机 MMC 管理单元提供了一种机制,使组件能够在用户删除、重命名、移动或更改对象的属性时使用管理单元接收通知。 接收通知的组件称为“通知处理程序”。
当多个对象链接在一起并且必须存在于同一容器中时,这非常有用。 如果移动了其中一个链接对象,则会向通知处理程序提供通知,通知处理程序可以将其他链接对象移动到同一文件夹。
执行其中一项作并安装一个或多个通知处理程序时,用户和计算机管理单元将显示一个确认对话框,其中列出了通知处理程序和每个处理程序的复选框。 如果选择处理程序的复选框,则会通知处理程序。 如果未选中该复选框,则不会通知处理程序。
实现通知处理程序
通知处理程序是作为过程内服务器实现的 COM 对象。 通知处理程序必须实现 IDsAdminNotifyHandler 接口。
发生将导致通知的事件时,用户和计算机管理单元会枚举已注册的通知处理程序,并使用处理程序的 CLSID 创建每个通知处理程序。 创建处理程序后,管理单元将调用 IDsAdminNotifyHandler::Initialize 方法。 Initialize 方法提供处理程序应接收的事件管理单元。
如果事件应发送到通知处理程序,则管理单元将调用 IDsAdminNotifyHandler::Begin 方法。 Begin 方法为处理程序提供事件发生的处理程序、事件发生对象的数据,以及有关该对象将变为哪些数据的数据。 Begin 方法还提供管理单元,其中包含应在确认对话框中为处理程序显示的文本。
调用每个处理程序的 Begin 方法时,管理单元将显示确认对话框。 确认对话框提示用户选择接收通知的处理程序。 如果用户在确认对话框中按下 “无”推送按钮,则不会通知任何处理程序。 如果用户按下 是 按下按钮,则确认对话框中选择的每个处理程序都会收到通知。 管理单元通过调用 IDsAdminNotifyHandler::Notify 方法将通知发送到处理程序。
收到所有处理程序的通知后,管理单元将调用 IDsAdminNotifyHandler::End 方法。 始终调用 End 方法,即使未调用 Notify 方法。
在 Windows 注册表中注册通知处理程序
与所有 COM 服务器一样,必须在 Windows 注册表中注册通知处理程序。 处理程序在以下密钥下注册:
HKEY_CLASSES_ROOT - CLSID - <CLSID>
<CLSID> 是由 StringFromCLSID 函数生成的 CLSID 的字符串表示形式。 在 <CLSID> 键下,有一个 InProcServer32 键,用于将对象标识为 32 位代理服务器。 在 InProcServer32 键下,DLL 的位置在默认值中指定,线程模型在 ThreadingModel 值中指定。 所有通知处理程序都必须使用 单元 线程模型。
向 Active Directory 服务器注册通知处理程序
在 Active Directory 域服务中,通知处理程序注册特定于一个区域设置。 如果通知处理程序适用于所有区域设置,则必须在 displaySpecifiers 容器中所有区域设置子容器中 displaySpecifier 对象中注册它。 如果某个区域设置的通知处理程序已本地化,则会在该区域设置的子容器中的 displaySpecifier 对象中注册该处理程序。 有关 DisplaySpecifiers 容器和区域设置的详细信息,请参阅 显示说明符 和 DisplaySpecifiers 容器。
通知处理程序在 DS-UI-Default-Settings 容器中的 dsUIAdminNotification 属性下注册。 这是多值 Unicode 字符串值,其中每个值都需要以下格式:
<order number>,<CLSID>
“<订单号>”是一个无符号数字,表示处理程序在确认对话框中的位置。 显示确认对话框时,将使用每个值的“<订单号>”的比较对值进行排序。 如果多个值具有相同的“<订单号>”,则这些处理程序以从 Active Directory 服务器读取的顺序显示。 非现有值(即属性中的其他值不使用)应尽可能使用“<订单号>”。 没有规定的起始位置,空白可以出现在“<订单号>”序列中。
“<CLSID>”是由 StringFromCLSID 函数生成的 CLSID 的字符串表示形式。