C # командная строка SetACL - PullRequest
1 голос
/ 07 марта 2011

Я пытаюсь решить проблему с владельцем в папке. Я использую 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 голосов
/ 07 марта 2011

То есть ваш код не работает, когда путь равен "% temp%"?В этом случае решение простое: расширение переменной не выполняется SetACL, а командная оболочка еще до запуска SetACL.Если вы запускаете SetACL напрямую, не вызывая cmd.exe, то расширение переменной никогда не происходит.

У вас есть два варианта:

  1. Расширить "% temp%" в коде C # с помощью Environment.GetEnvironmentVariable .
  2. Вызовите SetACL через cmd следующим образом: cmd / c SetACL -on% temp% -ot file ...
0 голосов
/ 07 марта 2011

Если он работает от имени администратора, как просил Сандживакумар, тогда

Попробуйте удалить первый пробел в вашей командной переменной.Параметр 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.
}
...