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)) に設定するだけで、問題が解決するはずです。


質問を読み直したところ、ソースを変更できないことがわかりました。私が提案できることは2つだけです。問題を抱えているユーザーは、ショートカットを使用してプログラムを起動し、作業ディレクトリをローカル パスに設定します。元のプログラマーが a を設定しなかった場合、InitalDirectoryデフォルトで作業ディレクトリになります。

もう 1 つチェックする必要があるのは、新しいドメインに移動したと言ったことです。ユーザーが、プログラムが通信しようとしているフォルダーへのアクセス許可を持っていることを確認してください。おそらく、権限が正しく移行されていない可能性があります。


XPD の回答でコメントを見た後、これが起こっていると思います。

  1. ユーザーが接続し\\Foo\Bar\、ユーザー名とパスワードを手動で入力します。
  2. ユーザーはネットワーク共有からプログラムを開始します\\Foo\Bar\Baz.exe
  3. プログラム自体が RAM にロードされ、次の作業ディレクトリで実行されます。\\Foo\Bar\
  4. ローダーは、プログラムを昇格して実行する必要があることを認識し、UAC プロンプトを表示して、プログラムを新しい資格情報として再実行します。
  5. ユーザーがファイルを開くダイアログを開き、ダイアログに noInitalDirectoryが設定されました。手順 4 で設定した作業ディレクトリを使用します。
  6. 手順 4 の新しい資格情報は、手順 1 で生成されたセキュリティ トークンのコピーを取得しないため、プログラムの AppDomain には にアクセスする権限がありません\\Foo\Bar\
    1. ユーザーがダイアログを開いて手動でパスに移動した場合、資格情報の再入力を求められます。
    2. ただし、InitalPath が作業ディレクトリに設定されているため、UI が資格情報を要求する前にエラーが発生し、FileIOPermission execption がスローされます。

これを修正するには、優先オプションの降順で 4 つの方法があります。

  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 に答える