6

DirectoryInfoCドライブのルートにあるすべてのディレクトリを簡単に取得しています。ただし、管理者の下で実行していると、パス アクセスが拒否されたというエラーが表示されます。以下は実行中のコードです。パス アクセスの問題を解決するにはどうすればよいですか?

DirectoryInfo Dinfo = new DirectoryInfo(@"C:\");
DirectoryInfo[] directories = Dinfo.GetDirectories("*.*", SearchOption.AllDirectories);
4

4 に答える 4

4

新しいバージョンの Windows では、ファイル システムのショートカットの一種でC:\Document and Settingsあるジャンクション ポイントがあります。これは通常のディレクトリではありません。つまり、実際には通常のディレクトリとして機能しません。

start->run ボックスに入力C:\Document and Settingsすると、アクセス拒否エラーも表示されるため、プログラムに固有のものではありません。

ただし、これがどのように機能するかについては少し混乱しています。接合点は新しい場所への透明なリンクになると思いましたがc:\users、明らかにそうではありません。

編集

重複した質問を見た後、私は混乱しなくなりました。ジャンクション ポイントは、新しい場所である に実際にリンクしていますc:\users。ただし、ジャンクション ポイントで読み取りを行うための明示的な拒否 ACL があり、誰もそれを使用して内容を読み取れないようにしています。

C:>cacls "Documents and Settings" C:\Documents and Settings Everyone:(DENY)(特別なアクセス:)

                               FILE_READ_DATA

                      Everyone:R
                      NT AUTHORITY\SYSTEM:F
                      BUILTIN\Administrators:F

子:>

于 2012-06-09T19:27:09.457 に答える
1

管理者として実行している場合でも、問題が発生する可能性があります

  • UAC がアクティブです。「run as...」を使用して修正します
  • 明示的に所有権を取得した場合にのみアクセスできるフォルダー。
于 2012-06-09T19:29:02.487 に答える
1

C:\Document and Settings はジャンクション ポイントであり、さらに、C:\ ルートに配置されているシステム ボリューム情報ディレクトリにアクセスできません。コードを実行するには、セキュリティ例外をトラップしてスキップする必要があります。

于 2012-06-09T19:31:30.003 に答える
-1
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security;
using System.Text;
using System.Threading.Tasks;

namespace Solution
{
    public class Program
    {
 static void Main(string[] args)
        {
            DirSearch(@"YOUR PATH");
            Console.ReadKey();
        }

        static void DirSearch(string dir)
        {
            try
            {
                foreach (string f in Directory.GetFiles(dir))
                    Console.WriteLine(f);
                foreach (string d in Directory.GetDirectories(dir))
                {
                    Console.WriteLine(d);
                    DirSearch(d);
                }

            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
于 2015-09-24T06:55:21.550 に答える