C# C命令行SetACL

C# C命令行SetACL,c#,command-line,file-permissions,C#,Command Line,File Permissions,我正在尝试修复文件夹所有者的问题。我正在使用SetACL。我可以使用cmd并使参数起作用,但当我尝试将其添加到程序中时……它不起作用。我已经设置了一个断点,以确保参数正确传递,并且它是正确的。欢迎任何帮助 Process p = new Process(); if (Wow.Is64BitOperatingSystem == true) { p.StartInfo.FileName = "SetACLx64.exe";

我正在尝试修复文件夹所有者的问题。我正在使用SetACL。我可以使用cmd并使参数起作用,但当我尝试将其添加到程序中时……它不起作用。我已经设置了一个断点,以确保参数正确传递,并且它是正确的。欢迎任何帮助

        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%文件夹。

如果它像Sanjeevakumar当时询问的那样以管理员身份运行

尝试删除命令变量中的第一个空格。Arguments参数不要求为参数提供初始空间。这可能是导致问题的原因

在调用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.
}

所以当路径为%temp%时,代码不起作用?在这种情况下,解决方案很简单:变量扩展不是由SetACL完成的,而是在SetACL启动之前由命令shell完成的。如果直接启动SetACL而不调用cmd.exe,则永远不会发生变量扩展

您有两个选择:

使用展开C代码中的%temp%。 通过cmd调用SetACL,如下所示:cmd/c SetACL-on%temp%-ot文件。。。
您的进程与调试时的进程是否以管理员身份运行?是的。我可以用其他文件夹,但不是临时文件夹。如果语法正确,它应该可以工作。尝试通过批处理文件执行此操作。过程启动测试bat,%temp%;并使用%1接收bat文件中的第一个参数。与.bat文件一起使用。只是好奇为什么它在程序中不起作用?@John Andrews尝试将tqapping应用到输出流中,类似于我显示的点击错误流并查看是否有输出的方式。