3

クライアントから共有ドライブを持つサーバーにファイルをコピーしようとしています。これを行うUnauthorizedAccessExceptionと、コピーしようとしているこのパスへのアクセスが拒否されたと表示されます。私にはすべての権限があり、管理者としてログインしているので、これは非常に奇妙です。奇妙なことは、サーバー上の同じパスにあるテキスト ファイルに書き込むときに機能することです。このような:

FileStream fs = new FileStream(@"\\SIMON-VAIO\SimonShared\Users\Simon\Desktop\Files\Clients\clients.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

        using (StreamReader sr = new StreamReader(fs))
        {
            while (sr.Peek() >= 0) //as long as there are characters to read
            {
                ListViewItem lvwItem = new ListViewItem();
                lvwItem.Text = sr.ReadLine();
                AddListViewItem(lvwItem);
            }
            sr.Close();
        }

しかし、copy メソッドを実行すると、この例外が発生します。これが私がコピーする方法です:

FileInfo file = new FileInfo(sourcePath);
            string newPath = targetPath + "\\" + file.Name;
            File.Copy(sourcePath, newPath, true);

そのため、ソースとターゲットの両方のファイル名と拡張子を含むパス全体を入力します。

私は " File.SetAttributes(dest, FileAttributes.Normal);" のようなものと、マップ上のセキュリティなど、サーバー上のすべてのものを試しました。

何が悪いのか分かりますか?たくさん助けていただければ幸いです!

前もって感謝します

4

3 に答える 3

1

特にそのファイルの読み取り/書き込み権限は持っているかもしれませんが、フォルダー自体にはありません。そのため、その場所に新しいファイルを作成できない理由の 1 つです。

また、UAC を有効にしている場合、(管理者として実行して) 明示的に付与しない限り、アプリケーションは管理者権限を「継承」しないことに注意してください。

于 2013-03-27T15:08:57.893 に答える
1

その特定の問題は、次の問題が原因で発生する可能性があります。

  • ドライブへの無効なアクセス
  • フォルダへの無効なアクセス
  • ファイルを上書きまたは移動するための無効なアクセス。

パスの場所に基づいて、それは別のコンピューターであると私は信じています。タスクを実行するために必要なアクセシビリティ要件を満たしていることを確認する必要があります。

これは、いくつかの異なる方法で実現できます。

  • 適切な権限昇格のテストを作成します。
  • プログラムで管理者またはネットワーク サービス アカウントを偽装しようとします。
  • アクセス許可を操作する前に、アクセス許可を照会できます。

それらはあなたがそれを行うことができるいくつかの方法です.

UAC に対してテストすることもできます。

WindowsIdenetity user = WindowsIdentity.GetCurrent();
WindowsPrincipal role = new WindowsPrincipal(user);

if (Environment.OSVersion.Platform == PlatformId.Win32NT) && (Environment.OSVersion.Version.Major > 6)
{
     if(!(String.NullOrEmpty(user.ToString())))
     {
          if(role.IsInRole(WindowsBuiltInRole.Administrator)
          {
              // Good
          }
     }
}

これは、実際に適切な役割を果たしていることを確認する方法です。そうでない場合は、実際に aMessageBoxまたはその他の手段を記述して、不十分な権限を示すことができます。

ディレクトリを照会することもできます。

string remotePath = @"\\SomeLocation";
bool IsAccess = false;

DirectoryInfo di = new DirectoryInfo(remotePath);
if(di.Exists)
{
    try
    {
        var acl = di.GetAccessControl();
        IsAccess= true;
    }
    catch(UnauthorizedAccessException ex)
    {
       if(ex.Message.Contains("read-only"))
       {
           IsAccess = true;
       }
       else
       {
           // No Access Fail, do something else.
       }
    }
}

ご覧のとおり、この場合はかなりの柔軟性があります。うまくいけば、これはあなたを少し助けます.

于 2013-03-27T15:09:05.903 に答える
0

申し訳ありませんが、問題は、最初にドライブを共有したときにアクセス許可を「フル コントロール」に変更するのを忘れて、読み取りアクセス許可しか持っていなかったことです。これにより、コンピューターは共有ネットワークを介した読み取り以外のことを行うことができなくなりました。もう一度ごめんなさい、私のせいです!とにかくあなたの助けに本当に感謝します、ありがとう!

于 2013-03-28T11:49:56.593 に答える