С Новым годом! Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40

Привязать задачу к журналу событий Windows

09.04.2019, 13:52. Показов 6611. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго часа, друзья!
Начну с цели - хочу получать дату/время события и его сообщение в телеграмм канал...
Зверь для меня неведомый, подхожу с разных сторон:
С одной стороны - есть подписка на события в неком представлении.
В ней привязываем задачу к журналу, выгружаем задачу из Scheduler'a в XML.
Дальше подсказки в статье
в код задания в блок Triggers необходимо добавить ValueQueries с интересующими нас данными:
XML
1
2
3
4
5
6
7
8
9
10
  <Triggers>
    <EventTrigger>
    <ValueQueries>
        <Value name="AccountName">Event/EventData/Data[@Name='AccountName']</Value>
    </ValueQueries>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
      <!-- <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*[System[Provider[@Name='MSSQLSERVER'] and (Level=1  or Level=2 or Level=3)]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription> -->
    </EventTrigger>
  </Triggers>
в следующем блоке необходимо добавить команду с аргументами. В качестве аргументов будут подставлены данные из ValueQueries, ну а дальше все понятно. При событии срабатывает триггер и значения передаются скрипту...
XML
1
2
3
4
5
6
<Actions Context="Author">
    <Exec>
      <Command>C:\bot\tbot2.ps1</Command>
      <Arguments>'$(AccountName)'</Arguments>
    </Exec>
</Actions>
С другой стороны я могу в PS отобрать TimeCreated и Message какого либо эвента:
PowerShell
1
Get-WinEvent -FilterHashTable @{logname = "Application"; ID=18264} -EA SilentlyContinue | select TimeCreated,Message
но это ноль практического применения в контексте сабжа.

Вопросы:
  1. В каком виде TimeCreated,Message должны быть представлены в задаче в блоке <ValueQueries>
  2. Где описаны структуры/классы/Иерархии что содержат TimeCreated,Message, как увидеть эту структуру в PS или в MSDN или где-то еще... Не могу даже запрос в гугле составить, не знаю с какого бока подойти
  3. PS Дело интересное но начинать с хэлловорлда крайне глупо, ибо этим все как правило и заканчивается, а о чем-то более интересном, практичном и полезном наподобие данного сабжа, я ничего не нашел кроме вышеуказанной статьи. Посоветуйте что-нибудь?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.04.2019, 13:52
Ответы с готовыми решениями:

Как привязать обработчик событий к textbox?
например отсюда http://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.keydown(v=vs.90).aspx

Doevents обратная функция: Прерывание стэка событий Windows пока не выполнится стэк событий application
Вот есть DoEvents он передает управление очередью винде, асуществует ли обратная функция, которая передавала бы управление приложению? :)

Можно ли к определённому тексту из лога батника привязать задачу?
Может не совсем правильно описал, но вопрос следующий. Допустим надо отправить файл почтой. Если не получилось то в окне cmd появляется...

11
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.04.2019, 14:17
Цитата Сообщение от judipav Посмотреть сообщение
Привязать задачу к журналу событий Windows
Цитата Сообщение от judipav Посмотреть сообщение
С другой стороны я могу в PS отобрать TimeCreated и Message какого либо эвента:
Вы можете создать в планировщике задание с триггером "On an Event", сразу настроенное на нужный журнал, источник и ID



Это задание будет запускать PS скрипт:

PowerShell
1
$event = Get-WinEvent -FilterHashTable @{logname = "Application"; ID=18264} -MaxEvents 1
т.е., после возникновения нужного события, у нас срабатывает скрипт, в котором мы получаем все подробности этого event'а.

Далее, вытаскиваем всё что нам нужно (особенно обратите внимание на последний пример):

https://www.cyberforum.ru/post11666111.html
https://www.cyberforum.ru/post11874878.html
https://www.cyberforum.ru/post12890523.html
0
96 / 17 / 5
Регистрация: 05.07.2015
Сообщений: 53
09.04.2019, 14:34
В каком виде TimeCreated,Message должны быть представлены в задаче в блоке <ValueQueries>
Вот кусок задачи. которая передает в скрипт через параметры вызова имя журнала и Id события, которое вызвало эту задачу.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;
  &lt;Query Id="0" Path="System"&gt;
    &lt;Select Path="System"&gt;*[System[Provider[@Name='mvs91xx']]]&lt;/Select&gt;
  &lt;/Query&gt;
&lt;/QueryList&gt;</Subscription>
      <ValueQueries>
        <Value name="Channel">Event/System/Channel</Value>
        <Value name="eventRecordID">Event/System/EventRecordID</Value>
      </ValueQueries>
    </EventTrigger>
  </Triggers>
...
XML
1
2
3
4
5
6
7
  <Actions Context="Author">
    <Exec>
      <Command>PowerShell.exe</Command>
      <Arguments>-WindowStyle Hidden -executionpolicy bypass -file "c:\scripts\tracker_raid_marvell.ps1" -LogName $(Channel) -RecordID $(eventRecordID)</Arguments>
      <WorkingDirectory>c:\scripts</WorkingDirectory>
    </Exec>
  </Actions>
0
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40
09.04.2019, 14:50  [ТС]
Друзья! Спасибо за ваши ответы!
Я понимаю как посмотреть эти сообщения в PS, но как узнать вот эту :
Цитата Сообщение от dirigar Посмотреть сообщение
Event/System/Channel
последовательность для Message ?
Мне нужно сделать чтото вроде
XML
1
2
3
4
<ValueQueries>
        <Value name="TimeCreated">Event/System/TimeCreated</Value>
        <Value name="Message">Event/System/Message</Value>
 </ValueQueries>
но в каких узлах они находятся я не знаю. В этом листинге оставил Event/System/ примерно, не уверен что там они и есть, могу попробовать конечно методом тыка, но это ненаучно. Сложно без документации
Есть идеи что подставить в
<Value name="TimeCreated">
и
<Value name="Message">
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.04.2019, 15:38
Цитата Сообщение от dirigar Посмотреть сообщение
Вот кусок задачи. которая передает в скрипт через параметры вызова имя журнала и Id события, которое вызвало эту задачу.
Ещё раз, например, мне нужно отправлять письмо когда останавливается служба "Print Spooler":

1. Создаю задание с триггером:



2. В Action настраивают запуск powershell.exe, с параметрами: -ExecutionPolicy Bypass -NonInteractive -NoProfile -NoLogo -File "C:\Scripts\Script.ps1"

3. Содержимое скрипта "Script.ps1":

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (-not ($Event = Get-WinEvent -MaxEvents 1 -FilterHashTable @{logname = "System"; ProviderName = 'Service Control Manager'; ID = 7036; Data = 'Print Spooler'})) {break}
if ($Event.Properties[1].Value -ne 'stopped') {break}
 
$SMTPServer   = "smtp.domain.ru"
$ComputerName = $env:COMPUTERNAME
$From         = "$ComputerName@domain.ru"
$To           = "my@domain.ru"
$Subj         = "$ComputerName - Alert"
$Body         = "Служба остановлена: "
$encoding     = [System.Text.Encoding]::UTF8
 
$Body += $Event.Properties[0].Value
$Body += "`r`n`r`n"
$Body += $Event.MachineName + "`r`n"
$Body += $Event.TimeCreated.ToString() + "`r`n"
$Body += $Event.Message
 
Send-MailMessage -Body $Body -From $From -SmtpServer $SMTPServer -To $To -Subject $Subj -Encoding  $encoding -Port 25
4. Останавливаю службу и получаю письмо:

From: SERVER-01@domain.ru.ru
Sent: Tuesday, April 9, 2019 3:28 PM
To: my@domain.ru
Subject: SERVER-01 - Alert

Служба остановлена: Print Spooler

SERVER-01.domain.ru
09.04.2019 15:27:37
The Print Spooler service entered the stopped state.
1
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40
09.04.2019, 17:04  [ТС]
Недостаток этого метода в том что события могут проскользнуть, например у меня задача отслеживать все сообщения MSSQLSERVER -
PowerShell
1
$Event = Get-WinEvent -MaxEvents 1 -FilterHashTable @{logname = "Application"; ProviderName = 'MSSQLSERVER'
вроде должно решить задачу, по итогам резервного копирования пришло событие 3014:
BACKUP DATABASE успешно обработал 777010 страниц за 16.023 секунд (378.854 MБ/сек).
однако это последнее сообщение от одного экземпляра задачи резервного копирования, и перед событием 3014 есть еще событие 18284 с текстом наподобие
Создана резервная копия базы данных. База данных: DataBase, дата (время) создания: 2019/03/27(12:13:22), выгружено из памяти страниц: 777064, первый номер LSN: 17167:8591:36, последний номер LSN: 17167:10027:1, число устройств хранения: 1, сведения об устройствах: (FILE=1, TYPE=DISK: {'H:\BackupDB\DataBase\DataBase_backup_2 019_04_09_170007_0849279.bak'}). Это информационное сообщение. Вмешательство пользователя не требуется.
что собственно несет более ценную информацию. Разница между событиями доли секунды, но информация утрачена.

Поэтому я клоню к варианту который я изложил в шапке, и очень жажду познать где найти Message
XML
1
<Value name="Message">Event/Message[@Name='Message']</Value>
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.04.2019, 17:28
Цитата Сообщение от judipav Посмотреть сообщение
Недостаток этого метода в том что события могут проскользнуть, например у меня задача отслеживать все сообщения MSSQLSERVER
Цитата Сообщение от judipav Посмотреть сообщение
Разница между событиями доли секунды, но информация утрачена.
У вас есть примеры пропущенных событий?

Цитата Сообщение от judipav Посмотреть сообщение
по итогам резервного копирования пришло событие 3014
Сделайте триггер на нужный журнал, источник и ID, в данном случае 3014

Цитата Сообщение от judipav Посмотреть сообщение
это последнее сообщение от одного экземпляра задачи резервного копирования, и перед событием 3014 есть еще событие 18284 с текстом наподобие
Если вам нужно что-то делать и при возникновение ID 18284 - добавьте ещё один триггер.

Второй вариант - это отслеживать, как у вас, только ProviderName = 'MSSQLSERVER', а уже в скрипте действовать в зависимости от получившегося ID и/или текста и/или прочих параметров + не забывайте, что есть опция "если задача выполняется, запускать новы экземпляр".
0
 Аватар для v_svitere
774 / 423 / 137
Регистрация: 03.06.2009
Сообщений: 1,223
Записей в блоге: 4
09.04.2019, 17:53
judipav,
К слову, еще есть вариант с использованием EventLogWatcher
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$LOGQUERY=@"
<QueryList>
<Query Id="0" Path="System">
    <Select Path="System">* [System[EventID=7036]]</Select>
</Query>
</QueryList>
"@
$eventLogQuery=New-Object System.Diagnostics.Eventing.Reader.EventLogQuery("System",[System.Diagnostics.Eventing.Reader.PathType]::LogName,$LOGQUERY)
$eventViewer=New-Object System.Diagnostics.Eventing.Reader.EventLogWatcher($eventLogQuery)
$scriptblock=`
{
    $ENTRY=$event.SourceEventArgs
    $ENTRY.EventRecord|out-host
    $ENTRY.EventRecord.properties|out-host
}
Register-ObjectEvent -InputObject $eventViewer -EventName EventRecordWritten -Action $scriptblock
$eventViewer.Enabled=$true
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
09.04.2019, 18:34
Но даже если воспользоваться ValueQueries-механизмом, зачем вам Message и TimeCreated?

Есть же свойство eventRecordID, т.е. уникальный номер события, на которое сработал триггер. Разве этого не достаточно?

XML
1
2
3
<ValueQueries>
    <Value name="eventRecordID">Event/System/EventRecordID</Value>
</ValueQueries>
а далее, в ps-скрипте и ищем этот eventRecordID:

PowerShell
1
2
3
4
5
6
$XmlQuery="<QueryList>
  <Query Id='0' Path='Security'>
    <Select Path='Application'>*[Provider[@Name='MSSQLSERVER'] and (EventID=18284) and (EventRecordID=$RecordID)]]</Select>
  </Query>
</QueryList>"
$Event = Get-WinEvent -FilterXml $XmlQuery
Добавлено через 29 минут
Цитата Сообщение от judipav Посмотреть сообщение
Где описаны структуры/классы/Иерархии что содержат TimeCreated,Message, как увидеть эту структуру в PS или в MSDN или где-то еще...
Event Schema Elements

Добавлено через 3 минуты
+

SystemPropertiesType Complex Type
0
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40
10.04.2019, 13:03  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
У вас есть примеры пропущенных событий?
да, я приводил пример код 18284. Он не попадает в отбор.
Цитата Сообщение от KDE777 Посмотреть сообщение
XML
1
2
3
4
5
6
$XmlQuery="<QueryList>
 *<Query Id='0' Path='Security'>
 * *<Select Path='Application'>*[Provider[@Name='MSSQLSERVER'] and (EventID=18284) and (EventRecordID=$RecordID)]]</Select>
 *</Query>
</QueryList>"
$Event = Get-WinEvent -FilterXml $XmlQuery
увы, "Запрос задан неверно", пробовал Path='Security' поменять на Path='Application' и лишнюю закрывающую квадратную скобку убрал, и "and (EventID=18284)" убирал но все равно "Запрос задан неверно". Сам составить XML-запрос я не могу, в голове пока не укладывается этот синтаксис.

может вам будет полезно, выкладываю код задачи
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2019-04-08T15:24:26.4617436</Date>
    <Author>Domain\user</Author>
    <URI>\Задачи просмотра событий\MS SQL Server local</URI>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
    <ValueQueries>
        <Value name="eventRecordID">Event/System/EventRecordID</Value>
    </ValueQueries>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
      <!-- <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*[System[Provider[@Name='MSSQLSERVER'] and (Level=1  or Level=2 or Level=3)]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription> -->
    </EventTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-1220945662-1060284298-725345543-7642</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <Duration>PT10M</Duration>
      <WaitTimeout>PT1H</WaitTimeout>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>powershell.exe</Command>
      <Arguments> -ExecutionPolicy Bypass -NonInteractive -NoProfile -NoLogo -File "C:\bot\tbot3.ps1" -RecordID '$(eventRecordID)'</Arguments>
    </Exec>
  </Actions>
</Task>

и код tbot3.ps1:
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
param(
[string]$RecordID = $(Throw "'-text' аргумент обязателен")
)
$XmlQuery="<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[Provider[@Name='MSSQLSERVER'] and (EventRecordID=$RecordID)]]</Select>
  </Query>
</QueryList>"
$Event = Get-WinEvent -FilterXml $XmlQuery
 
$Body += "MSSQLSERVER Event"
$Body += "`r`n`r`n"
$Body += $Event.MachineName + "`r`n"
$Body += $Event.TimeCreated.ToString() + "`r`n"
$Body += $Event.Message

Задание не передает eventRecordID, получаю значение NULL. Что я делаю не так?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
10.04.2019, 14:51
Лучший ответ Сообщение было отмечено judipav как решение

Решение

Цитата Сообщение от judipav Посмотреть сообщение
увы, "Запрос задан неверно", пробовал Path='Security' поменять на Path='Application' и лишнюю закрывающую квадратную скобку убрал, и "and (EventID=18284)" убирал но все равно "Запрос задан неверно". Сам составить XML-запрос я не могу, в голове пока не укладывается этот синтаксис.
Да, там со скобками ошибся. Корректный запрос будет выглядеть так:

PowerShell
1
2
3
4
5
6
$XmlQuery = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[Provider[@Name='MSSQLSERVER'] and (EventRecordID = $RecordID) and (EventID = 18284)]]
    </Select>
  </Query>
</QueryList>"
Но, если триггер настроен на нужный журнал, источник и EventID, тогда зачем нам в фильтре указывать Path, Provider и EventID?

1. Настраиваем ValueQueries для задания:

XML
1
2
3
4
    <ValueQueries>
        <Value name="eventRecordID">Event/System/EventRecordID</Value>
        <Value name="eventChannel">Event/System/Channel</Value>
    </ValueQueries>
2. Настраиваем вызов скрипта "C:\Scripts\Script.ps1":

XML
1
2
3
4
    <Exec>
      <Command>powershell</Command>
      <Arguments> -ExecutionPolicy Bypass -NonInteractive -NoProfile -NoLogo -File "C:\Scripts\Script.ps1" -RecordID $(eventRecordID) -Channel $(eventChannel)</Arguments>
    </Exec>
3. В скрипте "Script.ps1" пишем:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]$RecordID,
  [Parameter(Mandatory=$True,Position=2)]$Channel
)
 
$XmlQuery = "<QueryList>
  <Query Id='0' Path='$Channel'>
    <Select Path='$Channel'>*[System[(EventRecordID = $RecordID)]]
    </Select>
  </Query>
</QueryList>"
 
$Event = Get-WinEvent -FilterXml $XmlQuery
 
if ($Event.Properties[0].Value -ne 'Print Spooler') {break}
if ($Event.Properties[1].Value -ne 'stopped')       {break}
 
# Нужная нам проверка события выполнена, далее выполняем требуемые действия
 
$Event.Id
$Event.TimeCreated
$Event.Message
1
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40
10.04.2019, 16:28  [ТС]
Невероятно огромное человеческое мерси, дружище!
Это как раз то что нужно!
Теперь эвенты пересылаются в телеграм =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2019, 16:28
Помогаю со студенческими работами здесь

Создание заявки по журналу
Парни нужна помощь. Кнопку создать-создам, макрос на создание нового листа не проблема. Вообщем есть 2 документа excel. Один это...

Программный доступ к журналу регистрации
Всем привет, может кто подскажет, мне надо программно в режиме конфигуратора подключиться к журналу регистрации 1С 8, для дальнейшей...

Как программно обратиться к журналу документов
Добрый день! Конфигурация 1с 7.7 Подскажите как программно обратится к документу из журнала документов через запрос. Так не работает: ...

The View - кто-нить имеет доступ к этому журналу?
https://www.eview.com/eview/products.nsf/viewsubs?openform - некислые цены...

Настройка аппаратного терминала для доступа к электронному журналу
Имеется терминал, моноблок с сенсорным экраном. Клавиатура подключается, только для настройки. Задача - настроить терминал так, чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru