2014-11-24 50 views
2

我已經接近完成這項工作。我需要在我們的Intranet上識別用戶。我需要將該用戶的objectGUID存儲在SQL Server數據庫表中,並能夠再次檢索該記錄。我有幾個不同的應用程序,PHP,ASP Classic和ASP.Net。我認爲在SQL Server中執行AD查找可能是最簡單的。在SQL Server中存儲和檢索Active Directory objectGUID

我能夠通過使用本教程中的步驟http://sql.dzone.com/news/querying-active-directory-thro

我可以檢索objectGUID和其他任何我需要連接到廣告,但我不知道如何將objectGUID存儲在數據庫中或如何使用objectGUID查詢數據庫。我認爲這是數據類型(128長度字節數組?),需要轉換,但我不知道如何去做。

選擇從活動目錄的記錄,並插入到表示出了插入的objectGUID爲varbinary(256)的數據類型

select * 
into temp_table 
from openquery(adsi, ' 
select givenName, 
       sn, 
       sAMAccountName, 
       objectGUID    
from ''LDAP://dc=somedomain,dc=com'' 
where sAMAccountName = ''some_user'' 
') 

只是爲了測試,我試圖詢問與AD的objectGUID從上方temp_table檢索。

declare @qry varchar(8000) 
declare @var varbinary(256) 
set @var = (SELECT objectGUID from temp_table) 
set @qry = 'select * 
from openquery(ADSI, '' 
    select 
    givenName, 
    sn, 
    sAMAccountName 
    from ''''LDAP://DC=somedomain,DC=com'''' 
    where objectGUID = ''''[email protected]+'''' 
    ORDER BY displayName 
'')' 

exec(@qry) 

不返回行...

起初我以爲這是用引號

where objectGUID = '[email protected]+' 

正確的語法,但返回了一個錯誤:無效的運算符的數據類型。運算符等於add,類型等於varchar

因此,也許我接近錯誤的語法,或仍然是數據類型問題?

在此先感謝。

回答

0

我無法在where子句中使用的objectGUID,但我沒有找到,我可以直接綁定到的objectGUID這給我同樣的最終結果。

DECLARE @qry varchar(8000) 
DECLARE @ObjectGUID uniqueIdentifier 

SET @ObjectGUID = (SELECT objectGUID FROM temp_table) 

SET @qry = 'select * 
FROM openquery(ADSI, '' 
    SELECT givenName, 
       sn, 
       sAMAccountName, 
       objectGUID    
from ''''LDAP://<GUID=' + CAST(@ObjectGUID as CHAR(36)) + '>'''' 
'')' 

EXEC(@qry) 
0

目前還不清楚你所說的「如何查詢使用的objectGUID數據庫」的意思,但如果你想知道確切的數據類型,有兩種方式:

  1. 如果您正在使用至少SQL Server 2012,那麼你可以試試sp_describe_first_result_set。它有幾個限制,所以在所有情況下都不起作用。

  2. 你可以轉儲結果到一個臨時表,然後檢查其結構:

    SELECT fields 
    INTO #tmp 
    FROM openquery(...); 
    
    EXEC tempdb.dbo.sp_help '#tmp'; 
    

使用返回任何數據類型(可能BINARY(128)VARBINARY(128))創建存儲的值或者列時聲明局部變量。

編輯:
所以我們現在知道,objectGUID是VARBINARY(256)。爲了在查詢中正確使用它,請從已轉義字符串中的已轉義字符串中刪除三組單引號。另外,我們需要將VARBINARY轉換爲VARCHAR,以便它可以連接到動態SQL字符串中。當使用CONVERT函數時,請務必使用「樣式」編號1,它將十六進制數字轉換爲十六進制數字(即「0x12D5」);如果不指定「樣式」,則默認操作是將其轉換爲由那些十六進制數字表示的字符(即「Hello!」)。

DECLARE @Query VARCHAR(8000), 
     @ObjectGUID VARBINARY(256); 

SELECT @ObjectGUID = objectGUID 
FROM temp_table; 

SET @Query = 'SELECT * 
FROM OPENQUERY(ADSI, '' 
    SELECT 
    givenName, 
    sn, 
    sAMAccountName 
    FROM ''''LDAP://DC=somedomain,DC=com'''' 
    WHERE objectGUID = ' + CONVERT(VARCHAR(300), @ObjectGUID, 1) + ' 
    ORDER BY displayName; 
'')'; 

PRINT @Query; -- see what SQL is being executed 
EXEC(@Query); 
+0

謝謝你的回覆,我在後期編輯的詳細信息... – user1633947 2014-11-25 14:02:38

+0

@ user1633947您包括變量時有太多的報價。價值本身並沒有被引用。您有4個單引號可以轉換爲2個單引號,但它已經在一個字符串中,因此等同於字符串中的轉義引號。意思是說,你沒有包含'@ var'的值,而是在說'WHERE objectGUID ='+ @ var +'',它正在尋找「+ @ var +」的字符串文字。我用更正的語法更新了我的答案。 – 2014-11-25 15:06:04

0

我也存儲objectGUID從AD到SQL服務器在我的項目中,我使用uniqueidentifier。 (但是我沒有使用OpenQuery,而是使用Windows服務來從AD始終同步並填充數據庫。)

雖然從AD objectGUID獲取時顯示爲二進制數組(varbinary),
它實際上代表一個GUID,SQL中的相應類型是uniqueidentifier。
而GUID只有16字節(128位)。

這不是測試,但請嘗試是這樣的:

Select CONVERT(uniqueIdentifier,objectGUID) as Id, ... 
FROM OpenQuery(ADSI, 
    'SELECT objectGUID, ... 
    FROM ... 
    WHERE...') 
+0

那麼,現在你提到它聽起來很不明顯;-)。它一定是太累了,並沒有拿起名字的「GUID」部分(是的,我正在那裏)。如果這個工作,我會+1。 – 2014-11-25 17:14:18

相關問題