<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SQL, Analysis Services &amp; related stories. : SQL CLR</title><link>http://blogs.msdn.com/ikovalenko/archive/tags/SQL+CLR/default.aspx</link><description>Tags: SQL CLR</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>How to avoid 1000 rows limitation when querying active directory (AD) from SQL 2005 with using custom code.</title><link>http://blogs.msdn.com/ikovalenko/archive/2007/03/22/how-to-avoid-1000-rows-limitation-when-querying-active-directory-ad-from-sql-2005-with-using-custom-code.aspx</link><pubDate>Thu, 22 Mar 2007 14:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1930441</guid><dc:creator>Igor Kovalenko</dc:creator><slash:comments>20</slash:comments><comments>http://blogs.msdn.com/ikovalenko/comments/1930441.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ikovalenko/commentrss.aspx?PostID=1930441</wfw:commentRss><description>&lt;P&gt;As all of you know it is possible to query active directory from SQL Server with using ADSI provider as linked server. This solution works fine until you will have a lot of users in active directory. According to best practice guide&amp;nbsp;windows system engineers always configured AD to return no more then 1000 rows per one query. Of course you can avoid this limitation too (with using range keyword or some other ways, as for me require deep AD knowledge). Some other extremily complicated T-SQL scripts can be found in internet. My current post's goal is to show two main things: &lt;/P&gt;
&lt;P&gt;1. how to register a couple of assemblies (your own and related system assemblies) in SQL Server with UNSAFE permission&amp;nbsp;WITHOUT setting TRUSTWORTHY ON for your database according to best practice security guide. Security check will passed in this way according to certificate permissions.&lt;/P&gt;
&lt;P&gt;2. how to create a simple CLR procedures&amp;nbsp;for quirying AD as any other SQL datasource without creating linked server.&lt;/P&gt;
&lt;P&gt;You can find MSADHelper2.rar project attached. It contains project files; you can extract MSADHelper.dll assembly from here, or build a new one by yourself (in that case please generate a new strong key, my is not included in project files). &lt;/P&gt;
&lt;P&gt;P.S. I am not an expert in C#, so you can improve this source as you wish to add some dispose or other required methods.&lt;/P&gt;
&lt;P&gt;Here is installation script:&lt;/P&gt;
&lt;P&gt;SET NOCOUNT ON&lt;BR&gt;GO&lt;BR&gt;USE Master&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;--sp_configure 'clr enabled', 1&lt;BR&gt;--reconfigure with override&lt;/P&gt;
&lt;P&gt;--ALTER DATABASE&amp;nbsp;&amp;lt;your_database_name&amp;gt; SET TRUSTWORTHY OFF&lt;BR&gt;--GO&lt;/P&gt;
&lt;P&gt;-- create keys from assembly&amp;nbsp;&lt;/P&gt;
&lt;P&gt;CREATE ASYMMETRIC KEY MSADHelperAsKey FROM EXECUTABLE FILE = 'C:\distrib\ADSI\MSADHelper2.dll' --&amp;nbsp;specify correct path here.&lt;BR&gt;GO&lt;BR&gt;CREATE ASYMMETRIC KEY SystemDirectoryServicesKey FROM EXECUTABLE FILE = 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.DirectoryServices.dll' &lt;BR&gt;GO&lt;BR&gt;--SELECT * FROM sys.asymmetric_keys&lt;BR&gt;--GO&lt;/P&gt;
&lt;P&gt;-- create logins for special goals&lt;BR&gt;CREATE LOGIN SQLCLRHelperLogin FROM ASYMMETRIC KEY MSADHelperAsKey&lt;BR&gt;GO&lt;BR&gt;CREATE LOGIN SQLCLRSysDirServLogin FROM ASYMMETRIC KEY SystemDirectoryServicesKey&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- grant necessary (UNSAFE) permissions&lt;BR&gt;GRANT UNSAFE ASSEMBLY TO SQLCLRHelperLogin &lt;BR&gt;GO &lt;BR&gt;GRANT UNSAFE ASSEMBLY TO SQLCLRSysDirServLogin &lt;BR&gt;GO &lt;/P&gt;
&lt;P&gt;-----------------------------------------------------------------------&lt;BR&gt;---&lt;BR&gt;--- **************************************************************&lt;BR&gt;---&lt;BR&gt;-----------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;USE&amp;nbsp;&amp;lt;your_database_name&amp;gt;&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;CREATE&amp;nbsp;ASSEMBLY [System.DirectoryServices]&lt;BR&gt;FROM&amp;nbsp;'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.DirectoryServices.dll'&lt;BR&gt;WITH&amp;nbsp;PERMISSION_SET = UNSAFE&lt;BR&gt;GO&lt;BR&gt;CREATE&amp;nbsp;ASSEMBLY [MsForClient.SqlServer.SqlClrToolkit.MSADHelper]&lt;BR&gt;FROM&amp;nbsp;'C:\distrib\ADSI\MSADHelper2.dll' -- please specify correct path here&lt;BR&gt;WITH&amp;nbsp;PERMISSION_SET = UNSAFE&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;--Have a look at the assembly within the database&lt;BR&gt;--SELECT * FROM sys.assemblies&lt;BR&gt;--SELECT * FROM sys.assembly_files&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;--Create&amp;nbsp;procedures from the assembly&lt;/P&gt;
&lt;P&gt;-- return list of registered providers (from registry)&lt;BR&gt;CREATE&amp;nbsp;PROCEDURE dbo.usp_GetListOfRegisteredDirectoryProviders&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_GetListOfRegisteredDirectoryProviders&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- test methods - is it possible to create AD object?&amp;nbsp;&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_TryAuthenticate(@pAdsiPath nvarchar(4000), @pSecure int)&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_TryAuthenticate&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- by default any method will execute under SQL Server Service account. If this account don't have enought privileges - please specify another one as @pUserName and &lt;/P&gt;
&lt;P&gt;-- @pPassword to access AD&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_TryAuthenticateAsUser(@pAdsiPath nvarchar(4000), @pUserName sysname, @pPassword nvarchar(100), @pSecure int)&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_TryAuthenticateAsUser&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- enum AD structure - be carefull, to much info!&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_FillInfoByPath(@pAdsiPath nvarchar(4000), @pUserName sysname, @pPassword nvarchar(100), @pSecure int)&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_FillInfoByPath&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- get AD object properties&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_GetNodeProperties(@pAdsiPath nvarchar(4000), @pUserName sysname, @pPassword nvarchar(100), @pSecure int)&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_GetNodeProperties&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- extract user list&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_GetUserList(@pAdsiPath nvarchar(4000), @pOutputFieldList NVarChar(2000), @pUserName sysname, @pPassword nvarchar(100), @pSecure int, @pScope nvarchar(10))&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_GetUserList&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- extract group list&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_GetGroupList(@pAdsiPath nvarchar(4000), @pOutputFieldList NVarChar(2000), @pUserName sysname, @pPassword nvarchar(100), @pSecure int, @pScope nvarchar(10))&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_GetGroupList&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- extract list of computers&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_GetComputerList(@pAdsiPath nvarchar(4000), @pOutputFieldList NVarChar(2000), @pUserName sysname, @pPassword nvarchar(100), @pSecure int, @pScope nvarchar(10))&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_GetComputerList&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- extract members of AD group&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_GetGroupMembers(@pAdsiPath nvarchar(4000), @pOutputFieldList NVarChar(2000), @pUserName sysname, @pPassword nvarchar(100), @pSecure int)&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_GetGroupMembers&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- enum user membership&lt;/P&gt;
&lt;P&gt;CREATE PROCEDURE dbo.usp_GetUserMembership(@pAdsiPath nvarchar(4000), @pOutputFieldList NVarChar(2000), @pUserName sysname, @pPassword nvarchar(100), @pSecure int)&lt;BR&gt;AS EXTERNAL NAME [MsForClient.SqlServer.SqlClrToolkit.MSADHelper].[MsForClient.SqlServer.SqlClrToolkit.MSADHelper].usp_GetUserMembership&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- execute &amp;amp; test section&lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_GetListOfRegisteredDirectoryProviders&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- try to check - if net framework carefully installed and AD objects created without any issue&lt;BR&gt;DECLARE @pStr nvarchar(4000)&lt;BR&gt;SET @pStr = N'LDAP://DC=HQ,DC=corp,DC=xxxxxxxx,DC=ru'&lt;BR&gt;EXEC dbo.usp_TryAuthenticate @pStr, 1&lt;BR&gt;GO&lt;BR&gt;-- try to run under another account&lt;/P&gt;
&lt;P&gt;DECLARE @pStr nvarchar(4000), @pUserName sysname, @pPassword nvarchar(100)&lt;BR&gt;SELECT @pStr = N'LDAP://DC=HQ,DC=corp,DC=xxxxxxxx,DC=ru', @pUserName = N'SQLSvc', @pPassword = N'xxxxxxx'&lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_TryAuthenticateAsUser @pStr, @pUserName, @pPassword, 1&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- extract AD info as relational tree (use ID &amp;amp; ParentID to build object tree)&lt;BR&gt;DECLARE @pStr nvarchar(4000), @pUserName sysname, @pPassword nvarchar(100)&lt;BR&gt;SET @pStr = N'LDAP://DC=HQ,DC=corp,DC=xxxxxxx,DC=ru'&lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_FillInfoByPath @pStr, @pUserName, @pPassword, 0&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;--- get all properites of object&lt;BR&gt;DECLARE @pStr nvarchar(4000), @pUserName sysname, @pPassword nvarchar(100)&lt;BR&gt;--SET @pStr = N'LDAP://CN=User01,CN=Users,DC=HQ,DC=corp,DC=xxxxxxx,DC=ru'&lt;BR&gt;SET @pStr = N'LDAP://CN=Domain Admins,CN=Users,DC=HQ,DC=corp,DC=xxxxxxxxxx,DC=ru'&lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_GetNodeProperties @pStr, @pUserName, @pPassword, 0&lt;BR&gt;GO&lt;BR&gt;---- get user list and attributes&lt;/P&gt;
&lt;P&gt;DECLARE @pStr nvarchar(4000), @pOutputFieldList nvarchar(2000), @pUserName sysname, @pPassword nvarchar(100)&lt;BR&gt;-- to extract users from exact OU&lt;BR&gt;-- 'LDAP://OU=TestGroup,DC=HQ,DC=corp,DC=xxxxxxxx,DC=ru'&lt;BR&gt;-- all users from AD&lt;BR&gt;-- @pStr = N'LDAP://DC=HQ,DC=corp,DC=xxxxxxx,DC=ru'&lt;BR&gt;SELECT @pStr = N'LDAP://DC=HQ,DC=corp,DC=xxxxxxxxx,DC=ru', &lt;BR&gt;&amp;nbsp;@pOutputFieldList = 'cn,name,description,distinguishedName,whenChanged,primaryGroupID,memberOf', @pUserName = '', @pPassword = N''&lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_GetUserList @pStr, @pOutputFieldList, @pUserName, @pPassword, 0, 'Subtree'&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;---- extract group list&lt;BR&gt;DECLARE @pStr nvarchar(4000), @pOutputFieldList nvarchar(2000), @pUserName sysname, @pPassword nvarchar(100)&lt;BR&gt;-- to extract groups from exact group&lt;BR&gt;-- 'LDAP://CN=Domain Admins,CN=Users,DC=HQ,DC=corp,DC=xxxxxxx,DC=ru'&lt;BR&gt;-- all&amp;nbsp;groups from AD&lt;BR&gt;-- @pStr = N'LDAP://DC=HQ,DC=corp,DC=xxxxxx,DC=ru'&lt;BR&gt;SELECT @pStr = N'LDAP://DC=HQ,DC=corp,DC=xxxxxx,DC=ru', &lt;BR&gt;&amp;nbsp;@pOutputFieldList = 'cn,name,description,distinguishedName,whenChanged', @pUserName = '', @pPassword = N''&lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_GetGroupList @pStr, @pOutputFieldList, @pUserName, @pPassword, 0, 'Subtree'&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;---- get computer list&lt;BR&gt;DECLARE @pStr nvarchar(4000), @pOutputFieldList nvarchar(2000), @pUserName sysname, @pPassword nvarchar(100)&lt;BR&gt;SELECT @pStr = N'LDAP://DC=HQ,DC=corp,DC=xxxxxxxxx,DC=ru', &lt;BR&gt;&amp;nbsp;@pOutputFieldList = 'cn,name,distinguishedName,whenChanged', @pUserName = '', @pPassword = N''&lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_GetComputerList @pStr, @pOutputFieldList, @pUserName, @pPassword, 0, 'Subtree'&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;------- get group members&lt;BR&gt;DECLARE @pStr nvarchar(4000), @pOutputFieldList nvarchar(2000), @pUserName sysname, @pPassword nvarchar(100)&lt;BR&gt;--SELECT @pStr = N'LDAP://CN=Domain Admins,CN=Users,DC=HQ,DC=corp,DC=xxxxxxxxx,DC=ru', &lt;BR&gt;-- @pOutputFieldList = 'sAMAccountName'&lt;BR&gt;SELECT @pStr = N'LDAP://CN=Administrators,CN=Users,DC=HQ,DC=corp,DC=xxxxxxxxx,DC=ru', &lt;BR&gt;&amp;nbsp;@pOutputFieldList = 'Name', @pUserName = '', @pPassword = N'' &lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_GetGroupMembers @pStr, @pOutputFieldList, @pUserName, @pPassword, 0&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;----- enlist user membership&lt;BR&gt;DECLARE @pStr nvarchar(4000), @pOutputFieldList nvarchar(2000), @pUserName sysname, @pPassword nvarchar(100)&lt;BR&gt;SELECT @pStr = N'LDAP://CN=Administrator,CN=Users,DC=HQ,DC=corp,DC=xxxxxxxxx,DC=ru', &lt;BR&gt;&amp;nbsp;@pOutputFieldList = 'Name', @pUserName = '', @pPassword = N''&lt;/P&gt;
&lt;P&gt;EXEC dbo.usp_GetUserMembership @pStr, @pOutputFieldList, @pUserName, @pPassword, 0&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;-- Here is a&amp;nbsp;section of cleanup script&lt;/P&gt;
&lt;P&gt;USE &amp;lt;your_database_name&amp;gt;&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- delete procedures&lt;BR&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_GetListOfRegisteredDirectoryProviders]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_GetListOfRegisteredDirectoryProviders]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_TryAuthenticate]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_TryAuthenticate]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_TryAuthenticateAsUser]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_TryAuthenticateAsUser]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_FillInfoByPath]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_FillInfoByPath]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_GetNodeProperties]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_GetNodeProperties]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_GetUserList]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_GetUserList]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_GetGroupList]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_GetGroupList]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_GetComputerList]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_GetComputerList]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_GetGroupMembers]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_GetGroupMembers]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_GetUserMembership]') AND type in (N'P', N'PC'))&lt;BR&gt;&amp;nbsp;DROP PROCEDURE [dbo].[usp_GetUserMembership]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- delete assemblies&lt;BR&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'MsForClient.SqlServer.SqlClrToolkit.MSADHelper')&lt;BR&gt;&amp;nbsp;DROP ASSEMBLY [MsForClient.SqlServer.SqlClrToolkit.MSADHelper]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'System.DirectoryServices')&lt;BR&gt;&amp;nbsp;DROP ASSEMBLY [System.DirectoryServices]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;USE Master&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- drop logins&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.server_principals WHERE name = N'SQLCLRSysDirServLogin')&lt;BR&gt;&amp;nbsp;DROP LOGIN [SQLCLRSysDirServLogin]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF&amp;nbsp; EXISTS (SELECT * FROM sys.server_principals WHERE name = N'SQLCLRHelperLogin')&lt;BR&gt;&amp;nbsp;DROP LOGIN [SQLCLRHelperLogin]&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- drop keys&amp;nbsp;&lt;/P&gt;
&lt;P&gt;IF EXISTS(SELECT * FROM sys.asymmetric_keys WHERE [name] = 'MSADHelperAsKey')&lt;BR&gt;&amp;nbsp;DROP ASYMMETRIC KEY MSADHelperAsKey&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;IF EXISTS(SELECT * FROM sys.asymmetric_keys WHERE [name] = 'SystemDirectoryServicesKey')&lt;BR&gt;&amp;nbsp;DROP ASYMMETRIC KEY SystemDirectoryServicesKey&lt;BR&gt;GO&lt;/P&gt;
&lt;P&gt;-- Seems to me finished :-)&lt;/P&gt;
&lt;P&gt;Dec 08, 2007 :&lt;/P&gt;
&lt;P&gt;i updated source code to fix bug - many thanks to &lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: RU; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;Taylor Gerring &lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1930441" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/ikovalenko/attachment/1930441.ashx" length="77398" type="application/octet-stream" /><category domain="http://blogs.msdn.com/ikovalenko/archive/tags/TSQL/default.aspx">TSQL</category><category domain="http://blogs.msdn.com/ikovalenko/archive/tags/SQL+Server+2005+Security/default.aspx">SQL Server 2005 Security</category><category domain="http://blogs.msdn.com/ikovalenko/archive/tags/SQL+Server+2005+Administration/default.aspx">SQL Server 2005 Administration</category><category domain="http://blogs.msdn.com/ikovalenko/archive/tags/SQL+CLR/default.aspx">SQL CLR</category></item></channel></rss>