Как использовать CACLS в c # windows service - PullRequest
1 голос
/ 08 марта 2012

Я хочу заблокировать определенную папку у пользователей, используя сервис c #.это означает, что когда вы запускаете сервис, хотя он заблокирован или нет, конечный результат - заблокированная папка.я написал кодно ответ вы уверены? , пожалуйста, помогите решить эту проблему

string Pathname = folder;
EventLog.WriteEntry(Pathname);
string Username = @"BUILTIN\Users";
string UserRights = "N";

if (Pathname == null || Pathname == "")
{
    EventLog.WriteEntry("No File");
}

string CommandLine = '"' + System.IO.Path.GetFullPath(Pathname) + '"' + " /C ";
CommandLine += @" /T ";
CommandLine += @" /P " + Username + ":" + UserRights;

Process p = new Process();
p.StartInfo.FileName = "cacls.exe";
p.StartInfo.Arguments = CommandLine;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
p.StartInfo.CreateNoWindow = true;

p.Start();

string Response = p.StandardOutput.ReadToEnd();
EventLog.WriteEntry(Response);
if (Response == null || Response == "")
{
    EventLog.WriteEntry("Error");
}

Ответы [ 2 ]

6 голосов
/ 08 марта 2012

Не вызывайте утилиту командной строки cacls, вместо этого используйте .NET API для изменения разрешений.Вызов утилит командной строки всегда следует рассматривать как последний обходной путь для выполнения задач.Гораздо лучше получить прямой доступ к API, предназначенному для программного доступа.

  • Directory.GetAccessControl(string) получает текущий ACL.
  • Directory.SetAccessControl(string, DirectorySecurity) устанавливает ACL.

Как правило, при работе с ACL лучше работать только с предоставлением прав и вообще не использовать флаги запрета.Отрицание BUILTIN\Users очень широко, и это отрицание отменяет любой грант, предоставленный любому пользователю .Лучше создать ACL, который не предоставляет никаких прав обычным пользователям и дает права только определенным пользователям, которые должны иметь доступ.

1 голос
/ 08 марта 2012

Вы перенаправляете стандартный ввод для процесса CACLS.
Таким образом, вам нужно передать процесс с помощью ввода (например, поток. Writeline ("Y");)
Посмотрите на этот образец из MSDN

StreamWriter myStreamWriter = myProcess.StandardInput;
myStreamWriter.Writeline("Y"); // Could it be localized ??? -->Oui, Ja, Sì etc...
myStreamWriter.Close();  // This seems to be is important.....
...