Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запуск cmd.exe из службы Windows 7,8

32K
28 ноября 2012 года
Lazarus Long
5 / / 29.11.2007
Доброго времени суток!

Задача тривиальная: есть файл, который нужно контролировать. Если он меняется (содержимое, права доступа, атрибуты), то подменять его на спрятанный в закромах и дополнительно изменять права доступа и атрибуты на стандартные.
Раньше справлялся с подобной задачей используя 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")); //задача решена
            }
Прошу помочь решить подобную задачу, которая состоит в запуске нужного мне процесса из под службы Windows или хотя бы подскажите, как возможно делать подобный сброс с помощью DirectorySecurity или FileSecurity.

Заранее благодарю за помощь!

P.S. Пишется это дело в VS2010 на C# под Windows 7 или 8
327
28 ноября 2012 года
UserNet2008
748 / / 03.04.2010
Как вариант


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();
6.4K
15 марта 2013 года
Host
122 / / 22.09.2005
Разрешите своей службе взаимодействовать с рабочим столом: Свойства службы->Вход в систему.
7
16 марта 2013 года
@pixo $oft
3.4K / / 20.09.2006
 
Код:
Process.Start("cmd.exe", "/C ")
Вот это — лишнее. Зачем консоль интерпретатора запускать? Сразу ICACLS и SecEdit запускай с нужными атрибутами
И да, по таймеру с таким интервалом проверять — дело неблагодарное. Можно следить за изменениями и сразу реагировать на них
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог