簡體   English   中英

在SQL Server中存儲和檢索Active Directory objectGUID

[英]Storing and retrieving Active Directory objectGUID in SQL Server

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

我可以使用本教程中的步驟連接到AD http://sql.dzone.com/news/querying-active-directory-thro

我可以檢索objectGUID和我需要的任何其他東西,但我不知道如何將objectGUID存儲在數據庫中或如何使用objectGUID查詢數據庫。

我認為這是數據類型(128長度字節數組?),需要轉換,但我不知道該怎么做。

從活動目錄中選擇記錄並插入表中顯示插入的數據類型objectGUID as varbinary(256)

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

為了測試,我嘗試使用從上面的temp_table中檢索到的objectGUID來查詢AD。

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 = ''''+@var+''''   
    ORDER BY displayName
'')'

exec(@qry)

不返回任何行...

最初我認為這是帶引號的正確語法

where objectGUID = '+@var+'

但是返回了一個錯誤:數據類型的運算符無效。 運算符等於add,鍵入equals varchar

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

提前致謝。

要在單個查詢中從AD檢索數據,當您要求特定對象GUID或多個GUID時,有一種方法可以使用where子句而不是from LDAP://<GUID=your guid>表達式(在這種情況下非常方便)查詢單個GUID)。

您的查詢的where子句中的Active Directory對象的GUID必須具有字符串形式,其中GUID的每個字節以十六進制表示法開頭,后面是反斜杠符號:

\1B\C1\93\F8\25\32\72\4E\8B\48\48\62\BB\44\49\7A

例如,您有GUID: F893C11B-3225-4E72-8B48-4862BB44497A 首先,您必須將其轉換為binary(16)類型(長度為16的字節數組),然后轉換為十六進制字符串,最后插入反斜杠,如上例所示:

declare @g uniqueidentifier = 'F893C11B-3225-4E72-8B48-4862BB44497A';
declare @gs nvarchar(max);

set @gs = CONVERT(nvarchar(max), CONVERT(binary(16), @g), 2);

declare @c int = 16;
while @c > 0
begin
set @c = @c - 1;
set @gs = STUFF(@gs, (2 * @c) + 1, 0, '\');
end;

declare @q nvarchar(max) = 
'select * from openquery(AD, 
'' select cn from ''''LDAP://DC=domain,DC=com'''' 
where objectGUID = ''''' + @gs + '''''  
'')';

exec(@q);

上面的代碼創建了以下查詢:

select * from openquery(AD, 'select cn from ''LDAP://DC=domain,DC=com'' where objectGUID = ''\1B\C1\93\F8\25\32\72\4E\8B\48\48\62\BB\44\49\7A'' ')

你在TSQL中嘗試過CAST還是CONVERT http://msdn.microsoft.com/en-us/library/ms187942.aspx有幾個例子。

目前還不清楚“如何使用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);

我也在我的項目中將AD中的objectGUID存儲到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...')

我無法在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM