20070605 .net 权限 WindowsFormsApplicationBase UnauthorizedAccessException
http://www.yippeesoft.com

http://www.codeproject.com/csharp/CSSIApp.asp
http://blog.csdn.net/freexploit/archive/2006/07/31/1002682.aspx
http://www.microsoft.com/china/technet/itsolutions/net/maintain/netopsgd.asp
http://support.microsoft.com/?scid=kb%3Ben-us%3B832742&x=11&y=14
http://msdn2.microsoft.com/zh-cn/library/yd267cce(VS.80).aspx
http://msdn.microsoft.com/library/en-us/dnbda/html/authaspdotnet.asp
http://msdn2.microsoft.com/zh-cn/library/yctbsyf4(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/ms978378.aspx

一个单进程C#程序,结果通过WEB调用,发现出错
未处理 System.UnauthorizedAccessException
  Message="对路径“db838237-40f4-4cb3-adcb-771441ffbb011.0Event”的访问被拒绝。"
  Source="mscorlib"
  StackTrace:
       在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       在 System.Threading.EventWaitHandle..ctor(Boolean initialState, EventResetMode mode, String name, Boolean& createdNew, EventWaitHandleSecurity eventSecurity)
       在 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       在 SingleInstanceApp.Global.Main(String[] args)

代码是基于WindowsFormsApplicationBase

资料:
关于异常的疑难解答:System.UnauthorizedAccessException

当因为 I/O 错误或安全错误造成操作系统拒绝访问时,会引发 UnauthorizedAccessException 异常。

确定信任级别
生成应用程序时,安全是一个重要的考虑因素。公共语言运行库会基于代码具有的特定属性(命名证据)授予代码不同的信任级别。

当公共语言运行库确定代码具有特定信任级别时,公共语言运行库将允许代码访问受该信任级别保护的资源。默认情况下,从 Internet 运行的 .NET Framework 应用程序与从本地计算机运行的 .NET Framework 应用程序具有的信任级别并不相同。从本地计算机运行的应用程序可以访问文件系统之类的资源。然而,从 Internet 或本地 Intranet 运行的应用程序无法访问您本地计算机上的文件系统。

通常,默认安全策略对您的应用程序已经足够了。Microsoft 建议仅在必要时更改此安全策略。可以使用 .NET Framework 配置工具 (Mscorcfg.msc) 更改该安全策略。

在 .NET Framework 中,代码访问安全通过控制代码如何运行来控制对资源的访问。用户运行应用程序时,公共语言运行库会将该应用程序分配给以下五个区域中的任意一个:
• 我的电脑 — 应用程序代码直接由用户的计算机承载。
• 本地 Intranet — 应用程序代码从用户的 Intranet 上的文件共享运行。
• Internet — 应用程序代码从 Internet 运行。
• 受信任的站点 — 应用程序代码从在 Internet Explorer 中定义为“受信任”的网站运行。
• 不受信任的站点 — 应用程序代码从在 Internet Explorer 中定义为“受限制”的网站运行。
可以将每个区域的安全级别设置为“高”、“中”、“中低”或“低”。

信任级别定义应用程序可以访问的资源。区域和其他安全证据(例如,发布者、强名称、网站和代码的 URL)一起确定公共语言运行库在运行时向代码授予的权限。

由于无法控制用户计算机上的安全设置,因此您的应用程序必须在现有设置中工作。所以,有些资源可能对您的应用程序不可用。例如,您的应用程序可能必须向某一文件写入数据。但是,用户的计算机可能在运行时引发异常,来拒绝您的应用程序的写入访问。

回到顶端
向应用程序授予权限
网络驱动器上承载的应用程序可以在本地计算机上运行。要运行该应用程序,必须向与该应用程序对应的程序集授予信任级别。信任级别设置包括从“无”到“完全信任”多个级别。要在本地计算机上运行该应用程序,必须向程序集授予“完全信任”权限。
分配“完全信任”权限
1. 根据您的操作系统,执行以下操作:
• 在 Windows XP 中,单击“开始”,然后单击“控制面板”。
• 在 Windows 2000 中,单击“开始”,指向“设置”,然后单击“控制面板”。
2. 根据所使用的 .NET Framework 版本,执行以下操作:
• 如果使用的是 .NET Framework 1.1,则请双击“管理工具”,然后双击“Microsoft .NET Framework 1.1 向导”。
• 如果使用的是 .NET Framework 1.0,则请双击“管理工具”,然后双击“Microsoft .NET Framework 向导”。
随即显示“.NET 向导”窗口。
3. 在“.NET 向导”窗口中,单击“信任程序集”。随即显示“信任程序集”对话框。
4. 单击以选择“对此计算机进行更改”选项,然后单击“下一步”。
5. 单击“浏览”。随即出现“选择程序集”对话框。
6. 在“选择程序集”对话框中,在映射的网络驱动器上找到相应的可执行文件,然后单击“打开”。
7. 在“信任程序集”对话框中,单击“下一步”。
8. 在“信任程序集”对话框中,将滑块移动到“完全信任”,然后单击“下一步”。
9. 单击“完成”。
10. 要从映射的网络驱动器运行可执行文件,请在 Windows 资源管理器中双击该文件。

问题是我用的是 .NET Framework 2.0 居然找不到 Microsoft .NET Framework 1.1 向导 郁闷

在Microsoft .NET Framework Configuration中可以设置所有关于.NET Framework的属性。
点击我的电脑,打开下拉菜单,我们可以看到程序集缓存、已配置程序集、远程处理服务、运行库安全策略、应用程序等五项。运行库安全策略设置是我们这篇文章的重点。

  我们可以先查看一下程序集缓存,在这里我们可以看到所有的全局程序集缓存,全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。在这里我们可以发现我们可以使用的所有的程序集,同时也可以添加和删除某些程序集。详细操作请参见.NET Framework SDK文档。

  我们在这里主要讨论的是运行库安全策略。在此策略中,按层次结构由高到低分为四个级别,即:企业、计算机、用户、应用程序。在计算权限授予时,运行库从该层次结构的顶部开始,然后向下进行计算。较低的策略级别不能对在较高级别上授予的权限进行增加,但是可以使权限减少。这就是说如果我们将计算机策略设置为较小的权限时,可以不必更改企业策略就可以使设置的权限生效,也就是说权限检查的顺序是从低级别到高级别,只有在低级别中不存在的设置才会检查上一级的设置。默认情况下,用户策略和应用程序域策略的限制性小于计算机策略和企业级策略。大部分默认策略存在于计算机级别。所以我们需要将默认安装的主机的权限在计算机级别上进行修改,修改的内容根据主机是不是共享主机,主机应用的其他不明代码的可能性来设置。如果是我们讨论的共享主机的话,在计算机级别上就尽量将权限设的小一些,为了避免我们讨论的文件系统安全问题,一定要注意权限中的本地磁盘访问权限。

问:
在下现在需要往一个共享文件夹中写入信息,但总是有异常,说对那个文件的访问被拒绝。我用绝对路径,但仍然是相同的异常。我查看当前用户是ASPNET。我想是不是用户权限的问题,请各位大虾给诊断一下。能不能告诉我如何在代码中改变当前用户的权限?最好给出代码示例,小可不胜感激!!
______________________________________________________________________________________________
答1:
gz
______________________________________________________________________________________________
答2:
感谢您使用微软产品。

默认情况下,ASP.NET的工作进程的Security Context为aspnet本地用户。

也就是说,当ASP.NET去访问资源的时候,会使用aspnet的access token, 根据我的经验,这个问题很可能是由于aspnet账号不具备在该文件夹读写的权限。

解决这个问题,您可以已采取下面的方法:

1。 改变ASP.NET工作进程的账号,默认情况下,是ASPNET, 具体情况,请您参阅下面的微软知识库文章:

Q317012 INFO: Process and Request Identity in ASP.NET
http://support.microsoft.com/support/kb/articles/q317/0/12.asp

2。 如果您要在代码中impersonate到其他账号,请您参阅下面的微软知识库文章:

Q306158 INFO: Implementing Impersonation in an ASP.NET Application
http://support.microsoft.com/support/kb/articles/q306/1/58.asp

关于IIS和ASP.NET安全性方面的更多信息,请您参阅下面的文章:

http://www.microsoft.com/china/community/article.asp?oBODY=TechZone/TechArticle/TechDoc/NETcertification&oXSLT=TechZone/TechArticle/TechContent

____________________________________________________________________________________________
答3:
谢谢,楼上的。还有个问题,我在代码中impersonate到其他账号,但要提供用户名和密码以及域。因为我的应用是通用的,那么,我应该是用什么账号和密码才行,Windows有没有这样的通用账号,同时又具有很高的权限?
______________________________________________________________________________________________
答4:
没人回答吗?
______________________________________________________________________________________________
答5:
呵呵,把aspnet添加到adminnistrator组中,不太好

或者,修改mechine.config的文件中的<processModel  userName="machine" password="autogenerate" />

把username 改为:SYSTEM

 .net 对文件设置权限的代码
/// <summary>
    /// 给文件夹添加aspnet用户
    /// </summary>
    private void adddirectorysecurity()
    &leftsign;
        directoryinfo dirinfo = new directoryinfo(server.mappath(strdir));

        if ((dirinfo.attributes & fileattributes.readonly) != 0)
        &leftsign;
            dirinfo.attributes = fileattributes.normal;
        &rightsign;

        //取得访问控制列表
        directorysecurity dirsecurity = dirinfo.getaccesscontrol();

        string strdomain = dns.gethostname();

        dirsecurity.addaccessrule(new filesystemaccessrule(strdomain + "\\\\aspnet", filesystemrights.fullcontrol, accesscontroltype.allow));

        dirinfo.setaccesscontrol(dirsecurity);
    &rightsign;

历史博文

标签:, , , , , , , ,
十一月 6, 2007 at 10:50 下午 by yippee 1,027 次
Category: Dev
Tags: , , , , , , , ,