2011-03-07 47 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文件...