对于想了解c#–asp.netUserControl属性的读者,本文将是一篇不可错过的文章,我们将详细介绍c#user32dll,并且为您提供关于.net–Masterpage与Usercontrol
对于想了解c# – asp.net UserControl属性的读者,本文将是一篇不可错过的文章,我们将详细介绍c# user32dll,并且为您提供关于.net – Masterpage与Usercontrol与Customcontrol之间的区别、AD域UserAccountControl属性、AD域重要用户属性、Asp.net UserControl LoadControl问题、ASP.NET UserControl 通信的具体实现的有价值信息。
本文目录一览:- c# – asp.net UserControl属性(c# user32dll)
- .net – Masterpage与Usercontrol与Customcontrol之间的区别
- AD域UserAccountControl属性、AD域重要用户属性
- Asp.net UserControl LoadControl问题
- ASP.NET UserControl 通信的具体实现
c# – asp.net UserControl属性(c# user32dll)
例如:
<my:TextBox runat="server" extraproperty="extravalue" />
在用户控制中未定义的气温,但仍然产生:
<input type="text" extraproperty="extravalue" />
我需要在自定义用户控制.注意我的:在文本框之前.
TY!
解决方法
例如,
<asp:TextBox ID="MyTextBox" runat="server" extraproperty="extravalue" />
呈现为:
<input name="...$MyTextBox" type="text" id="..._MyTextBox" extraproperty="extravalue" />
编辑
从评论:
asp:textBox is not a custom user control
以上将适用于自定义服务器控件(从WebControl派生),但不适用于UserControl,因为UserControl没有可以放置该属性的标签:它仅呈现其内容.
因此,您需要在UserControl类中的代码将自定义属性添加到其子控件之一.然后,UserControl可以将自定义属性公开为属性,如:
// Inside the UserControl public string ExtraProperty { get { return myTextBox.Attributes["extraproperty"]; } set { myTextBox.Attributes["extraproperty"] = value; } } // Consumers of the UserControl <my:CustomUserControl ... ExtraProperty="extravalue" />
.net – Masterpage与Usercontrol与Customcontrol之间的区别
解决方法
ASP.Net Custom controls vs. user controls: Are these two the same
母版页实际上是用户控件;您可以通过转到主页类的代码隐藏来验证这一点,右键单击类名并选择“转到定义”.你会看到这样的东西:
public class MasterPage : UserControl { ... }
用户控件便于显示使用单个项目重复的显示组件,例如菜单和面板.问题是,如果需要,它们不会生成.DLL并且必须手动复制到其他项目.
另一方面,自定义控件可以在单独的类库中创建,并根据需要在其他项目中重用.使用自定义控件时,必须完全在代码中创建显示工件,并且开发需要稍长的时间.
查看Microsoft的用户控件和自定义控件之间的比较:
http://support.microsoft.com/kb/893667
AD域UserAccountControl属性、AD域重要用户属性
AD域UserAccountControl属性、AD域重要用户属性
-
- 1. UserAccountControl属性
- 2. 重要用户属性
1. UserAccountControl属性
因为在修改AD域用户状态的时候发现,一些博客给定的禁用和启用用户的状态值并不一致,参考官网文档和国外的博客发现用户在禁用状态下,也会包含其他属性,这些属性有些是相加的。全量的属性列表如下:
如何参考并使用这个对照表呢?
- 可以搜索表中关于
Disabled
的行对应的十进制值,在程序中可以使用作为状态的判断——
UserAccountControl属性为514
、546
、66050
、66080
、66082
里面的值的可以判断为禁用账号; - 搜索
Enabled
,值为544
、66048
、262656
的以及默认账户类型512
可以判断为启用账户;
在开发中,现在的做法是:
self.disabled_user_flag = [514, 546, 66050, 66080, 66082] # 禁用账户的userAccountControl值列表
self.enabled_user_flag = [512, 544, 66048, 262656] # 启用账户
...
if en[''attributes''][''userAccountControl''] in self.disabled_user_flag: # 遍历用户的userAccountControl属性,在self.disabled_user_flag标志列表中的则为禁用账户
pass
属性标志 | 十六进制 | 十进制 | 非官方值 |
---|---|---|---|
SCRIPT | 0x0001 | 1 | |
ACCOUNTDISABLE | 0x0002 | 2 | |
HOMEDIR_REQUIRED | 0x0008 | 8 | |
LOCKOUT | 0x0010 | 16 | |
PASSWD_NOTREQD | 0x0020 | 32 | |
PASSWD_CANT_CHANGE | 0x0040 | 64 | |
ENCRYPTED_TEXT_PWD_ALLOWED | 0x0080 | 128 | |
TEMP_DUPLICATE_ACCOUNT | 0x0100 | 256 | |
NORMAL_ACCOUNT 默认账户 |
0x0200 | 512 | |
Disabled Account 禁用账户 |
0x0202 | 514 | x |
Enabled, Password Not Required 启用账户 不需密码 |
0x0220 | 544 | x |
Disabled, Password Not Required 禁用账户 不需密码 |
0x0222 | 546 | x |
INTERDOMAIN_TRUST_ACCOUNT | 0x0800 | 2048 | |
WORKSTATION_TRUST_ACCOUNT | 0x1000 | 4096 | |
SERVER_TRUST_ACCOUNT | 0x2000 | 8192 | |
DONT_EXPIRE_PASSWORD | 0x10000 | 65536 | |
Enabled, Password Doesn’t Expire 启用账户 密码未过期 |
0x10200 | 66048 | x |
Disabled, Password Doesn’t Expire 禁用账户 密码未过期 |
0x10202 | 66050 | x |
Disabled, Password Doesn’t Expire & Not Required 禁用账户 密码未过期且不需密码 |
0x10220 | 66080 | x |
Disabled, Password Doesn’t Expire & Not Required 禁用账户 密码未过期且不需密码 |
0x10222 | 66082 | x |
MNS_LOGON_ACCOUNT | 0x20000 | 131072 | |
SMARTCARD_REQUIRED | 0x40000 | 262144 | |
Enabled, Smartcard Required 下面几个都是需要使用智能卡登录账户(我们不涉及) | 0x40200 | 262656 | x |
Disabled, Smartcard Required | 0x40202 | 262658 | x |
Disabled, Smartcard Required, Password Not Required | 0x40222 | 262690 | x |
Disabled, Smartcard Required, Password Doesn’t Expire | 0x50202 | 328194 | x |
Disabled, Smartcard Required, Password Doesn’t Expire & Not Required | 0x50222 | 328226 | x |
TRUSTED_FOR_DELEGATION | 0x80000 | 524288 | |
Domain controller | 0x82000 | 532480 | |
NOT_DELEGATED | 0x100000 | 1048576 | |
USE_DES_KEY_ONLY | 0x200000 | 2097152 | |
DONT_REQ_PREAUTH | 0x400000 | 4194304 | |
PASSWORD_EXPIRED | 0x800000 | 8388608 | |
TRUSTED_TO_AUTH_FOR_DELEGATION | 0x1000000 | 16777216 | |
PARTIAL_SECRETS_ACCOUNT | 0x04000000 | 67108864 |
属性说明(可不看):
- SCRIPT – 将运行登录脚本。
- ACCOUNTDISABLE – 用户帐户已禁用。
- HOMEDIR_REQUIRED – 主文件夹是必需的。
- PASSWD_NOTREQD – 不需要密码。
- PASSWD_CANT_CHANGE – 用户无法更改密码。这是对用户对象的权限。 有关如何以编程方式设置此权限的信息,请访问以下网站:Modifying User Cannot Change Password (LDAP Provider)
- ENCRYPTED_TEXT_PASSWORD_ALLOWED – 用户可以发送加密的密码。
- TEMP_DUPLICATE_ACCOUNT – 这是其主要帐户位于另一个域中的用户的帐户。该帐户为用户提供对该域的访问权限,但不提供对任何信任该域的域的访问权限。有时称为本地用户帐户。
- NORMAL_ACCOUNT – 这是代表典型用户的默认帐户类型。
- INTERDOMAIN_TRUST_ACCOUNT – 这是允许信任信任其他域的系统域的帐户的许可。
- WORKSTATION_TRUST_ACCOUNT – 这是运行Microsoft Windows NT 4.0工作站,Microsoft Windows NT 4.0 Server,Microsoft Windows 2000 Professional或Windows 2000 Server的计算机的计算机帐户,并且是此域的成员。
- SERVER_TRUST_ACCOUNT – 这是域控制器的计算机帐户,该域控制器是该域的成员。
- DONT_EXPIRE_PASSWD – 表示密码,该密码永远不会在该帐户上过期。
- MNS_LOGON_ACCOUNT – 这是MNS登录帐户。
- SMARTCARD_REQUIRED – 设置此标志后,它将强制用户使用智能卡登录。
- TRUSTED_FOR_DELEGATION – 设置此标志后,将为Kerberos委派信任运行该服务的服务帐户(用户或计算机帐户)。任何此类服务都可以模拟请求该服务的客户端。要为Kerberos委派启用服务,必须在服务帐户的userAccountControl属性上设置此标志。
- NOT_DELEGATED – 设置此标志时,即使将服务帐户设置为受Kerberos委派的信任,也不会将用户的安全上下文委派给服务。
- USE_DES_KEY_ONLY – (Windows 2000 / Windows Server 2003)将此主体限制为仅对密钥使用数据加密标准(DES)加密类型。
- DONT_REQUIRE_PREAUTH – (Windows 2000 / Windows Server 2003)此帐户登录时不需要Kerberos预身份验证。
- PASSWORD_EXPIRED – (Windows 2000 / Windows Server 2003)用户密码已过期。
- TRUSTED_TO_AUTH_FOR_DELEGATION –(Windows 2000 / Windows Server 2003)帐户已启用委派。这是对安全性敏感的设置。启用此选项的帐户应受到严格控制。使用此设置,可以在帐户下运行的服务采用客户端的身份,并以该用户身份向网络上的其他远程服务器进行身份验证。
- PARTIAL_SECRETS_ACCOUNT – (Windows Server 2008 / Windows Server 2008 R2)该帐户是只读域控制器(RODC)。这是对安全性敏感的设置。从RODC删除此设置会损害该服务器上的安全性。
2. 重要用户属性
AD域中的字段 | 含义 | 示例 | 说明 |
---|---|---|---|
objectGUID | 对象的唯一标识符 | 24699359-f8c2-482a-a3d6-e5557c31bd19 | 无需用户修改 |
sAMAccountName | SAM账号 | P009527 | 登录账号 |
distinguishedName | 对象dn | CN=李四9527,OU=研发支持,OU=上海总部,OU=XXX,OU=COM | 对象在AD域中的位置 |
pwdLastSet | 用户下次登录必须修改密码 | 0 | 默认不设置,需要强制其修改则设置为0 |
accountExpires | 账户过期时间 | 0 | 设置为0永不过期,否则设置为NT时间 |
whenCreated | 对象创建时间 | 2020-10-09 09:17:49+00:00 | 用于表示日期和时间的国际标准是ISO8601。其完整参考编号是ISO 8601:1988(E),其标题是“数据元素和交换格式-信息交换-日期和时间的表示”。 |
whenChanged | 对象修改时间 | 2020-10-09 09:17:50+00:00 | |
displayname | 显示名 | 李四 | |
sn | 姓 | 李 | |
givenName | 名 | 四 | |
电子邮件 | si.li@XXX.com | ||
mobile | 移动电话 | 15002510721,13341667654 | |
telephoneNumber | 电话号码 | 051632423534 | |
company | 公司 | 小米 | |
department | 部门 | 研发支持 | |
title | 职务 | 技术顾问 |
accountExpires
如果您在AD中设置了一个帐户,该帐户于2020年10月15日下午5:00到期,则该帐户在AD中有效的最后一天是7月14日。
如果使用Microsoft管理控制台将帐户设置为在2020年10月15日到期,则“登录到期时间”的accountExpires
属性设置为在2020年10月16日上午12:00到期,因为Microsoft管理控制台不允许使用要设置的时间值,默认值为12:00 am
在AD中将accountExpires的值设置为“ -1”将导致eDirectory设置为:2106年2月7日,美国东部标准时间(2860207062815Z)1:28:15。
**accountExpires**字段在创建用户的时候可以给定限制,假设当前时间是2020年11月23日,我们给这个用户三个月的有限期,则有如下`python`代码:
def current_time2nt_time_plus_mouths ( M ):import timeimport datetimefrom dateutil.relativedelta import relativedelta''''''当前时间加一个时间差并转换为NT时间''''''now = datetime.datetime.now() # 当前时间now += relativedelta( months =M) # 当前时间加上时间差timestamp = time.mktime(now.timetuple())timestamp *= 1000timestamp -= 57599875timestamp *= 10000timestamp += 116445312000000000timestamp = '' %d '' % timestampreturn timestampif __name__ == "__main__" :ts = current_time2nt_time_plus_mouths( 3 )print (ts)
最后的ts假设为:
`132585363281250000`
则为三个月后的此刻过期。
代码直接修改一个用户的过期时间字段为:
modify()方法中第一个参数为用户dn,第二个参数为待修改的内容:{''待修改字段'': (2, [值])},2的意思是修改;con = con_ad()是AD服务器的连接,这里不写了。
# con = con_ad()# modify_res = con.modify("CN=xxx,OU=xxx,OU=xxx,OU=xxx,DC=xxx,DC=com", {# ''accountExpires'': (2, [ts])})# print(modify_res)
Asp.net UserControl LoadControl问题
我有一个超简单的用户控制(ascx)
<%@ Control Language="C#" AutoEventWireup="True" Inherits="Errordisplay" Codebehind="Errordisplay.ascx.cs" EnableViewState="false" %> <asp:Label runat="server" ID="lblTitle" /> <asp:Label runat="server" ID="lblDescription" />
与代码(c#)后面:
public partial class Errordisplay : System.Web.UI.UserControl { private Message _ErrorMessage; public Errordisplay() { } public Errordisplay(Message ErrorMessage) { _ErrorMessage = ErrorMessage; } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (_ErrorMessage != null) { lblTitle.Text = _ErrorMessage.Message; lblDescription.Text = _ErrorMessage.Description; } } }
在我的Web应用程序的其他地方,我将使用以下代码向用户控件添加一个实例:
divValidationIssues.Controls.Add(LoadControl(typeof(Errordisplay),new object[] { MessageDetails }));
我正在使用LoadControl的重载版本,因为我想将Message参数传递给构造函数.所有这一切似乎都可以正常工作.
但是,当在Errordisplay用户控件上触发OnPreRender()时,lblTitle和lblDescription变量都为空,尽管它们具有等价的标记.消息变量已正确填充.
任何人都可以说明为什么会发生这种情况吗?
谢谢
编辑:
为了清楚起见,我还会补充说,正在编程地将用户控件添加到页面的代码正在响应按钮按钮,所以“主机页面”已经通过Init,Page_Load进行,现在正在处理事件处理程序.
我们无法在早期的asp生命周期阶段添加用户控件,因为它们是响应于按钮单击事件而创建的.
解决方法
protected void Page_Load(object sender,EventArgs e) { if (_ErrorMessage != null) { lblTitle.Text = _ErrorMessage.Message; lblDescription.Text = _ErrorMessage.Description; } }
我了解到,LoadControl函数将控件加载到正在包含的页面的当前“状态”中.因此,Init,Page_Load等都作为LoadControl调用的一部分运行.
有趣的是,这个(未回答)asp.net论坛的帖子展现了与我遇到的相同的问题.
MSDN Forums Post
另外 – 从MSDN:
When you load a control into a container control,the container raises all of the added control’s events until it has caught up to the current event. However,the added control does not catch up with postback data processing. For an added control to participate in postback data processing,including validation,the control must be added in the Init event rather than in the Load event.
所以不要LoadControl正确的控制?
编辑:
好的,所以我在这里回答我自己的问题
我找到一个回复版本的论坛帖子,我链接到Here上面
基本上,答案是LoadControl(type,params)不能推断“页面前端”ascx来解析,因此它不会打扰任何控件.当您使用LoadControl(“ascx路径”)版本时,它被赋予页面前端,因此执行所有解析和初始化.
总而言之,我需要更改正在控制的代码,并将其拆分成单独的部分.即
Control ErrorCntrl = LoadControl("Errordisplay.ascx"); ErrorCntrl.ID = SomeID; (ErrorCntrl as Errordisplay).SetErrorMessage = MessageDetail; diverrorContainer.Controls.Add(ErrorCntrl);
它应该工作正常..它不像我以前的尝试一样整洁,但至少它会工作.
我仍然乐意提出上述建议.
干杯
ASP.NET UserControl 通信的具体实现
最近在SharePoint2007中用到了WebPart通信技术,个人觉得2007版本里面的ConnectionConsumer和ConnectionProvider没有2010版本那么好用,于是换了一种思想去实现通信:WebPart容器中装一个UserControl控件,这样只要UserControl可以通信,就实现了WebPart之间通信。
UserControl是用户自定义控件,我们可以在UserControl中注入事件,当一个UserControl触发某种事件,然后通过事件参数来传递数据,让其他UserControl获得这个事件传递过来的参数,实现通信。
下面简单演示一下两个UserControl进行通信
创建好一个类,两个UserControl和一个web页面。
这里分别是MyEventAgrs.cs,UCProvider.ascx,UCComsumer.ascx,Default.aspx。
MyEventAgrs.cs代码如下:
public delegate void MyEventHandle(object sender, MyEventAgrs args);
public class MyEventAgrs : EventArgs
{
public MyEventAgrs() { }
public string MyMsg { get; set; }
}
public delegate void MyEventHandle(object sender, MyEventAgrs args);
public class MyEventAgrs : EventArgs
{
public MyEventAgrs() { }
public string MyMsg { get; set; }
}
如果想传递其他对象时就只需要修改MyEventAgrs类的MyMsg方法。这里须继承EventArgs抽象类,用于存放事件参数值,另外需定义一个委托事件,然后在其他的地方使用。
UCProvider.ascx代码如下:
public partial class UCProvider : System.Web.UI.UserControl
{
public event MyEventHandle myHandle;
protected void Page_Load(object sender, EventArgs e)
{
this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
}
void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
MyEventAgrs myEvent = new MyEventAgrs();
myEvent.MyMsg = DropDownList1.SelectedValue;
myHandle(this, myEvent);
} }
public partial class UCProvider : System.Web.UI.UserControl
{
public event MyEventHandle myHandle;
protected void Page_Load(object sender, EventArgs e)
{
this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
}
void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
MyEventAgrs myEvent = new MyEventAgrs();
myEvent.MyMsg = DropDownList1.SelectedValue;
myHandle(this, myEvent);
} }