1

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

"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

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

4

3 回答 3

2

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

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


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

要检查的另一件事是您说您已移至新域,请确保用户有权访问程序尝试与之通信的任何文件夹。也许没有正确迁移的权限。


在看到XPD 的回答中的评论后,我认为这就是正在发生的事情:

  1. 用户连接\\Foo\Bar\并手动输入用户名和密码。
  2. 用户从网络共享启动程序\\Foo\Bar\Baz.exe
  3. 程序将自身加载到 RAM 中并使用工作目录执行\\Foo\Bar\
  4. 加载程序看到程序需要运行提升并给出 UAC 提示并重新执行程序作为新的凭据
  5. 用户打开一个打开的文件对话框,并且没有InitalDirectory为该对话框设置。它使用步骤 #4 中设置的工作目录。
  6. 因为来自第 4 步的新凭证没有获得第 1 步生成的安全令牌的副本,所以程序的 AppDomain 没有访问权限\\Foo\Bar\
    1. 如果用户打开对话框并手动导航到路径,它将重新提示输入凭据。
    2. 但是,因为 InitalPath 设置为工作目录,所以在 UI 可以请求凭据并引发 FileIOPermission execption 之前发生错误。

有四种方法可以解决此问题,按首选选项的降序排列。

  1. 修改原程序以使用用户桌面作为InitialDirectory对话框
  2. 启动时修改程序的工作目录(例如通过从快捷方式启动并指定它)
  3. 修改权限,\\Foo\Bar以便用户无需手动输入凭据即可连接到它。
  4. 禁用 UAC。
于 2013-05-22T19:51:11.293 回答
1

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

于 2013-05-22T19:46:04.863 回答
0

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

于 2013-05-22T19:24:54.650 回答