应用程序生成了无法处理的异常

时间:2013-05-22 19:15:27

标签: .net

将程序传输到新域和新服务器时出现此错误,并且仅针对少数用户:

"Request for the permission of type System.Security.Permissions.FileIOPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 failed."

at System.Security.CodeAccessSecurityEngine.CheckHelper(PermissionSet grantedSet, PermissionSet deniedSet, CodeAccessPermission demand, PermissionToken permToken)
at System.Security.CodeAccessSecurityEngine.Check(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 checkFrames, Int32 unrestrictedOverride)
at System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark)
at System.Security.CodeAccessPermission.Demand()
at System.Windows.Forms.FileDialog.set_Title(String value)
at mainForm.InitializeComponent() in C:\MyProjects\DTSExecuter.root\DTSExecuter\DWMaintenance\mainForm.vb:line 88
at mainForm..ctor() in C:\MyProjects\DTSExecuter.root\DTSExecuter\DWMaintenance\mainForm.vb:line 16
at mainForm.Main() in C:\MyProjects\DTSExecuter.root\DTSExecuter\DWMaintenance\mainForm.vb:line 4

我的机器运行应用程序就像其他用户一样运行良好,但只有少数用户可以使用 “应用程序已生成无法处理的异常”。错误框,并在调试时返回上述错误。这是我们可能无法访问源代码的遗留应用程序,它只是更改了内部连接管理器中的连接字符串。除了在新域上运行之外,这是对应用程序的唯一更改。

3 个答案:

答案 0 :(得分:2)

我在自己面前遇到过这种情况。如果Open / SaveFileDialog的起始位置是网络路径,并且运行该应用程序的帐户没有读取网络路径的权限,则会抛出此异常。

只需将InitalDirectory的值设置为安全(例如Environment.GetFolderPath(Environment.SpecialFolder.Desktop)),就可以解决问题。


重新阅读问题后,我发现你无法改变消息来源。我只能建议两件事。遇到问题的用户让他们使用快捷方式启动程序并将工作目录设置为本地路径。如果原始程序员没有设置InitalDirectory,它将默认为工作目录。

要检查的另一件事是你说你搬到了一个新域,确保用户有权访问该程序试图与之交谈的任何文件夹。也许是没有正确迁移的权限。


看到the comment in XPD's answer后,我认为这就是现在发生的事情:

  1. 用户连接到\\Foo\Bar\并手动输入用户名和密码。
  2. 用户从网络共享\\Foo\Bar\Baz.exe
  3. 启动该程序
  4. 程序将自身加载到RAM中,并使用\\Foo\Bar\
  5. 的工作目录执行
  6. 加载程序看到程序需要运行提升并提供UAC提示并重新执行程序作为新凭据
  7. 用户打开一个打开的文件对话框,没有为对话框设置InitalDirectory。它使用步骤#4中设置的工作目录。
  8. 由于步骤#4中的新凭据未获得从步骤1生成的安全令牌的副本,因此该程序的AppDomain无权访问\\Foo\Bar\
    1. 如果用户打开了对话框,并且他们手动导航到路径,则会重新提示输入凭据。
    2. 但是,因为InitalPath已设置为工作目录,所以在UI可以请求凭据并且抛出FileIOPermission execption之前发生错误。
  9. 有四种方法可以解决此问题,按首选选项的降序排列。

    1. 修改原始程序,将用户桌面用作对话框的InitialDirectory
    2. 修改程序启动时的工作目录(例如从快捷方式启动并指定它)
    3. 修改\\Foo\Bar的权限,以便用户无需手动输入凭据即可连接到该帐户。
    4. 停用UAC。

答案 1 :(得分:1)

问题似乎在于设置Open / SaveFileDialog实例的标题栏。看起来这个应用程序无法访问该路径。它可以是用于设置此文件对话框标题的资源文件。为用户提供必要的目录和文件权限。

答案 2 :(得分:0)

找出它在mainForm.vb中尝试访问的文件I / O路径,并为相关用户提供此路径中必要的目录权限。