2012-03-08 6 views
1

私は、c#サービスを使用して、ユーザーから特定のフォルダをブロックしたいと考えています。つまり、サービスがブロックされているにもかかわらずサービスを開始すると、最終的な結果はブロックされたフォルダになります。私はコードを書いた。回答はですか?あなたはCACLSプロセスの標準入力をリダイレクトしている。このc#windowsサービスでCACLSを使用する方法

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"); 
} 

答えて

1

を解決するために助けてください。
だから、あなたが入力してプロセスを供給する必要があります。このsample from MSDN

StreamWriter myStreamWriter = myProcess.StandardInput; 
myStreamWriter.Writeline("Y"); // Could it be localized ??? -->Oui, Ja, Sì etc... 
myStreamWriter.Close(); // This seems to be is important..... 
+0

私はp.StandardInput.WriteLine( "Y")を試しました。とあなたの方法は、両方が動作しません – lankitha

+0

私は私の答えを更新しました – Steve

5


ルックを使用代わりに、コマンドラインユーティリティcaclsを呼び出さないでください(stream.Writeline(「Y」)のように)アクセス許可を変更する.NET API。コマンドラインユーティリティの呼び出しは、タスクを実行するための最後の回避策として常に見なされるべきです。プログラマチックなアクセスを目的としたAPIに直接アクセスする方がはるかに優れています。

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

一般に、ACLを使用して作業する場合は、権限を付与するだけで動作し、拒否フラグはまったく使用しないことをお勧めします。拒否するBUILTIN\Usersは非常に広範であり、拒否すればユーザーに付与された任意の付与を無効にします()。通常のユーザーには何の権限も与えず、アクセスを必要とする特定のユーザーにのみ権限を与えるACLを構築する方がよいでしょう。

関連する問題