[英]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查詢數據庫”是什么意思,但如果您想知道確切的數據類型,有兩種方法:
如果您至少使用SQL Server 2012,則可以嘗試sp_describe_first_result_set 。 它有幾個限制因此不適用於所有情況。
您可以將結果轉儲到臨時表,然后檢查其結構:
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.