2011-03-07 43 views
1

我正在嘗試解決文件夾上所有者的問題。我正在使用SetACL。我可以使用cmd並使參數有效,但是當我嘗試將其添加到程序中時...它不起作用。我已經設定了一個斷點以確保參數傳遞正確並且是正確的。歡迎任何幫助。C#命令行SetACL

 Process p = new Process(); 

     if (Wow.Is64BitOperatingSystem == true) 
     { 
      p.StartInfo.FileName = "SetACLx64.exe"; 
     } 
     else 
     { 
      p.StartInfo.FileName = "SetACLx86.exe"; 
     } 

     string command = @" -on """ + path + 
      @""" -ot file -actn setprot -op ""dacl:np;sacl:nc"" -actn setowner -ownr ""n:" + account + @";"" -rec cont_obj"; 
     p.StartInfo.Arguments = command; 
     p.Start(); 

我已經得到了這個工作在同一個程序中的註冊表問題沒有麻煩。只是不能讓這個例子工作。我試圖設置的文件夾是%temp%文件夾。

+0

是您的進程(與調試時)運行的管理? – 2011-03-07 09:39:34

+0

是的。我可以用其他文件夾來完成,而不是臨時文件夾 – 2011-03-07 09:58:59

+0

如果你的語法正確,它應該可以工作。嘗試通過批處理文件來做到這一點。 'Process.Start(「test.bat」,「%temp%」);'並使用%1接收bat文件中的第一個參數。 – 2011-03-07 10:03:54

回答

0

如果正在運行的管理作爲Sanjeevakumar然後問

嘗試刪除在命令變量的第一個空間。參數參數不要求爲參數提供初始空間。可能是導致問題的原因。

也可以在調用Start()方法之前添加以下幾行來嘗試訪問進程的錯誤數據。

p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardError = true; 
p.ErrorDataReceived += new DataReceivedEventHandler(ErrorDataHandler); 

然後定義事件處理程序。

private static void ErrorDataHandler(object sendingProcess, DataReceivedEventArgs e) 
{ 
    //using the DataReceivedEventArgs see if there is an error. 
    //If it comes there there is most likely an error. 
} 
+0

沒有錯誤消息:( – 2011-03-07 11:03:02

+0

@John Andrews嘗試tqapping到輸出流(類似於我已經顯示的攻擊錯誤流),看看是否有輸出。 – 2011-03-07 19:15:02

0

因此,當路徑爲「%temp%」時,您的代碼不起作用?在這種情況下,解決方案很簡單:可變擴展不是由SetACL完成,而是在SetACL之前的命令shell甚至啓動。如果直接啓動SetACL而不調用cmd.exe,則永遠不會發生變量擴展。

你有兩個選擇:

  1. 在C#代碼展開 「%temp%」 與Environment.GetEnvironmentVariable
  2. 通過電話這樣的CMD SETACL:CMD/C SETACL -on%TEMP%-ot文件...