Запуск cmd.exe из службы Windows 7,8
Задача тривиальная: есть файл, который нужно контролировать. Если он меняется (содержимое, права доступа, атрибуты), то подменять его на спрятанный в закромах и дополнительно изменять права доступа и атрибуты на стандартные.
Раньше справлялся с подобной задачей используя cmd скрипты + планировщик заданий, но решил перейти на новый уровень - создать контролирующую процедуру.
Она каждые n-минут проверяет файл и решает, что с ним делать: не менять, если он оригинальный; менять, если его подменили.
Я завис на проблеме сброса к стандартным прав доступа на файл и его родительскую директорию (подобно тому, что делает команда icacls C:\ВашаПапка /reset /T) поскольку при запуске службы и этой команды в ней ничего не происходит (хотя при запуке из консоли работает как часы).
Код:
if (file1.Length == file2.Length) //сравнение файлов
{
AddLog("File OK! " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")); //всё хорошо
}
else
{
AddLog("File NOT OK! " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")); //нужно принимать меры
Process.Start("cmd.exe", "/C " + "icacls C:\\Users\\%USERNAME%\\AppData\\Roaming\\target\\ /reset /T"); //сброс прав доступа
Thread.Sleep(1000); //ждем 1 секунду
File.SetAttributes(file1path, FileAttributes.Normal); //сброс атрибутов
File.Delete(file1path); //удаляем нерадивый файлик
File.Copy(file2path, file1path); //заменяем заранее приготовленным
File.SetAttributes(file1path, FileAttributes.Hidden | FileAttributes.ReadOnly); //устанавливаем стандартные атрибуты
Process.Start("cmd.exe", "/C " + "secedit /configure /db temp.sdb /cfg relutp.inf"); //устанавливаем стандартные права доступа
AddLog("File changed at " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")); //задача решена
}
{
AddLog("File OK! " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")); //всё хорошо
}
else
{
AddLog("File NOT OK! " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")); //нужно принимать меры
Process.Start("cmd.exe", "/C " + "icacls C:\\Users\\%USERNAME%\\AppData\\Roaming\\target\\ /reset /T"); //сброс прав доступа
Thread.Sleep(1000); //ждем 1 секунду
File.SetAttributes(file1path, FileAttributes.Normal); //сброс атрибутов
File.Delete(file1path); //удаляем нерадивый файлик
File.Copy(file2path, file1path); //заменяем заранее приготовленным
File.SetAttributes(file1path, FileAttributes.Hidden | FileAttributes.ReadOnly); //устанавливаем стандартные атрибуты
Process.Start("cmd.exe", "/C " + "secedit /configure /db temp.sdb /cfg relutp.inf"); //устанавливаем стандартные права доступа
AddLog("File changed at " + DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")); //задача решена
}
Заранее благодарю за помощь!
P.S. Пишется это дело в VS2010 на C# под Windows 7 или 8
Or icacls папка\файл /setowner Пользователь параметры
Код:
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
// Введите параметры, что в консоли CMD
startInfo.Arguments = " ***************************** "; // Должно сейчас работать
process.StartInfo = startInfo;
process.Start();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
// Введите параметры, что в консоли CMD
startInfo.Arguments = " ***************************** "; // Должно сейчас работать
process.StartInfo = startInfo;
process.Start();
Разрешите своей службе взаимодействовать с рабочим столом: Свойства службы->Вход в систему.
Код:
Process.Start("cmd.exe", "/C " … )
И да, по таймеру с таким интервалом проверять — дело неблагодарное. Можно следить за изменениями и сразу реагировать на них