将本地广告与C#.Net网络表单连接
在vs.net中无法理解下面的错误。 我正在尝试在域中获取一个已登录的用户帐户,并允许他们编辑自己的电话号码 另一个人设置了广告访问,但我无法获取登录的用户名 每次都粘贴代码VS.NET错误,但我在一篇在线文章中发现的例外情况除外,我为除我之外的所有人工作 我已经用powershell验证了它的有效性,但我需要一些帮助 谢谢将本地广告与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
//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}\">< 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>