C# 举个例子?若我这样做,我会得到一个错误消息443,在function@rudash04正确,这不能在函数中完成。它需要封装在存储过程中。如果您有一个列表,那么您需要使用游标在列表上迭代,并为每个值调用存储过程。我甚至尝试使用一个带有链接到ADSI的服务器的

C# 举个例子?若我这样做,我会得到一个错误消息443,在function@rudash04正确,这不能在函数中完成。它需要封装在存储过程中。如果您有一个列表,那么您需要使用游标在列表上迭代,并为每个值调用存储过程。我甚至尝试使用一个带有链接到ADSI的服务器的,c#,sql-server-2008,active-directory,sqlclr,udf,C#,Sql Server 2008,Active Directory,Sqlclr,Udf,举个例子?若我这样做,我会得到一个错误消息443,在function@rudash04正确,这不能在函数中完成。它需要封装在存储过程中。如果您有一个列表,那么您需要使用游标在列表上迭代,并为每个值调用存储过程。我甚至尝试使用一个带有链接到ADSI的服务器的存储过程和openquery,但这只能作为动态sql工作,因为我需要注入组和用户,因为我们有一个包含许多组和用户的巨大广告。链接到ADSI的服务器能工作吗?通过创建包含整个OPENQUERY调用的动态SQL,然后执行它,您可以绕过OPENQUE


举个例子?若我这样做,我会得到一个错误消息443,在function@rudash04正确,这不能在函数中完成。它需要封装在存储过程中。如果您有一个列表,那么您需要使用游标在列表上迭代,并为每个值调用存储过程。我甚至尝试使用一个带有链接到ADSI的服务器的存储过程和openquery,但这只能作为动态sql工作,因为我需要注入组和用户,因为我们有一个包含许多组和用户的巨大广告。链接到ADSI的服务器能工作吗?通过创建包含整个OPENQUERY调用的动态SQL,然后执行它,您可以绕过
OPENQUERY的动态SQL限制。。你是怎么说我可以超越dyn sql限制的?你们有一个例子吗?若我这样做的话,我会得到一个错误消息443,一个影响操作符“执行字符串”的一方的无效使用function@rudash04正确,这不能在函数中完成。它需要封装在存储过程中。如果您有一个列表,则需要使用游标在列表上迭代,并为每个值调用存储过程。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.DirectoryServices.AccountManagement;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlInt32 check_user_is_part_of_ad_grp(SqlString ad_usr, SqlString ad_grp)
    {
        bool bMemberOf = false;

        // set up domain context
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

        // find the group in question
        GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, ad_grp.ToString());
        UserPrincipal usr = UserPrincipal.FindByIdentity(ctx, ad_usr.ToString());

        if (group != null && usr != null)
        {
            bMemberOf = usr.IsMemberOf(group);
        }

        // Put your code here
        return new SqlInt32 (bMemberOf ? 1 : 0);
    }
}
select dbo.check_user_is_part_of_ad_grp('user', 'group')