1

C# サービスを使用して、特定のフォルダーをユーザーからブロックしたい。つまり、サービスがブロックされているかどうかに関係なく、サービスを開始すると、最終的な結果はブロックされたフォルダーになります。私はコードを書きました。しかし、応答はよろしいですか?これを解決するのを手伝ってください

string Pathname = folder;
EventLog.WriteEntry(Pathname);
string Username = @"BUILTIN\Users";
string UserRights = "N";

if (Pathname == null || Pathname == "")
{
    EventLog.WriteEntry("No File");
}

string CommandLine = '"' + System.IO.Path.GetFullPath(Pathname) + '"' + " /C ";
CommandLine += @" /T ";
CommandLine += @" /P " + Username + ":" + UserRights;

Process p = new Process();
p.StartInfo.FileName = "cacls.exe";
p.StartInfo.Arguments = CommandLine;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
p.StartInfo.CreateNoWindow = true;

p.Start();

string Response = p.StandardOutput.ReadToEnd();
EventLog.WriteEntry(Response);
if (Response == null || Response == "")
{
    EventLog.WriteEntry("Error");
}
4

2 に答える 2

6

コマンド ラインcaclsユーティリティを呼び出すのではなく、.NET API を使用して権限を変更してください。コマンド ライン ユーティリティの呼び出しは、常に、タスクを実行するための最後の回避策と見なす必要があります。プログラムによるアクセスを目的とした API に直接アクセスする方がはるかに優れています。

  • Directory.GetAccessControl(string)現在の ACL を取得します。
  • Directory.SetAccessControl(string, DirectorySecurity)ACL を設定します。

一般に、ACL を操作する場合は、権限の付与のみを操作し、拒否フラグをまったく使用しない方が適切です。拒否BUILTIN\Usersは非常に広範囲であり、その拒否は、ユーザーへの許可を無効にします。通常のユーザーには権限を付与せず、アクセス権を持つ特定のユーザーにのみ権限を付与する ACL を作成することをお勧めします。

于 2012-03-08T08:23:12.523 に答える
1

CACLS プロセスの標準入力をリダイレクトしています。
したがって、プロセスに入力を供給する必要があります (stream.Writeline("Y"); のように) MSDN
のこのサンプルを見てください。

StreamWriter myStreamWriter = myProcess.StandardInput;
myStreamWriter.Writeline("Y"); // Could it be localized ??? -->Oui, Ja, Sì etc...
myStreamWriter.Close();  // This seems to be is important.....
于 2012-03-08T08:21:04.770 に答える