将本地广告与C#.Net网络表单连接

将本地广告与C#.Net网络表单连接,c#,asp.net,active-directory,C#,Asp.net,Active Directory,在vs.net中无法理解下面的错误。 我正在尝试在域中获取一个已登录的用户帐户,并允许他们编辑自己的电话号码 另一个人设置了广告访问,但我无法获取登录的用户名 每次都粘贴代码VS.NET错误,但我在一篇在线文章中发现的例外情况除外,我为除我之外的所有人工作 我已经用powershell验证了它的有效性,但我需要一些帮助 谢谢 //parse the current user's logon name as search key string sFilter = Strin

在vs.net中无法理解下面的错误。 我正在尝试在域中获取一个已登录的用户帐户,并允许他们编辑自己的电话号码

另一个人设置了广告访问,但我无法获取登录的用户名

每次都粘贴代码VS.NET错误,但我在一篇在线文章中发现的例外情况除外,我为除我之外的所有人工作

我已经用powershell验证了它的有效性,但我需要一些帮助

谢谢

//parse the current user's logon name as search key
            string sFilter = String.Format(
                "(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))",
                User.Identity.Name.Split(new char[] { '\\' })[1]
                );

Exception User-Unhandled
System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

静态字符串adsPath=“LDAP://dc=DOMAIN,dc=com”;
私有无效页面加载(对象发送方,System.EventArgs e)
{
如果(!Page.IsPostBack)
{
SearchResult sr=FindCurrentUser(新字符串[]{“allowedAttributesEffective”});
if(sr==null)
{
msg.Text=“未找到用户…”;
返回;
}
int count=sr.Properties[“allowedAttributesEffective”].count;
如果(计数>0)
{
int i=0;
string[]effectiveAttributes=新字符串[计数];
foreach(sr.Properties[“allowedAttributesEffective”]中的字符串attrib)
{
effectiveAttributes[i++]=attrib;
}
sr=FindCurrentUser(有效属性);
foreach(有效属性中的字符串键)
{
string val=string.Empty;
if(sr.Properties.Contains(键))
{
val=sr.Properties[key][0].ToString();
}
GenerateControl(键、值、父项);
}
}
}
其他的
{
updateControl();
}
}
私有搜索结果FindCurrentUser(字符串[]attribsToLoad)
{
//将当前用户的登录名解析为搜索键
string sFilter=string.Format(
“(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))”,
User.Identity.Name.Split(新字符[]{\\})[1]
);
DirectoryEntry searchRoot=新的DirectoryEntry(
adsPath,
无效的
无效的
身份验证类型。安全
);
使用(searchRoot)
{
DirectorySearcher ds=新的DirectorySearcher(
搜索根,
斯菲尔特,
attribsToLoad,
SearchScope.子树
);
ds.SizeLimit=1;
返回ds.FindOne();
}
}
私有void GenerateControls(字符串属性、字符串值、控件父级)
{
parent.Controls.Add(新的LiteralControl(“”);
TextBox t=新的TextBox();
t、 ID=“c_”+attrib;
t、 Text=val;
t、 CssClass=“txt”;
标签l=新标签();
l、 Text=attrib;
l、 AssociatedControlID=t.ID;
l、 CssClass=“lbl”;
父控件。添加(l);
父控件添加(t);
parent.Controls.Add(新的LiteralControl(“”);
}
私有void updateControl()
{
SearchResult sr=FindCurrentUser(新字符串[]{“cn”});
如果(sr!=null)
{
使用(DirectoryEntry user=sr.GetDirectoryEntry())
{
foreach(Request.Form.AllKeys中的字符串键)
{
if(带(“c”)的启动键)
{
string attrib=key.Split(新字符[]{'.'})[1];
字符串val=Request.Form[key];
如果(!String.IsNullOrEmpty(val))
{
Write(“将{0}更新为{1}
”,attrib,val); user.Properties[attrib].Value=val; } } } user.CommitChanges(); } } btnSubmit.Visible=false; Response.Output.Write(“

”,Request.Url); } .lbl { 左边距:25px; 清除:左; 宽度:250px; } .txt { 宽度:250px; } 用户数据:


为什么[1]?字符串sFilter=string.Format((&(objectClass=user)(objectCategory=person)(sAMAccountName={0})),user.Identity.Name.Split(新字符[]{'\\'})[1]);我不知道。。。在没有它的情况下尝试,一个尝试了它,但在代码中发现了另一个s:(很好,尝试一下,虽然很抱歉,我真的很糟糕。你能键入你想要进行的编辑吗?调试器为User.Identity.Name显示了什么?你正在尝试通过//分隔符将其拆分为字符串数组。然后获取该数组的第二个元素。如果User.Identity.Name不包含//你将没有任何第二个元素,并获得错误信息。)越来越
<%@ Import Namespace="System.DirectoryServices.ActiveDirectory" %>
<%@ Import Namespace="System.DirectoryServices.AccountManagement" %>

<!DOCTYPE html>

<head>

<script language="c#" runat="server">

static string adsPath = "LDAP://dc=DOMAIN,dc=com";
        private void Page_Load(object sender, System.EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                SearchResult sr = FindCurrentUser(new string[] { "allowedAttributesEffective" });
                if (sr == null)
                {
                    msg.Text = "User not found...";
                    return;
                }
                int count = sr.Properties["allowedAttributesEffective"].Count;
                if (count > 0)
                {
                    int i = 0;
                    string[] effectiveAttributes = new string[count];
                    foreach (string attrib in sr.Properties["allowedAttributesEffective"])
                    {
                        effectiveAttributes[i++] = attrib;
                    }
                    sr = FindCurrentUser(effectiveAttributes);
                    foreach (string key in effectiveAttributes)
                    {
                        string val = String.Empty;
                        if (sr.Properties.Contains(key))
                        {
                            val = sr.Properties[key][0].ToString();
                        }
                        GenerateControls(key, val, parent);
                    }
                }
            }
            else
            {
                UpdateControls();
            }
        }
        private SearchResult FindCurrentUser(string[] attribsToLoad)
        {
            //parse the current user's logon name as search key
            string sFilter = String.Format(
                "(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))",
                User.Identity.Name.Split(new char[] { '\\' })[1]
                );
            DirectoryEntry searchRoot = new DirectoryEntry(
                adsPath,
                null,
                null,
                AuthenticationTypes.Secure
                );
            using (searchRoot)
            {
                DirectorySearcher ds = new DirectorySearcher(
                    searchRoot,
                    sFilter,
                    attribsToLoad,
                    SearchScope.Subtree
                    );
                ds.SizeLimit = 1;
                return ds.FindOne();
            }
        }
        private void GenerateControls(string attrib, string val, Control parent)
        {
            parent.Controls.Add(new LiteralControl("<div>"));
            TextBox t = new TextBox();
            t.ID = "c_" + attrib;
            t.Text = val;
            t.CssClass = "txt";
            Label l = new Label();
            l.Text = attrib;
            l.AssociatedControlID = t.ID;
            l.CssClass = "lbl";
            parent.Controls.Add(l);
            parent.Controls.Add(t);
            parent.Controls.Add(new LiteralControl("</div>"));
        }
        private void UpdateControls()
        {
            SearchResult sr = FindCurrentUser(new string[] { "cn" });
            if (sr != null)
            {
                using (DirectoryEntry user = sr.GetDirectoryEntry())
                {
                    foreach (string key in Request.Form.AllKeys)
                    {
                        if (key.StartsWith("c_"))
                        {
                            string attrib = key.Split(new char[] { '_' })[1];
                            string val = Request.Form[key];
                            if (!String.IsNullOrEmpty(val))
                            {
                                Response.Output.Write("Updating {0} to {1}<br>", attrib, val);
                                user.Properties[attrib].Value = val;
                            }
                        }
                    }
                    user.CommitChanges();
                }
            }
            btnSubmit.Visible = false;
            Response.Output.Write("<br><br><a href=\"{0}\">&lt;&nbsp;Back</a>", Request.Url);
        }
    </script>
    <style>
    .lbl
    {
        margin-left: 25px;
        clear: left;
        width: 250px;
    }
    .txt
    {
        width: 250px;
    }
</style>
</head>


<body>
    <form id="main" runat="server">
        Data for user:
        <%=User.Identity.Name%>
        <br>
        <br>
        <asp:Label ID="msg" runat="server" />
        <asp:Panel ID="parent" runat="server" />
        <asp:Button ID="btnSubmit" runat="server" Text="Update" />
    </form>
</body>
</html>