C#命令行SetACL

时间:2011-03-07 09:21:24

标签: c# command-line file-permissions

我正在尝试修复文件夹上所有者的问题。我正在使用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%文件夹。

2 个答案:

答案 0 :(得分:0)

如果按照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.
}

答案 1 :(得分:0)

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

您有两种选择:

  1. 使用Environment.GetEnvironmentVariable在C#代码中展开“%temp%”。
  2. 通过cmd调用SetACL,如下所示:cmd / c SetACL -on%temp%-ot file ...