.net 应用程序已生成一个异常,该异常可以';无法处理

.net 应用程序已生成一个异常,该异常可以';无法处理,.net,.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.Che

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

"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
我的机器和其他用户一样可以很好地运行这个应用程序,但也有少数用户可以使用它
“应用程序生成了无法处理的异常。”错误框,调试时返回上述错误。这是一个我们可能无法访问其源代码的遗留应用程序,它只是在内部连接管理器中更改了连接字符串。这是对应用程序的唯一更改,而不是在新域上运行。

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

问题似乎在于设置打开/保存文件对话框实例的标题栏。似乎存在此应用程序无法访问的路径。它可以是用于设置此文件对话框标题的资源文件。为用户提供必要的目录和文件权限。

我以前就遇到过这个问题。如果打开/保存文件对话框的起始位置是网络路径,并且运行应用程序的帐户没有读取网络路径的权限,则会引发此异常

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


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

要检查的另一件事是,您说您已移动到一个新域,请确保用户有权访问程序试图与之对话的任何文件夹。可能是未正确迁移的权限


在看到之后,我认为这就是正在发生的事情:

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

  • 修改原始程序,将用户桌面用作对话框的
    InitialDirectory
  • 在程序启动时修改其工作目录(如通过从快捷方式启动并指定它)
  • 修改
    \\Foo\Bar
    上的权限,以便用户无需手动输入凭据即可连接到它
  • 禁用UAC

  • FileIOPermission已清除。您的用户无权使用应用程序所需的某些文件。这些文件是否碰巧在较新的操作系统上出现问题?这里提到的错误非常清楚。这是所有权限。应用程序中使用的所有文件都与.exe文件一起存储在网络共享上,并且所有用户都具有对这些文件夹的完全控制权限。你应该补充一个问题,否则你可能很难知道你想知道什么。这是一个问答论坛。应用程序中使用的所有文件都与.exe文件一起存储在网络共享中,所有用户都对这些文件夹具有完全控制权限。我是否还遗漏了其他内容?是否有任何方法可以找出缺少这些权限的文件?据我所知,用户拥有对所有网络共享的完全控制权限。@ChrisParker程序在运行前是否为UAC提升自身?是的,它以管理员权限运行。提升时,现有的网络验证会话不会跟随您。您需要使用任何网络共享重新进行身份验证(即,如果您必须手动键入用户名和密码才能进入共享以启动程序,则必须作为提升过程再次键入用户名和密码)(但是,当第一次显示用户名和密码时,您没有机会输入用户名和密码,因此会引发执行选项))。如果您将程序的工作目录设置为本地路径(请参阅我的答案)或者在运行程序之前将程序复制到本地,它会解决问题。我最初是这样想的,但即使将所有文件移动到用户的桌面上,也会出现错误。因此,它必须尝试访问文件夹结构之外的文件,但我不确定在何处。令人沮丧的是,我最终通过将应用程序移动到桌面,然后在“属性”>“兼容性”中为所有用户检查“以管理员身份运行此程序”。这似乎已修复了权限错误。+1从一点点线索中解决此问题!顺便说一句,我相信您需要在这句话中加上“不”:“6.因为步骤#4中的新凭证未获取步骤#1中生成的安全令牌的副本…”。I th