RSS 2.0 Feed
2006-12 Entries
摘要:这个post主要用来share我的IdentityScope类 在Windows Vista运行Visual Studio 2005(without SP1)时,最好使用Vista的Run as administrator的功能,否则有些功能就不能正常工作。而在我们开发的.NET程序内部,有时也会碰到需要临时提高权限的情形。ASP.NET程序员经常问的一个问题是,我的代码为什么没有权限创建一个文件?基本的解决方案有三个: 提升ASPNET帐户(在Windows 2003则是Network Service)的权限(不推荐) 为目标文件或文件夹设置ASPNET帐户的读写权限(如果需要访问的文件路径是固定的) 在web.config设置impersonate,以另一个帐户的身份运行程序,比如Administrator... 论坛和新闻组里面常出现的另一个问题是,如何访问网上邻居或者映射的网络驱动器?常见的答案是使用Process.Start方法调用cmd.exe执行一个net use命令,这个方案是可行的但是显然不科学... 这里同样是权限问题。 .NET类库自带了个WindowsImpersonationContext类,可以用来进行用户身份模拟。不过创建这个对象的唯一办法调用WindowsIdentity.Impersonate(IntPtr userToken)方法,而userToken却只有通过Windows API调用而来(根本就是没打算让人用的)... MSDN上语焉不详,而实际上Windows SDK解释的更清楚,在LogonUser页有完整的说明和示例。于是使用P/Invoke封装了LogonUser、ImpersonateLoggedOnUser、RevertToSelf这几个API以及相关的一些枚举类,实现了一个IdentityScope类。演示代码:Console.WriteLine(WindowsIdentity.GetCurrent().Name);using (new IdentityScope("SUMA-LP", "Administrator", "********")){    Console.WriteLine(WindowsIdentity.GetCurrent().Name);}Console.WriteLine(WindowsIdentity.GetCurrent().Name); Console将输出:Redmond\V-WexiaSUMA-LP\AdministratorRedmond\V-Wexia 你可以看到在这个using代码块里面执行者身份成功的扮演了本机的Administrator。在访问网上共享资源的时候这个类同样有效,比如:using (new IdentityScope("Domain", "User", "Password", LogonType.NewCredentials, LogonProvider.WinNT50)){    File.Copy("file.ext", "\\shared\folder\file.ext");} 这里使用LogonType.NewCredentials登陆类型意味着本地身份不变,访问网络资源时使用扮演的身份。 IdentityScope类的源代码见:http://blog.joycode.com/sunmast/articles/identityscope_class.aspx...[阅读全文]

posted @ | Feedback (9) | Filed Under [ Patterns and Practice P/Invoke ]

摘要:原来只是打算实现一个进程互斥的功能,而.NET似乎没有内置,所以决定调Windows API自己写。原来简单的几句代码,加上了Exception Handling和Dispose Pattern后,居然搞出了近一百行代码,还没怎么写注释。 /// <summary>/// Process level simple mutex class. By Sunmast./// </summary>/// <remarks>/// Always avoid duplicate mutex names./// </remarks>class ProcessMutex : IDisposable{    [DllImport("Kernel32.dll")]    static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);    [DllImport("Kernel32.dll")]    static extern bool ReleaseMutex(IntPtr hMutex);    [DllImport("Kernel32.dll")]    static extern uint WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);     const uint WAIT_ABANDONED = 0x00000080;    const uint WAIT_OBJECT_0 = 0x00000000;    const uint WAIT_TIMEOUT = 0x00000102;    const uint WAIT_FAILED = 0xFFFFFFFF;    const int MAX_PATH = 260;     IntPtr hMutex;    bool disposed;     public ProcessMutex(string mutexName)        : this(mutexName, int.MaxValue)    {     }     public ProcessMutex(string mutexName, int timeout)    {        if (mutexName == null)        {            throw new ArgumentNullException("mutexName");        }       ......[阅读全文]

posted @ | Feedback (9) | Filed Under [ Patterns and Practice ]

摘要:最近老夫心情很好,上海天气也前所未有的暖和,所以这篇超级流水账纯属YY。 想必是被公司里的数据库高手惯坏了,这两年来自我感觉离数据库距离越来越远,以至于SQL Server 2005发布这么久 — 连SP1都出来了 — 我都还没把它装到硬盘上;如此严重的轻视MSDN Subscriber帐号的存在,在还有三天MVP帐号就要到期之前(美丽的Sisley阿姨快救救我吧),我在想这世上还有做.NET的人不会数据库吗?自己到底还算不算一个.NETer or MSer?出于这个严重问题的考虑,我决定,为了支持微软(以增加连任MVP的可能性),我决定,去MSDN当一个先,再晚就来不及了! Initially我看上了SQL Server 2005 Developer Edition,原因是我的机器跑的是Windows XP SP2,而Windows XP没有Enterprise Edition,并且SQL Server 2005没有Professional Edition,作为一个“出于学习和研究目的”的Developer,当然选择Developer Edition啦。在当当当当当当当当当当了一天两夜之后,把ISO载入DAEMON(此时突然想起微软寄来的DVD里应该已经带了,我浪费了全人类36小时的宝贵的电力能源),安装,点开开始菜单,晕,SQL Server 2000的Enterprise Manager去哪儿了我说?MSN上随便抓个人一问,子曰现在那个玩意的名字叫SQL Server 2005 Management Studio,啊,变高级了,不过可惜我找不到,开始菜单里没有啊,卖糕的,没有这个东西该怎么管理数据库啊,搜索硬盘也没找到那个EXE(子曾经曰过是SSMS.EXE),算了,归为RPWT,重装。结果我成功的证明了我没有RPWT,因为我还是没有找到那个Management Studio。此时突然想起我以前一个Manager的口头禅: “微软的东西就是烂!” 阿弥陀佛,迫于人家管理层的淫威,我不能说“实际上是你自己脑子有病”或者是“晚上吃药忘了开灯吧”,等等,虽然那些从小到大学会的脏话在脑海里已经翻腾了好多年;只能说“没有吧,你的机器又出啥问题了我帮你看看”。 受CSDN论坛影响,我的潜意识也变得越来越浮躁,再加上我不得不边看球边装机器的客观原因,所以我心安理得的没有按照正规流程(看文档 -> 查资料 -> 自个儿琢磨 -> 再看文档,循环到Stack Overflow为止)研究问题原因,直接在MSN上又抓了个人问。不巧的是这位大哥似乎也在看球(和我不同的是我可以边看电视边看电脑,他不行),好不容易等到中场的时候那位大哥才来了一句: “啊?你居然还在用Windows XP?我不用XP已经好多年了都。” 言下之意是我这个火星来的也应该学学地球人怎么用Windows Server 2003了,但是我认为我64-bit的Windows XP SP2号称使用了Windows Server 2003的内核,理论上一样的;况且以前SQL Server 2000都没问题,根据寡人这些年来观察猪奔跑的经验,新版本应该也可以的。算了,人家还有一个意思就是“我不对使用Windows XP的人提供技术支持”。搞不懂了,这年头装个OS都能让人产生优越感(特别是那帮装了Macintosh的,老觉得我的XP就是盗版了他们Apple买来的界面技术)。 由于已经确定这个不是我的RPWT,再加上那位大哥的误导,我开始怀疑我的OS起来。原因是我的XP是经过nLite RIP的,万一那天脑袋不清醒弄丢了什么组件,造成一些超自然现象也在情理之中。但是为了这种破问题就重装系统值得吗,太无能了吧?为了免受江湖高手的耻笑,我打算坚持在PC上使用现有系统,在另一台刚买的DELL本本上再试一次(sigh,由于买的是DELL的机器,我还是没能逃脱来自黑社会人士的鄙视,地球真的是一个很奇怪的星球)。这个时候终于注意到MSDN 上赫然写着: New in Subscriber Downloads - SQL Server 2005 Express Edition with Advanced ServicesSQL Server Express with Advanced Services has all of the features in SQL Server 2005 Express Edition, plus you can: Easily manage and administer SQL Server Express with a new easy-to-use graphical management tool -- SQL Server 2005 Management Studio Express (SSMSE).......[阅读全文]

posted @ | Feedback (34) | Filed Under [ Patterns and Practice ]

摘要:独自来Redmond, WA已经快一周了,这是我第一次到美国,举目无亲,公司的联系人也不管不问。幸运的是,期间展波同学(or大哥,maybe大叔)给予了我无数帮助(包括:带我去吃各国美味、订电话卡、买鸡翅、改进女友关系等无数事务)。 感谢展波! ...[阅读全文]

posted @ | Feedback (17) |