RSS 2.0 Feed
2004-08 Entries
摘要:AspNet 有的〈processModel〉username/password和〈identity〉的username/password来模拟用户。 〈processModel〉的username默认为machine,指的是ASPNET这个帐户。这个是指定运行ASPNET_WP.EXE进程的身份。 而当指定〈identity impersonate='true'〉时,则应用IIS当前的帐户信息。 当指定〈identity impersonate='true'〉的username/password时,则固定使用固定的帐户来执行请求。 当然,你也可以在运行时指定用户名和密码来运行指定代码: const int LOGON32_LOGON_INTERACTIVE = 2; const int LOGON32_LOGON_NETWORK = 3; const int LOGON32_LOGON_BATCH = 4; const int LOGON32_LOGON_SERVICE = 5; const int LOGON32_LOGON_UNLOCK = 7; const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;//win2k const int LOGON32_LOGON_NEW_CREDENTIALS = 9;//win2k const int LOGON32_PROVIDER_DEFAULT=0; [System.Runtime.InteropServices.DllImport("Kernel32.dll")] extern static int FormatMessage(int flag,ref IntPtr source,int msgid,int langid,ref string buf,int size,ref IntPtr args); [System.Runtime.InteropServices.DllImport("Kernel32.dll")] extern static bool CloseHandle(IntPtr handle); [System.Runtime.InteropServices.DllImport("Advapi32.dll",CharSet=System.Runtime.InteropServices.CharSet.Unicode,SetLastError=true)] extern static bool LogonUser( string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken ); protected override void OnLoad(EventArgs e) { base.OnLoad(e); Response.Write("OnLoad<br/>"); Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); Response.Write("<hr/>"); IntPtr token=IntPtr.Zero; bool res=LogonUser("Lostinet",".",password,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,ref token); if(res==false) { int err=System.Runtime.InteropServices.Marshal.GetLastWin32Error(); IntPtr tempptr=IntPtr.Zero; string msg=null; FormatMessage(0x1300,ref tempptr,err,0,ref msg,255,ref tempptr); Response.Write("Error"+err+":"+msg); Response.Write("<br/>"); FormatMessage(0x1300,ref tempptr,err,1033,ref msg,255,ref tempptr); Response.Write("Error"+err+":"+msg); return; } try { System.Security.Principal.WindowsImpersonationContext wic= System.Security.Principal.WindowsIdentity.Impersonate(token); try { Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); } finally { wic.Undo(); } } finally { CloseHandle(token); } } 不过这里有点问题。如果不是Windows2003的话,那么〈processModel〉的username最好为SYSTEM。否则的话,就要在管理工具-本地安全策略-本地策略-用户权利指派-以操作系统方式操作 里添加运行的用户的权利,我试过Administrators可以,但是如果是以ASPNET来运行的话,则被拒绝。(真麻烦,〈identity〉也用相关的原理来实现模拟,不过不知道它具体是怎样实现的。) 另外,由于〈processModel〉是全局的,而只是针对某一请求的,所以我这里不是太清楚那些ASPNET空间服务的提供商怎样才能保证各空间不能互相访问。 〈processModel〉指定的用户,至少需要有权限访问各网站的web.config才能得到〈identity〉的内容,这就是说,全局用户至少能访问各网站的web.config。那么即使在某个请求中使用了来切换了用户,我只要新开一条线程就能重新用回〈processModel〉指定的用户来运行代码,这时候我也能读取其他网站的web.config了。如果没有更明确的限制,我还能读取其他网站的所有文件。 上面的代码写成一个工具类: using System; class LogonImpersonate : IDisposable { static public string DefaultDomain { get { return "."; } } #region DynamicInvoke static public object DynamicInvoke(string username,string password,Delegate handler,object[] args) { if(handler==null)throw(new ArgumentNullException("handler")); using(new LogonImpersonate(username,password)) { return handler.DynamicInvoke(args); } } static public object......[阅读全文]

posted @ | Feedback (12) | Filed Under [ DotNet AspNet ]

摘要:我想由不少人都懂得在Applicaton_Start等事件中使用HttpContext.RewritePath来改变HttpHandler。 如果在 Server.Transfer/Execute 的调用前,使用RewritePath,更可以起到指定QueryString的效果。 例如 Context.RewritePath("AA.Aspx","","OKOK=3333");Context.Server.Transfer("Test2.Aspx"); 这样,就能执行Test2.Aspx,并且QueryString是OKOK=3333。 这个用途特别大。我目前用这个方法来避免使用 Response.Redirect 。...[阅读全文]

posted @ | Feedback (26) | Filed Under [ DotNet AspNet ]

摘要:最近做了一个控件。其中涉及了控件的样式的设置的IDEA。 这个IDEA具体就是想在应用程序放个controltheme.config,里面直接放<cutegrid BooleanTrue="Y" BooleanFalse=" " CellBorderColor="WhiteSmoke" BorderColor="GhostWhite"> <FooterStyle HorizontalAlign="Center" ForeColor="White" BackColor="SteelBlue"></FooterStyle> <ItemStyle VerticalAlign="Middle" HorizontalAlign="Center" BackColor="PapayaWhip" ForeOverColor="White" BackOverColor="IndianRed"></ItemStyle> <CellAltStyle BackColor="#FFE0C0"></CellAltStyle> <HeaderStyle HorizontalAlign="Center" ForeColor="White" BackColor="SteelBlue"></HeaderStyle> <MenuItemStyle ImageUrl="search.gif"></MenuItemStyle> <PagerStyle HorizontalAlign="Right" ForeColor="White" BackColor="Silver"></PagerStyle> <MenuStyle BorderStyle="Ridge" CssClass="menutable" CellPadding="4"></MenuStyle> <DetailStyle BackColor="WhiteSmoke"></DetailStyle> <PagerStyle HorizontalAlign="Right" ForeColor="White" BackColor="Silver"></PagerStyle> </cutegrid>这样的XML。 然后控件在运行的时候,读取这个文件,并且自动把里面的设置加载进来。这样的话,就不需要在设计的时候复制这些样式了,而且还可以随时更换。 具体的代码只有几十行:namespace CuteSoft.Grid.Impl { using System; using System.Collections; using System.ComponentModel; using System.Reflection; using System.Xml; internal class ObjectMerger { //TODO : Improve Performance static public void MergeToObject(XmlElement element,object obj) { PropertyDescriptorCollection pdc=TypeDescriptor.GetProperties(obj); foreach(XmlAttribute attr in element.Attributes) { PropertyDescriptor pd=pdc[attr.LocalName]; if(pd==null)throw(new Exception("Property Not Found : "+attr.LocalName+" At "+obj.GetType().FullName)); pd.SetValue(obj,ConvertType(attr.Value,pd.PropertyType)); } foreach(XmlElement elem1 in element.SelectNodes("*")) { PropertyDescriptor pd=pdc[elem1.LocalName]; if(pd==null)throw(new Exception("Property Not Found : "+elem1.LocalName+" At "+obj.GetType().FullName)); object oldval=pd.GetValue(obj); if(oldval==null)// { if(pd.IsReadOnly) return;//IGNORE? oldval=Activator.CreateInstance(pd.PropertyType); pd.SetValue(obj,oldval); MergeToObject(elem1,oldval); } else { MergeToObject(elem1,oldval); } } } //TODO : Improve Performance static object ConvertType(string str,Type dstType) { if(dstType==typeof(object)||dstType==typeof(string)) return str; if(dstType.IsEnum) { return Enum.Parse(dstType,str,true); } foreach(Type interfacetype in dstType.GetInterfaces()) { if(interfacetype==typeof(IConvertible)) return Convert.ChangeType(str,dstType); } TypeConverter tc=TypeDescriptor.GetConverter(dstType); if(tc!=null) { if(tc.CanConvertFrom(typeof(string))) return tc.ConvertFrom(str); } throw(new Exception("Unable to convert string to type :"+dstType)); } } } 里面主要简单地应用类型转换的规则,并没有做优化。 使用方法无非就是想办法加载一个XML文档,然后MergeToObject(xmldoc,mycontrol)就可以了。...[阅读全文]

posted @ | Feedback (1) | Filed Under [ DotNet AspNet ]

摘要:namespace Test3 { class 四边形 { protected int _l,_t,_r,_b; public 四边形(int l,int t,int r,int b) { _l=l;_t=t;_r=r;_b=b; } public int 左长度 { get { return _l; } } public int 顶长度 { get { return _t; } } public int 右长度 { get { return _r; } } public int 底长度 { get { return _b; } } } class 菱形 : 四边形 { int _d; public 菱形(int v,int d):base(v,v,v,v) { _d=d; } public int 角度 { get { return _d; } } } class 平行四边形 : 四边形 { int _d; public 平行四边形(int w,int h,int d):base(h,w,h,w) { } public int 宽度 { get { return 顶长度; } } public int 高度 { get { return 左长度; } } public int 角度 { get { return _d; } } } class 长方形 : 平行四边形 { public 长方形(int w,int h):base(w,h,90) { } } class 正方形1 : 长方形 { public 正方形1(int v):base(v,v) { } public int 边长 { get { return 宽度; } } } class 正方型2 : 菱形 { public 正方型2(int v):base(v,90) { } } } 这个是只读的版本,正方形继承长方形,可是这里又多了一个菱形的问题。。 最近想研究一下OO的理论,,待续。。。。...[阅读全文]

posted @ | Feedback (4) | Filed Under [ DotNet ]

摘要:namespace Test1 { public abstract class 四边形 { protected int _l,_t,_r,_b; public int 左长度 { get { return _l; } } public int 顶长度 { get { return _t; } } public int 右长度 { get { return _r; } } public int 底长度 { get { return _b; } } public 自由四边形 转换到自由四边形() { return new 自由四边形(_l,_t,_r,_b); } } public class 自由四边形 : 四边形 { public 自由四边形(int l,int t,int r,int b) { _l=l; _t=t; _r=r; _b=b; } public void 设置左长度(int l) { _l=l; } public void 设置顶长度(int t) { _t=t; } public void 设置右长度(int r) { _r=r; } public void 设置底长度(int b) { _b=b; } } public abstract class 矩形 : 四边形 { public int 宽度 { get { return 顶长度; } } public int 高度 { get { return 左长度; } } public 长方形 转换到长方形() { return new 长方形(_l,_l); } } public class 长方形 : 矩形 { public 长方形(int w,int h) { _t=_b=w; _l=_r=h; } public void 设置宽度(int w) { _t=_b=w; } public void 设置高度(int h) { _l=_r=h; } } public class 正方形 : 矩形 { public 正方形(int v) { _t=_b=_l=_r=v; } public int 边长 { get { return 宽度; } } public void 设置边长(int v) { _t=_b=_l=_r=v; } } } namespace Test2 { public abstract class 四边形 { public abstract int 左长度 { get; } public abstract int 顶长度 { get; } public abstract int 右长度 { get; } public abstract int 底长度 { get; } public......[阅读全文]

posted @ | Feedback (9) | Filed Under [ DotNet ]

摘要:这段时间要做个Excel的东西。本来是打算用DotNet来控制Excel的。不过后来要求做成两个部分。一个为Excel的设计工具,为开发人员用。另外一个是给最终用户使用。 最终用户很多,分散在各地,所以如果要求他们安装DotNet,那么是很痛苦的事情。 最后打算给最终用户使用的Excel的控制采用VBA的方式。而VBA则在用DotNet做的设计工具设计Excel界面时自动生成相关的VBA代码。 一个例子如下:     Excel.Workbook book=.....    Excel.Worksheet sheet=...     //得到第一个Sheet的编程模型    VBIDE.VBComponent componentsheet1=book.VBProject.VBComponents.Item(sheet.CodeName);     //测试,添加一行    componentsheet1.CodeModule.AddFromString("'Hello'");    //测试,删除所有行    componentsheet1.CodeModule.DeleteLines(1,componentsheet1.CodeModule.CountOfLines);     //添加代码    componentsheet1.CodeModule.AddFromString(@"Private Sub Worksheet_SelectionChange(ByVal Target As Range)    Target.Interior.Color = RGB(222,222,222)End Sub"     ); 其实就这么简单。生成这个VBA代码,和在ASP.NET中为HTML生成相关的JavaScript的原理差不多。...[阅读全文]

posted @ | Feedback (6) | Filed Under [ 迷失中 DotNet ]

摘要:这个是回答:http://community.csdn.net/Expert/topic/3243/3243216.xml?temp=.3925897 为什么突然会发现某些场合遇到的事情是曾经发生过的呢?有时候,自己知道这个地方,这个人,这个事情,是以前根本没有接触过的。但是,为什么感觉会那么强烈?难道是自己曾经梦过?自己有预知未来的能力? 如果你以为自己有其他人没有的能力,那肯定是在做白日梦。就如上面的人所说的,小小的CSDN就有那么多人有这样的经历。其实刚好反映了,要么大家都很正常,要么大家都有超能力。 我的观点却是,这只是体内的一种潜能的突然反映而已。 大家要注意到一点,你是直到事情发生了,你才感觉熟悉。而你却无法想起后面接着会干什么。你认为并且希望你是有这样的记忆的,但是就是想不起来而已。 其实这是一种错觉,更是一种“马后炮”。 大家都知道我们思想分主观和潜意识。通常,你醒来的时候,主观意识很强。所以潜意识的活动,人自己很难察觉出来的。而到了睡觉的时候,主观意识基本停止了,这时候潜意识再强烈一些,就能发梦。不过梦到的东西,都是现实的东西及创新过来的想象。 而在白天,当你做一件事情时,如果潜意识活动突然像打了针那样强了起来,那么它就会把你眼前的东西记下来。潜意识的活动你能干预吗?你能知道它在想什么吗?我想不能。 但是当主观意识再读记忆中的东西时,突然发现,怎么记忆中有眼前的东西?而且这种记忆很模糊,但是记忆的存在又那么强烈。(你十分肯定是有这个记忆的,记忆的东西比较弱,不过和眼前的东西是一样的!) 你感觉很神奇啊,于是你又想扫描一下,看看有没有下文。但是很可惜,没有人能想到下面到底发生什么。(因为根本没有发生,潜意识也无法帮你记下未来的东西) 这就是这个现象的基本原理。 当然,史上记载很多关于有人梦见什么他将要做的某个事情,于是没有做,而逃过一劫的事情。不过这个只不过是巧合而已。 几乎人人都发恶梦。但是几十亿的人,只有那么几个遇到刚巧事故真的发生的事情,按概率来说应该还是少了。我觉得应该有成千上万的人能把自己逃过什么劫的事情写成书才算正常。...[阅读全文]

posted @ | Feedback (7) | Filed Under [ 迷失中 ]