程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> sqlserver結合AD查詢LYNC用戶活動信息

sqlserver結合AD查詢LYNC用戶活動信息

編輯:關於SqlServer
 

本文將介紹通過在SQL Server中結合AD信息與Lync存檔數據庫查詢用戶注冊會話等信息。

【正文】

一、    在SQL Server中查詢AD信息

1.1   要通過SQL Server查詢AD信息,需要先創建鏈接服務器,服務器對象—鏈接服務器—新建鏈接服務器


1.2   選擇訪問接口和填寫相關信息


1.3   在安全性頁面,選擇“使用此安全上下文建立連接”,輸入具有相應域權限賬戶與密碼;


1.4   當然以上的創建操作步驟也可以通過T-SQL語句去創建,語句如下:
--新建鏈接服務器ADSI
EXEC sp_addlinkedserver @server = 'ADSI', @srvproduct = 'Active Directory Services 2.5', @provider = 'ADSDSOObject', @datasrc = 'adsdatasource'
--添加登陸憑據
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'ADSI', @useself = 'False', @locallogin = null, @rmtuser = '{domain}\{user}', @rmtpassword = '{passowrd}'
 
1.5   創建了鏈接服務器後,就可以查詢AD的信息,下面的實例查詢出具有SIP地址的AD用戶的顯示名稱、部門、SIP地址信息;
--查詢AD信息
SELECT displayName AS 顯示名稱, department AS 部門, [msRTCSIP-PrimaryUserAddress] COLLATE Latin1_General_CI_AI AS SIP地址
FROM OPENQUERY(ADSI,
'SELECT displayName, msRTCSIP-PrimaryUserAddress, department FROM ''LDAP://DC=canway,DC=net''WHERE objectClass = ''user'' AND msRTCSIP-PrimaryUserAddress = ''*'' ')

1.6   寫這麼長的語句去查詢是不太方便的,所以一般情況下都是不會通過這種方式去查詢,都是通過創建一個視圖,通過查詢視圖來查詢AD信息,以下語句將創建一個視圖:
        
--創建視圖
CREATE VIEW LyncUsers
AS
SELECT displayName AS 顯示名稱, department AS 部門, [msRTCSIP-PrimaryUserAddress] COLLATE Latin1_General_CI_AI AS SIP地址
FROM OPENQUERY(ADSI,
'SELECT displayName, msRTCSIP-PrimaryUserAddress, department FROM ''LDAP://DC=canway,DC=net''WHERE objectClass = ''user'' AND msRTCSIP-PrimaryUserAddress = ''*'' ')
   

1.7  在實際環境中,可能會由於組織中的AD用戶較多導致出現以下提示“無法從鏈接服務器 "ADSI" 的 OLE DB 訪問接口"ADSDSOObject"提取行。” 如下圖:

1.8   出現此問題的原因是,LDAPAdminLimits 屬性的 MaxPageSize 值用於控制執行 LDAP 查詢時可以返回的記錄數。默認值為 1000 個記錄。如果要返回多於 1000 個的項,則 Active Directory 將檢測到該最大值,並且不返回任何內容。如果是SqlServer2005的話會顯示查詢結果中的前1000條,如果是2008的話是901條;

1.9   要解決此問題有2種解決方式:
1.    修改MaxPageSize 值
a)      在 Ntdsutil.exe 命令提示符處,鍵入 LDAP policies
b)     在 LDAP 策略命令提示符處,鍵入 connections
c)      在服務器連接命令提示符處,鍵入 connect to server <服務器的 DNS 名稱>,連接到當前使用的服務器。
d)     在服務器連接命令提示符處,鍵入 q
e)     在 LDAP 策略命令提示符處,鍵入 Show Values,查看當前MaxPageSize 值
 

f)      在 Ntdsutil.exe 命令提示符處,鍵入 LDAP policies
g)     在 LDAP 策略命令提示符處,鍵入 Set MaxPageSize to 1000
h)     可以使用 Show Values 命令來驗證更改。
i)       要保存更改,請使用 Commit Changes。

2.     創建多個視圖
a)      可以根據OU或者部門屬性等,為每個部門創建一個視圖,這樣返回的結果就不會達到LDAPAdminLimits 屬性的 MaxPageSize 值限制;
 

二、  與AD信息結合查詢LYNC數據

1、以下的實例,將查詢視圖[LcsCDR].[dbo].[RegistrationView]、[LcsCDR].[dbo].[LyncUsers_ZOH_04]來獲取用戶注冊信息,視圖[LcsCDR].[dbo].[RegistrationView]為CDR默認的視圖存儲有關用戶注冊的信息;[LcsCDR].[dbo].[LyncUsers_ZOH_04]視圖是筆者創建的AD信息視圖;

-- 查詢用戶注冊信息
SELECT TOP 1000
          [UserUri] AS 注冊用戶URL
         ,Displayname AS 注冊用戶顯示名稱
         ,[RegisterTime]  AS 注冊時間
         ,[DeRegisterTime] AS 取消注冊時間
      ,[ClientVersion] AS 客戶端版本
      ,[IpAddress] AS IP地址
      ,[Registrar] AS 注冊器的FQDN
      ,[Pool] AS 池
      ,[IsInternal] AS 是否內部登陸
FROM [LcsCDR].[dbo].[RegistrationView]
INNER JOIN [LcsCDR].[dbo].[LyncUsers_ZOH_04]
ON   'sip:'+ [LcsCDR].[dbo].[RegistrationView].UserUri =[LcsCDR].[dbo].[LyncUsers_ZOH_04].SipAddress
 

2、下面的實例將結合多個表和視圖查詢LYNC用戶撥打電話的記錄: --查詢LYNC用戶撥打電話記錄
SELECT TOP (100) PERCENT SessionDetails.FromUri, SessionDetails.ToUri, SessionDetails.InviteTime, SessionDetails.ResponseTime, SessionDetails.EndTime,
LcsCDR.dbo.Gateways.Gateway AS 網關, [LcsCDR].[dbo].[LyncUsers_ZOH_04].Displayname AS 顯示名稱, [LcsCDR].[dbo].[LyncUsers_ZOH_04].Department AS 部門, DATEDIFF(ss,
SessionDetails.ResponseTime, SessionDetails.EndTime) AS 時間_秒
FROM LcsCDR.dbo.SessionDetailsView AS SessionDetails INNER JOIN
LcsCDR.dbo.VoipDetails ON SessionDetails.SessionIdTime = LcsCDR.dbo.VoipDetails.SessionIdTime INNER JOIN
LcsCDR.dbo.Gateways ON LcsCDR.dbo.VoipDetails.ToGatewayId = LcsCDR.dbo.Gateways.GatewayId RIGHT OUTER JOIN
[LcsCDR].[dbo].[LyncUsers_ZOH_04] ON 'sip:' + SessionDetails.FromUri = [LcsCDR].[dbo].[LyncUsers_ZOH_04].SipAddress
WHERE (SessionDetails.MediaTypes = 16) AND (SessionDetails.FromUriType = N'UserUri') AND (SessionDetails.ToUriType = N'PhoneUri') AND
(SessionDetails.ResponseCode = 200)
ORDER BY SessionDetails.InviteTime

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved