Запускаем приложение как системную службу. Установка службы

На iOS - iPhone, iPod touch 10.04.2019
На iOS - iPhone, iPod touch

Доброго дня. Сегодня в любом городе (даже сравнительно небольшом городке) можно найти далеко не одну фирму (сервис-центров), занимающуюся ремонтом самой различной техники: компьютеров, ноутбуков, планшетов, телефонов, телевизоров и т.д.

По сравнению с 90-ми годами, сейчас нарваться на откровенных мошенников шанс небольшой, но нарваться на сотрудников, которые обманывают «по мелочи» - более чем реально. В этой небольшой статье хочу рассказать, как обманывают при ремонте различной техники. Предупрежден - значит вооружен! И так…

«Белые» варианты обмана

Почему белые? Просто эти варианты не совсем честной работы нельзя назвать противозаконными и, чаще всего, на них попадается невнимательный пользователь. Кстати, подобными махинациями занимается большинство сервис-центров (к сожалению)…

Вариант №1: навязанные дополнительные услуги

Простой пример: сломался у пользователя какой-нибудь разъем на ноутбуке. Стоимость оного 50-100р. плюс сколько-то стоит работа сервисного мастера. Но вам так же скажут, что на компьютер неплохо бы установить антивирус, провести чистку от пыли, заменить термопасту и пр. услуги. Часть из них вам совершенно не нужна, но многие соглашаются (тем более, когда их предлагают люди с умным видом и с умными словами).

В результате, стоимость похода в сервис-центр вырастает, порой, в несколько раз!

Вариант №2: «скрытие» стоимости некоторых услуг (изменение цены услуг)

Некоторые «хитрые» сервис-центры очень хитро разграничивают стоимость ремонта и стоимость запчастей. Т.е. когда вы придете забирать свою отремонтированную технику, с Вас могут взять еще и деньги за замену каких-то деталей (или за сам ремонт). Причем, если начнете изучать договор - то окажется, что на самом деле такое в нем прописано, но мелким шрифтом с обратной стороны листа договора. Доказать такой подвох - достаточно сложно, так как вы заранее сами согласились на подобный вариант…

Вариант №3: стоимость ремонта без диагностики и осмотра

Очень популярный вариант обмана. Представьте ситуацию (наблюдал сам): приносит один мужик в фирму по ремонту ПК у которого нет картинки на мониторе (вообще, такое чувство - отсутствует сигнал). Ему сходу заряжают стоимость ремонта в несколько тысяч рублей, даже без первоначального осмотра и диагностики. А причиной такого поведения может быть как и вышедшая из строя видеокарта (тогда стоимость ремонта, возможно, будет оправдана), так и просто повреждение кабеля (стоимость которого копейки…).

Никогда не наблюдал, чтобы сервис-центр сам проявил инициативу и возвращал средства в связи с тем, что стоимость ремонта оказалась ниже предоплаты. Обычно, картина противоположная…

Вообще, в идеале : когда вы приносите устройство на ремонт, с вас берут деньги только на диагностику (если поломка не видна или очевидна). В последствии, вам сообщают о том, что сломалось и сколько это будет стоить - если вы согласны, то фирма производит ремонт.

«Черные» варианты развода

Черные - потому, как в этих случаях вас просто разводят на деньги, причем грубо и обидно. Такое мошенничество строго наказывается законодательством (правда, сложно-доказуемо, но вполне реально).

Вариант №1: отказ в гарантийном обслуживании

Встречается такие казусы редко, но происходят. Суть в том, что вы покупаете технику - она ломается, и вы идете в сервисный-центр, осуществляющий гарантийное обслуживание (что логично). В нем вам заявляют: что вы что-то нарушили и поэтому это не гарантийный случай, но за деньги они готовы вам помочь и сделать все таки ремонт…

В результате такая фирма получит деньги и с изготовителя (которому, они представят это все в качестве гарантийного случая) и с вас за ремонт. Не попасться на эту уловку достаточно сложно. Могу порекомендовать позвонить (или написать на сайте) производителю самостоятельно и поинтересоваться, на самом деле такая причина (которую называет сервис-центр) является отказом в гарантии.

Вариант №2: замена запчастей в устройстве

Встречается так же достаточно редко. Суть обмана в следующем: вы приносите на ремонт технику, а вам меняют в ней половину запчастей на более дешевые (не зависимо от того, починили ли вам устройство или нет). Кстати, а если вы откажетесь от ремонта, то и так в сломанное устройство могут поставить и другие сломанные запчасти (вы ведь не сможете сразу же проверить их работоспособность)…

Не попасться на такой обман - очень сложно. Можно порекомендовать следующее: использовать только проверенные сервис-центры, так же можно сфотографировать как выглядят некоторые платы, их серийные номера и пр. (достать точно такую же, как правило, очень сложно).

Вариант №3: устройство не подлежит ремонту - продайте/оставьте нам на запчасти…

Иногда сервис-центр заведомо предоставляет лживую информацию: якобы ваше сломанное устройство ремонту не подлежит. Говорят что-то вроде этого: «…можете забрать, ну или оставить нам за символическую сумму»…

Многие пользователи после этих слов не идут в другой сервис-центр - тем самым попадая на уловку. В результате сервис-центр ремонтирует ваше устройство за копейки, а затем перепродает его…

Вариант №4: установка старых и «левых» запчастей

У разных сервис-центров - разное время гарантии на отремонтированное устройство. Чаще всего дают от двух недель - до двух месяцев. Если время очень маленькое (неделя или две) - вполне вероятно, что сервис-центр просто не рискует, из-за того, что устанавливает вам не новую деталь, а старую (например, уже долгое время проработавшую у другого пользователя).

В этом случае часто бывает, что после истечения гарантийного времени - устройство снова ломается и приходится снова платить за ремонт…

Сервис-центры, которые работают честно, устанавливают старые детали в тех случаях, когда новые такие же уже не выпускают (ну ли горят сроки ремонта и клиент дает согласие на это). Причем, предупреждают об этом клиента.

На этом у меня все. За дополнения буду благодарен 🙂

В JDownloader перейдите в Настройки , далее вкладка Менеджер соединений и нажмите на кнопку Добавить . Замените тип на Socks5 , в поле Хост/порт введите localhost и 9050 :

Нажмите ОК для сохранения настроек и закрытия окна.

JDownloader ротирует соединения. Поэтому если вы скачиваете с заблокированного сайта, то снимите галочку с соединения Без прокси :

Теперь вы снова можете не только просматривать, но и скачивать с заблокированных сайтов!

Настройка скрытого сервиса в Windows

Суть работы скрытого сервиса заключается в том, что на вашем компьютере (это может быть арендованный или ваш домашний компьютер) работает веб-сервер. Ваш компьютер должен иметь доступ к сети Tor. Через эту сеть любой имеющий адрес вашего скрытого сервиса (домен вида *.onion), может зайти на ваш сайт, который обслуживает ваш веб-сервер. Вам не нужно беспокоится о приобретении доменного имени (даётся бесплатно), о DNS, белых IP и т.д. – сеть Tor сама об этом позаботиться. Для запуска скрытого сервиса требуется только две вещи:

  • работающий веб-сервер
  • подключение к сети Tor

Если у вас Linux, то вам может подойти материал « ». Если же вы хотите запустить скрытый сервис из Windows, то далее написано, как это сделать.

Нам нужно, чтобы у нас был рабочий веб-сервер.Нужно установить веб-сервера (Apache 2.4, MySQL 5.7, PHP 7, phpMyAdmin) на Windows 10.

Теперь, когда веб-сервер установлен и его работоспособность проверена, приступим к настройке скрытого сервиса в Windows.

Ваш сайт для скрытого сервиса должен уже работать и открываться с локалхоста. Я создам страницу-заглушку для демонстрации работы. В папке C:\Server\data\htdocs\ я создаю новую папку hidden , а в ней файл index.htm со следующим соедржимым:

< title >Работает!

< meta charset = "UTF-8" >

Скрытый сервис работает!

Следовательно, этот файл доступен с локального сервера по адресу http://localhost/hidden/:

Теперь открываем конфигурационный файл Apache C:\Server\bin\Apache24\conf\httpd.conf и дописываем туда:

Listen 127.0.0.1:9475 DocumentRoot "C:/Server/data/htdocs/hidden/" ServerName localhost ServerAdmin Options +Indexes +FollowSymLinks +ExecCGI AllowOverride All Order deny,allow Allow from all Require all granted

В принципе, вам достаточно отредактировать в нём только строчку DocumentRoot «C:/Server/data/htdocs/hidden/» – она показывает путь до вашего веб-сайта, который будет скрытым сервисом Tor.

Перезапускаем веб-сервер Apache, чтобы изменения вступили в силу:

c:\Server\bin\Apache24\bin\httpd.exe -k restart

Теперь ваш сайт для скрытого сервиса должен быть доступен с локального компьютера по адресу http://localhost:9475

Переходим к настройке Tor.

Откройте любым текстовым редактором файл C:\Tor\torrc и скопируйте в него:

HiddenServiceDir "C:/Tor/hidden_service/" HiddenServicePort 80 127.0.0.1:9475

Обратите внимание, как мы записали C:\Tor\hidden_service\ — вместо \ мы используем / . Также обязательно нужно использовать кавычки.

Перезапустите службу Tor:

C:\Tor\tor.exe --service stop C:\Tor\tor.exe --service start

Автоматически будет сгенерирована папка hidden_service и два файла в ней. В файле C:\Tor\hidden_service\hostname вы увидите доменное имя для вашего скрытого сервиса:

В моём случае это 77pam5zhvzu5jhst.onion, пробуем открыть в браузере Tor:

Может понадобиться несколько минут, прежде чем скрытый сервис будет открываться в браузере.

Если вы сгенерировали своё собственное имя скрытого сервиса Tor, то замените содержимое файла hostname и private_key , а после этого перезапустите службу Tor, чтобы изменения вступили в силу:

Использование Tor браузерами в Windows

Если вы хотите анонимно сёрфить в интернете, то рекомендуется использовать браузер Tor. Он не только перенаправляет трафик через сеть Tor, но и имеет ряд патчей и настроек, способствующих приватности.

Тем не менее, если вы хотите заходить в Интернет через сеть Tor используя браузеры Google Chrome, Firefox, Opera или Internet Explorer, то это также возможно.

У вас должна быть установлена (или запущена как показано в начале статьи) служба Tor.

Браузеры Google Chrome, Opera и Internet Explorer используют одни и те же настройки. Т.е. внесённые изменения будут действовать сразу для всех трёх браузеров. В любом из них перейдите к настройкам Прокси, откроется такое окно:

В окне нажмите «Настройка сети ». В открывшемся новом окне поставьте галочку «Использовать прокси сервер для локальных подключений… »:

Станет активной кнопка «Дополнительно », нажмите её. В поле Socks введите 127.0.0.1 , а в поле Порт введите 9050 :

Нажмите во всех окнах ОК для сохранения сделанных настроек. Текущий IP можно, например, проверить на странице

Для изменения настроек в Firefox перейдите в Настройки -> Дополнительные -> Сеть -> Настроить . В открывшемся окне поставьте переключатель на Ручная настройка сервера прокси . В поле Узел SOCKS введите 127.0.0.1 , а поле Порт 9050 . Поставьте переключатель на SOCKS 5 . Нажмите ОК для сохранения настроек.

Общесистемные настройки прокси в Windows

В Windows имеется программа WinHTTP прокси. Она позволяет устанавливать настройки прокси для системы в целом. По логике ожидается, что все приложения должны использовать общесистемные настройки, но этого не происходит. Windows использует WinHTTP для определённых служб, например, для загрузки обновлений Windows и выполнения проверок на аннулированные сертификаты. Тем не менее, возможно, вы найдёте применение этому.

С помощью команды

netsh winhttp import proxy source=ie

вы можете импортировать настройки из Internet Explorer.

А следующими командами вы можете просмотреть/сбросить использование общесистемных настроек:

netsh winhttp show proxy netsh winhttp reset proxy

Доступ в Tor из PHP программы

Если вы установили службу Tor и для настройки скрытого сервиса вы установили веб-сервер, то вы также можете получать данные из сети Tor в вашей PHP программе (используя cURL). Пример рабочего кода:

$url = "http://hacktoolseqoqaqn.onion/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_PROXY, "http://127.0.0.1:9050/"); curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); curl_setopt($ch, CURLOPT_PROXYTYPE, 7); $output = curl_exec($ch); $curl_error = curl_error($ch); curl_close($ch); print_r($output); print_r($curl_error);

Данный материал является зеркалом статьи сайта Заметки о WINDOWS с некоторыми примечаниями из личного опыта.

Иногда может потребоваться взять исполняемый файл и зарегистрировать его в качестве службы Windows. Для этого есть несколько способов. Два из них приведены ниже.

Для создания и службы из командной строки можно использовать программу SC (Sc.exe). SC представляет из себя утилиту командной строки, которая реализует вызовы ко всем функциям интерфейса прикладного программирования (API) управления службами Windows. С ее помощью можно производить любые действия со службами - просматривать состояние, управлять (запускать, останавливать и т.п.), изменять параметры, а также создавать новые службы.

При создании службы с помощью SC нет необходимости вручную создавать записи в реестре и затем перезагружать компьютер, чтобы обеспечить обновление базы данных диспетчером служб. Также SC позволяет указать имя удаленного компьютера, что дает возможность управлять службами как на локальном, так и на удаленном компьютере.

Для создания нового сервиса запускаем команду Sc create . Она создает запись службы в реестре и в базе данных диспетчера служб. Sc create имеет следующий синтаксис:

sc create

ServiceName - указывает имя, которое будет присвоено разделу службы в реестре. Имейте в виду, что это имя отличается от отображаемого имени службы (имени, которое отображается в оснастке «Services»);
binPath - указывает путь к исполняемому файлу службы.

Для примера создадим службу MyService, укажем отображаемое имя My New Service, зададим тип службы и поставим ее на авто-запуск:

Sc create MyService binPath=C:\MyService\MyService.exe DisplayName=″My New Service″ type=own start=auto

Затем откроем оснастку «Services» и посмотрим результат.

Изменять параметры уже созданной службы можно командой Sc config . Например, мне не понравилось отображаемое имя службы и я хочу его изменить:

Sc config MyService DisplayName=″My Service″

Ну и полностью удалить службу можно вот так:

Sc delete MyService


Примечание. Есть некоторые особенности использования утилиты sc. Например при создании сервиса в Windows XP необходимо ставить пробел перед аргументом, передаваемым параметру!

Если мы подадим команду:

C:\sc create Weblogic binPath=C:\Oracle\MiddleWare\user_projects\base_domain\startWeblogic.cmd DisplayName="WebLogic" type=share start=auto error=ignore

В ответ получим help по использованию sc без какого либо сообщения об ошибке:


Подаем ту же команду вставив пробелы после символа "=":

C:\>sc create Weblogic binPath= C:\Oracle\MiddleWare\user_projects\base_domain\startWeblogic.cmd DisplayName= "WebLogic" type= share start= auto error= ignore

CreateService SUCCESS

Вот такая недокументированная особенность.

Так же необходимо внимательно относится к прочим параметрам. В случае приведенном ниже изменены значения параметров start и type:

Получаем сообщение

CreateService FAILED 87:

и после двоеточия никаких пояснений.

Подробное значение параметров можно посмотреть или .

Для изменения параметров системной службы нужно ввести новые параметры командой:

# sc config имя_службы start= параметр_запуска

Для того, чтобы запустить службу в ОС Windows нужно в консоли набрать:

# net start имя_службы

Для остановки службы:

# net stop имя_службы

Для перезагрузки службы:

# net restart имя_службы

Если требуется определить, какие службы будут зависеть от данной службы, можно набратьsc enumpend

Теперь, чтобы увидеть, какие службы находятся в зависимости от службы сервера под названием lanmanserver, надо подать команду

sc enumdepend Lanmanserver

Запуск такой команды на моем тестовом сервере Windows 2003, например, показывает, что службы Netlogon, Dfs, а также службы браузера компьютера находятся в зависимости от службы сервера.

Для завершения и определения зависимостей сервера можно воспользоваться подкомандой qc, как показано ниже

sc qc Lanmanserver

Эта команда выдает девять строчек информации о службе, одна из которых DEPENDENCIES. При запуске этой команды выясняется, что сервер не зависит ни от каких служб. Чтобы узнать, какие службы имеют более одной зависимости, можно протестировать диспетчер на службе Netlogon. Мы увидим, что служба Netlogon для начала работы требует запуска служб и сервера, и Workstation.

Иногда зависимости бывают более сложными. Например, некоторые службы могут начать работу, только если запущена одна из трех других служб. Запуск всех трех необязателен, вполне достаточно одной. Можно проинструктировать Windows по поводу такой динамики, информируя систему о том, что данная служба находится в зависимости от группы служб. В системе Windows имеется целый ряд таких служб, как, например, SCSI CDROM Class, SCSI miniport, Parallel arbitrator, NetBIOSGroup, NDIS, а также службы первичного диска и многие другие. Все эти службы и драйверы можно увидеть в списке групп, набрав

sc query type= service?driver?all group=

Например, чтобы посмотреть все службы и драйверы в группе служб первичного диска, нужно набрать

sc query type= all group=

Названия групп значения не имеют. Можно добавлять службы в имеющиеся группы или создавать новые группы служб, добавив команду group= groupname в команду SC Create или используя SC Config для сохранения службы в какую-либо группу. Например, чтобы добавить службу Webimagemailer в новую группу под названием unimportant, надо набрать

sc config webimagemailer group= unimportant

Однако нельзя поместить службу или драйвер в более чем одну группу служб.

Кроме того, можно сделать так, чтобы не происходила загрузка службы Webimagemailer без необходимой группы служб. Чтобы определить фиктивную группу Webstartup, воспользуемся параметром depends= webstartup. Чтобы указать Windows, что Webstartup - это группа, а не еще одна служба, следует перед ее именем поставить знак «плюс». Например, для перенастройки службы Webimagemailer на зависимость от группы запуска Webstartup, надо набрать

sc config webimagemailer depends= +webstartup

Таким образом, мы выяснили, как использовать зависимости и группы для более детального управления порядком загрузки службы. И теперь никто не удивится, почему я был так доволен, когда несколько лет назад обнаружил диспетчер SC.

PowerShell

PowerShell может почти все, в том числе и управлять службами Windows. Создать новую службу можно с помощью командлета New-Service . Создадим такой же сервис, как и в предыдущем примере, только добавим к нему описание (Description):

New-Service -Name MyService -BinaryPathName C:\MyService\MyService.exe`
-DisplayName ″My New Service″ -Description ″Very Important Service !!!″

Изменить параметры службы можно командлетом Set-Service :

Set-Service -Name MyService -Description ″Not Very Important Service″ -StartupType Manual


В принципе PowerShell имеет примерно такой же функционал как и Sc.exe, разве что позволяет добавить описание. А вот для удаления служб в PS простого способа нет, придется воспользоваться вот такой конструкцией:

(Get-WmiObject win32_service -Filter ″name=′MyService′″).delete()

Последнее обновление: 31.10.2015

Для установки службы нам понадобится класс установщика. Для его добавления нажмем правой кнопкой мыши на проект и в контекстном меню выберем Add - > Component... . Затем в окне добавления нового элемента выберем пункт Installer Class :

По умолчанию для файла установщика генерируется название Installer1.cs. Оставим это название.

После добавления узел установщика в окне обозревателя решения (Solution Explorer) будет содержать два файла: сам файл класса Installer1 и файл дизайнера Installer1.Designer.cs. Откроем файл кода. Сейчас он выглядит так:

Using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration.Install; using System.Linq; using System.Threading.Tasks; namespace FileWatcherService { public partial class Installer1: System.Configuration.Install.Installer { public Installer1() { InitializeComponent(); } } }

Теперь изменим его следующим образом:

Using System.ComponentModel; using System.ServiceProcess; using System.Configuration.Install; namespace FileWatcherService { public partial class Installer1: Installer { ServiceInstaller serviceInstaller; ServiceProcessInstaller processInstaller; public Installer1() { InitializeComponent(); serviceInstaller = new ServiceInstaller(); processInstaller = new ServiceProcessInstaller(); processInstaller.Account = ServiceAccount.LocalSystem; serviceInstaller.StartType = ServiceStartMode.Manual; serviceInstaller.ServiceName = "Service1"; Installers.Add(processInstaller); Installers.Add(serviceInstaller); } } }

Класс установщика унаследован от класса System.Configuration.Install.Installer . Атрибут указывает на то, что класс Installer1 должен вызываться при установке сборки, то есть службы.

Он определяет ряд методов: Install() (установка), Commit() (завершает транзакцию установки), Rollback() (восстанавливает состояние компьютера до установки) и Uninstall() (удаление). При необходимости мы можем их переопределить. Но в нашем случае мы будем использовать только конструктор.

В конструкторе вызывается метод InitializeComponent() , который призван выполнять начальную инициализацию. Он определен в файле дизайнера Installer1.Designer.cs и по сути ничего не делает:

Private System.ComponentModel.IContainer components = null; private void InitializeComponent() { components = new System.ComponentModel.Container(); }

Для установки службы нам также понадобится классы ServiceInstaller и ServiceProcessInstaller . Почему именно два класса? ServiceProcessInstaller управляет настройкой значений для всех запускаемых служб внутри одного процесса (как было рассмотрено в прошлой теме, метод Main класса Program может одновременно запускать несколько служб). Класс ServiceInstaller предназначен для настройки значений для каждой из запускаемых служб. То есть если у нас запускается три службы, то для каждой службы создается свой объект ServiceInstaller. Но в нашем случае в прошлой теме мы определили только одну запускаемую службу, поэтому объекты обоих классов у нас будут только в одном экземпляре.

Через свойства оба класса позволяют задать настройки службы. Основные свойства ServiceProcessInstaller:

    Username : определяет, под какой именно учетной записью будет запускаться служба

    Password : определяет пароль для запуска службы

    Account : определяет тип учетной записи. Может принимать одно из значений перечисления ServiceAccount :

    • LocalSystem : учетная запись предоставляет широкие привилегии на локальном компьютере и соответствует компьютеру в сети

      LocalService : учетная запись соответствует пользователю без привилегий на локальном компьютере и предоставляет любому удаленному серверу учетные данные анонимного доступа

      NetworkService : учетная запись предоставляет широкие локальные привилегии и также представляет любому удаленному серверу учетные данные компьютера

      User : учетная запись определяется конкретным пользователем в сети

    HelpText : возвращает справку, содержащую информацию об установке службы

Некоторые важнейшие свойства ServiceInstaller:

    StartType : определяет, как должна запускаться служба - автоматически или вручную. Может принимать следующие значения: ServiceStartMode.Automatic (автоматический запуск), ServiceStartMode.Manual (вручную) и ServiceStartMode.Disabled (служба по умолчанию отключена)

    DelayedAutoStart : определяет, должна ли служба запускаться не сразу после загрузки операционной системы, а немного позже

    DisplayName : устанавливает имя службы, которое будет отображаться в различных утилитах управления службами

    ServiceName : имя службы, должно совпадать со значением свойства ServiceName у класса службы

То есть в нашем случае для службы установлен запуск вручную, и ей будут предоставляться широкие привилегии.

В конце оба объекта установщиков надо добавить в коллекцию Installers: Installers.Add()

Итак, у нас готов код службы и код инсталяторов. Теперь скомпилируем проект, и в проекте в папке bin/Debug у нас будет лежать исполняемый файл службы, который будет называться по имени проекта и иметь расширение exe. Например, в моем случае он называется FileWatcherService.exe.

И теперь нам надо установить службу. Для этого нам надо запустить специальную утилиту InstallUtil.exe и передать ей имя файла службы.

Утилиту InstallUtil.exe можно найти по пути C:\Windows\Microsoft.NET\Framework64\v4.0.30319 для 64-битных платформ и в C:\Windows\Microsoft.NET\Framework\v4.0.30319 для 32-битных.

Также можно вынести исполняемый файл службы в какое-нибудь другое место, например, я поместил его в папку D://servces . Тогда установка службы в командной строке будет выглядеть так:

И если мы зайдем после успешной установки в консоль служб, то сможем найти только что установленную службу.

Мы ее можем запустить, и она будет выполнять все те действия, которые мы в ней определили.

Если нам служба больше не нужна, и мы хотим ее удалить, то мы можем воспользоваться той же утилитой, передав ему флаг u:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319>InstallUtil.exe /u D://servces/FileSystemWatcher.exe

И после запуска созданная служба будет мониторить все действия с файлами в папке D://Temp и записывать информацию о действиях в текстовый файл.



Рекомендуем почитать

Наверх