Российская ОС в эпоху санкций: почему Windows, Apple и Linux — не выход
Три сервера, которые решают всё
В июне 2026 года произошло то, о чём предупреждали годами. Очередной пакет санкций. Microsoft отключает облачные сервисы для российских компаний. Apple блокирует push-уведомления. Google приостанавливает монетизацию.
Три сервера — в Редмонде, Купертино и Маунтин-Вью — решают, будет ли работать ваш бизнес.
Знакомая картина? Это не фантастика. Это происходило в 2022, повторялось в 2024, и будет происходить снова. Потому что операционная система — это последний рубеж цифрового суверенитета, который Россия до сих пор не взяла.
Windows: заложник Редмонда
Windows установлена на 80% компьютеров в России. Формально — это просто ОС. Фактически — это троянский конь.
Что Microsoft знает о вас:
Какие программы вы запускаете
Какие сайты посещаете
Какие файлы открываете
Где находится ваш компьютер (геолокация)
Ваши пароли (если используете Microsoft Account)
Что Microsoft может сделать в любой момент:
Отключить обновления безопасности
Заблокировать доступ к облачным файлам
Деактивировать лицензию
Удалить приложения через Microsoft Store
Всё это уже происходило. В 2022 году Microsoft приостановила продажи в России. В 2024 — отключила облачные сервисы для подсанкционных компаний. В 2026 — ограничила доступ к Windows Update для пользователей из РФ.
Итог: Windows — не ваша операционная система. Вы её арендуете. И арендодатель в любой момент может сменить замки.
Apple: золотая клетка
Экосистема Apple великолепна. iPhone, MacBook, iPad — всё работает как единое целое. В этом сила Apple. И в этом же её главная опасность.
Факты:
Вы не можете установить приложение в обход App Store
Вы не можете починить устройство в неавторизованном сервисе
Вы не можете перенести данные в другую экосистему без потерь
Ваши пароли, фото, документы — на серверах в США
Apple — это не технологическая компания. Это компания по управлению зависимостью. Чем глубже вы в экосистеме, тем сложнее из неё выйти.
Санкционный риск: Apple неоднократно отключала сервисы в отдельных странах. Apple Pay переставал работать. iCloud блокировался. Вопрос не в том, может ли Apple это сделать. Вопрос — когда.
Linux: свобода, за которую нужно платить
Linux — это не операционная система. Это 200 операционных систем, которые несовместимы друг с другом.
Правда о Linux в корпоративной среде:
Нет нормальной поддержки .NET. А 90% корпоративного ПО в России — это .NET.
Нет единого магазина приложений. Snap, Flatpak, AppImage — зоопарк форматов.
Нет экосистемы. Телефон не дружит с ПК. Облака нет. Пароли не синхронизируются.
Нет встроенной безопасности. Антивирус? ГОСТ-криптография? 152-ФЗ? Настраивайте сами.
Сложность. Обычный бухгалтер не должен учить командную строку.
Linux — отличная серверная ОС. Но как десктоп для массового пользователя или корпоративного сектора — это компромисс, на который идут от безысходности.
Три проблемы, которые не решает ни одна ОС
Проанализировав ландшафт, мы выделили три критических разрыва:
Проблема 1: Зависимость от иностранных серверов
Все популярные ОС привязаны к облакам в США. Ваши данные, обновления, пароли — всё проходит через зарубежную инфраструктуру.
Проблема 2: Отсутствие экосистемы на российских сервисах
Пользователи Apple привыкли, что телефон и компьютер работают как одно целое. В России нет аналога. Android-телефон сам по себе, ПК на Linux — сам по себе. Данные не синхронизируются.
Проблема 3: Совместимость с существующим ПО
Российский бизнес написал миллионы строк кода на .NET под Windows. Переписывать — дорого. Запускать через Wine — нестабильно. Нужен третий путь.
Задача ОС «Родник»
Мы не делаем «ещё один Linux». Мы не копируем Windows. Мы решаем три конкретные проблемы.
1. Технологический суверенитет
Все критически важные компоненты — российские:
Облако: Яндекс.Диск (серверы в РФ)
Безопасность: Kaspersky (российская компания)
Криптография: ГОСТ (российские стандарты)
Авторизация: Яндекс ID (данные не покидают страну)
2. Экосистема на российских сервисах
Телефон на Android + ПК на Родник + Облако на Яндекс.Диске = единая экосистема. Общий буфер обмена. Синхронизация паролей. Continuity (начал на телефоне — продолжил на ПК). Как у Apple. Только без привязки к Купертино.
3. Нативный .NET без Windows
Корпоративные приложения на .NET работают на Родник OS нативно. Без эмуляторов. Без прослоек. Быстрее, чем на Windows — потому что под капотом нет 30-летнего легаси.
А для тех приложений, которые всё ещё завязаны на Windows API — IL-транслятор. Он анализирует промежуточный код .NET и автоматически заменяет вызовы Windows на вызовы Родник. Одна команда при сборке — и приложение работает.
Почему это важно
Потому что операционная система — это не просто софт. Это фундамент цифровой экономики.
Пока мы сидим на Windows — мы арендуем чужой фундамент. Пока у нас нет своей экосистемы — мы теряем пользователей, которые выбирают Apple. Пока мы натягиваем Linux на десктоп — мы тратим миллиарды на костыли вместо того, чтобы создать нормальный продукт.
Родник OS — это не попытка догнать Microsoft или Apple. Это попытка решить конкретные проблемы российского пользователя и бизнеса здесь и сейчас.
Первый публичный релиз — январь 2027.
Юрин Константин, проект «Родник OS», 2026
Чистая Windows и разработка «без всего»
Есть компьютер с чистой копией Windows, без доступа в интернет и без каких‑либо установленных средств разработки. Только одна чистая пользовательская «венда». Не поверите, но даже в таких спартанских условиях возможно написать и запустить полноценную программу. И сейчас я расскажу как.
Ради этого скриншота я честно развернул пользовательскую версию Windows 11 в виртуальной машине. Чего не сделаешь ради искусства!
Ужасы познания
На самом деле в ОС семейства Windows с самого их начала было внутри столько всякого интересного, что никакой статьи не хватит описать, но почему-то мало кто об этом знает даже из разработчиков, особенно современных.
Спросите ради интереса знакомого программиста, возможно ли программировать на «чистой» пользовательской Windows без установки Visual Studio — удивитесь ответам.
Ну и разумеется насаждаемый «пользовательский» подход самой Microsoft, которая ковыряние во внутренностях своих продуктов мягко говоря никогда не одобряла, создал ореол простоты и надежности, без необходимости разбираться как оно внутри устроено.
Поэтому описанное ниже наверное вызовет определенный ужас как у обычных пользователей так и некоторых программистов — особенно если они обучались по видеокурсам ничего не знают об истории ОС Windows.
Начну с цитаты из одной интересной статьи:
Over the past few months, I've received several variations on this question for other operating systems and all of the released versions of the .NET Framework. When the .NET Framework is installed as a part of the OS, it does not appear in the Programs and Features (or Add/Remove Programs) control panel. The following is a complete list of which version of the .NET Framework is included in which version of the OS
И ниже длинный такой список с версиями. А вот еще один если вдруг первого оказалось недостаточно.
Ну казалось бы и.. что? Чего тут такого?
Про .NET SDK все и так знают, временами его необходимо установить «для запуска игор», временами он сам ставится в виде зависимой библиотеки и никому не мешает.
Все так, да.
Только что-то мне подсказывает внутрь вы не заглядывали, правда? Поэтому на что эта штука на самом деле способна не представляете.
А я представляю и сейчас расскажу.
Заходите в папку Windows на вашем компьютере, вот сюда:
Файлт csc.exe — самый настоящий компилятор, фактически портал в ад на вашем обычном домашнем компьютере.
Почему все так страшно?
Потому что через какое-то время вы обнаружите себя сильно заросшим, с бородой и красными глазами, проводящим ночи за компьютером и медленно мутирующим в программиста.
Шучу.
А если серьезно:
появляется возможность создания нативных программ сразу на вашем компьютере, минуя стадию проверки электронной подписи, проверки антивирусом, проверки электронного письма и так далее.
В отличие от VB или PowerShell-скриптов, которые анализируются перед запуском любым приличным антивирусом, антивирусы не анализируют исходный код программ на C# и куда лояльнее относятся к программам собранным локально на этой же машине.
Так что веселье начинается.
Простой пример
Для начала будет простой пример, который просто показывает стандартный диалог с сообщением. Именно его в запущенном виде вы можете видеть на заглавной картинке в статье.
Весь процесс от кода до запуска я записал на видео:
Исходный код тут казалось бы максимально простой, но с одним интересным нюансом про который ниже:
using System;
using System.Runtime.InteropServices;
namespace yoba
{
class Program
{
// импортирование нативной WinAPI функции MessageBox.
[DllImport("user32.dll")]
public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint uType);
static void Main(string[] args)
{
//вызываем и показываем диалог
MessageBox(IntPtr.Zero, "Йоу!", "Добро пожаловать в разработку!", 0);
}
}
}
Сохраняете этот текст обычным «блокнотом» в файл yoba.cs и запускаете сборку:
c:\Windows\Microsoft.NET\Framework\v3.5\csc.exe yoba.cs
Таким образом я запускал сборку на Windows 10, но имейте ввиду что версия системного .NET SDK может отличаться и например в Windows 11 уже будет:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe yoba.cs
После сборки рядом с исходным файлом yoba.cs появится бинарник yoba.exe, который вы сможете запустить.
А теперь про нюанс.
Нюанс
Существует определенное предубеждение по отношению к managed‑языкам вроде Java и С# — они не подходят для серьезных дел вроде написания эксплоитов, использования 0day‑уязвимостей и пенетрации ядра.
Что все подобные вещи творят
в глубокой тайнена чистом Си, в крайнем случае на C++ а все эти ваши Java/C# не более чем «погремушки для детей», не достойные даже косого взгляда серьезного профессионала.
Вот тут и начинается нюанс, посмотрите на эту радость:
[DllImport("user32.dll")]
public static extern int MessageBox(IntPtr hWnd,
string lpText, string lpCaption, uint uType);
Это мои дорогие читатели, ни что иное как вызов нативного WinAPI, с помощью которого творили всякое нехорошее в далекие 90е.
C# и .NET имеет оооочень глубокую интеграцию с Windows, несмотря на всю свою «безопасность» и управляемость, поэтому легко и просто может заменить собой и Си и С++ в качестве инструмента для нехороших дел.
И оно живет на вашем компьютере, дома и в офисе, с постоянной пропиской и регистрацией.
Но разумеется столь простого примера несколько мало для осознания глубины проблемы, поэтому я подготовил кое-что более серьезное.
Сложный пример: выключаем Windows
Итак, это будет относительно небольшое приложение на C#, выключающее компьютер без предупреждения и подтверждения пользователя. И само собой без прав администратора.
Просто так, внезапно.
Последствия думаю каждый из читателей сможет оценить для себя сам.
Весь процесс на видео (разумеется это виртуальная машина):
А теперь код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security;
using System.Diagnostics;
using System.Management;
using System.Security.Permissions;
using System.Runtime.InteropServices;
namespace yoba
{
// See http://www.developmentnow.com/g/33_2004_12_0_0_33290/Access-...
// Calling this code on backup/restore seems to enable BCD
public class TokenHelper
{
// PInvoke stuff required to set/enable security privileges
[DllImport("advapi32", SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern int OpenProcessToken(
System.IntPtr ProcessHandle, // handle to process
int DesiredAccess, // desired access to process
ref IntPtr TokenHandle // handle to open access token
);
[DllImport("kernel32", SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern int AdjustTokenPrivileges(
IntPtr TokenHandle,
int DisableAllPrivileges,
IntPtr NewState,
int BufferLength,
IntPtr PreviousState,
ref int ReturnLength);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern bool LookupPrivilegeValue(
string lpSystemName,
string lpName,
ref LUID lpLuid);
[StructLayout(LayoutKind.Sequential)]
internal struct LUID
{
internal int LowPart;
internal int HighPart;
}
[StructLayout(LayoutKind.Sequential)]
struct LUID_AND_ATTRIBUTES
{
LUID Luid;
int Attributes;
}
[StructLayout(LayoutKind.Sequential)]
struct _PRIVILEGE_SET
{
int PrivilegeCount;
int Control;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=1)] // ANYSIZE_ARRAY = 1
LUID_AND_ATTRIBUTES [] Privileges;
}
[StructLayout(LayoutKind.Sequential)]
internal struct TOKEN_PRIVILEGES
{
internal int PrivilegeCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
internal int[] Privileges;
}
const int SE_PRIVILEGE_ENABLED = 0x00000002;
const int TOKEN_ADJUST_PRIVILEGES = 0X00000020;
const int TOKEN_QUERY = 0X00000008;
const int TOKEN_ALL_ACCESS = 0X001f01ff;
const int PROCESS_QUERY_INFORMATION = 0X00000400;
public static bool SetPrivilege (string lpszPrivilege, bool
bEnablePrivilege )
{
bool retval = false;
int ltkpOld = 0;
IntPtr hToken = IntPtr.Zero;
TOKEN_PRIVILEGES tkp = new TOKEN_PRIVILEGES();
tkp.Privileges = new int[3];
TOKEN_PRIVILEGES tkpOld = new TOKEN_PRIVILEGES();
tkpOld.Privileges = new int[3];
LUID tLUID = new LUID();
tkp.PrivilegeCount = 1;
if (bEnablePrivilege)
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
else
tkp.Privileges[2] = 0;
if(LookupPrivilegeValue(null , lpszPrivilege , ref tLUID))
{
Process proc = Process.GetCurrentProcess();
if(proc.Handle != IntPtr.Zero)
{
if (OpenProcessToken(proc.Handle, TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
ref hToken) != 0)
{
tkp.PrivilegeCount = 1;
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
tkp.Privileges[1] = tLUID.HighPart;
tkp.Privileges[0] = tLUID.LowPart;
const int bufLength = 256;
IntPtr tu = Marshal.AllocHGlobal( bufLength );
Marshal.StructureToPtr(tkp, tu, true);
if(AdjustTokenPrivileges(hToken, 0, tu, bufLength, IntPtr.Zero, ref
ltkpOld) != 0)
{
// successful AdjustTokenPrivileges doesn't mean privilege could be changed
if (Marshal.GetLastWin32Error() == 0)
{
retval = true; // Token changed
}
}
TOKEN_PRIVILEGES tokp = (TOKEN_PRIVILEGES) Marshal.PtrToStructure(tu,
typeof(TOKEN_PRIVILEGES) );
Marshal.FreeHGlobal( tu );
}
}
}
if (hToken != IntPtr.Zero)
{
CloseHandle(hToken);
}
return retval;
}
}
class ShutDown
{
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool ExitWindowsEx(int flg, int rea);
internal const int EWX_FORCE = 0x00000004;
internal const int EWX_POWEROFF = 0x00000008;
static void Main(string[] args)
{
TokenHelper.SetPrivilege("SeShutdownPrivilege",true);
ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0);
}
}
}
Обращаю внимание что это не эксплоит, не дыра, не баг и не уявимость а вполне себе стандартный функционал. Просто так получилось что о нем мало кто знает.
Собирается по аналогии с предыдущим примером:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe Shutdown.cs
После запуска компьютер практически немедленно выключится:
проверено и в виртуальной машине и на железе, на 10й и 11й Windows.
Рассказываю как это работает.
Ключевая функция — ExitWindowsEx, которая и отвечает за завершение работы ОС. Эта функция очень старая и известная, существует еще со времен Windows 95.
Но для ее вызова нужны «привилегии», которые и выставляет программно класс TokenHelper.
Константы ниже:
internal const int EWX_FORCE = 0x00000004;
internal const int EWX_POWEROFF = 0x00000008;
используются вместе с "побитовым или" для указания на требуемое действие.
Вот еще допустимые варианты:
internal const int EWX_LOGOFF = 0x00000000;
internal const int EWX_SHUTDOWN = 0x00000001;
internal const int EWX_REBOOT = 0x00000002;
internal const int EWX_FORCEIFHUNG = 0x00000010;
Описание их всех находится все там же — в официальном руководстве, не поверите.
Теперь давайте разбираться как же работает столь жесткое забивание на систему защиты еще и стандартными средствами:
TokenHelper.SetPrivilege("SeShutdownPrivilege",true);
И начнем мы с импортов.
Первое что импортируется это функция OpenProcessToken:
[DllImport("advapi32", SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern int OpenProcessToken(
System.IntPtr ProcessHandle, // handle to process
int DesiredAccess, // desired access to process
ref IntPtr TokenHandle // handle to open access token
);
Функция отвечает за получение данных о наборе «привилегий», связанных с конкретным процессом. Собственно набор таких привилегий и называется «токеном».
Вот как эта функция вызывается:
if (OpenProcessToken(proc.Handle, TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
ref hToken) != 0)
{
..
Тут надо отметить передачу по ссылке в стиле Си (ref hToken), когда в функцию передается ссылка на объект C#, дальше функция этот объект заполняет данными. А возвращает она просто true или false — статус выполнения, отработала функция или нет.
Дальше импортируется простая и банальная функция освобождения ресурсов:
[DllImport("kernel32", SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern bool CloseHandle(IntPtr handle);
Вызывается она в самом конце, после всей логики и нужна только для освобождения использованной памяти под токен привилегий:
if (hToken != IntPtr.Zero)
{
CloseHandle(hToken);
}
Наконец главная функция, непосредственно отвечающая за переключение привилегий:
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern int AdjustTokenPrivileges(
IntPtr TokenHandle,
int DisableAllPrivileges,
IntPtr NewState,
int BufferLength,
IntPtr PreviousState,
ref int ReturnLength);
Вот весь ключевой блок логики смены привилегий:
if (OpenProcessToken(proc.Handle, TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
ref hToken) != 0)
{
tkp.PrivilegeCount = 1;
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
tkp.Privileges[1] = tLUID.HighPart;
tkp.Privileges[0] = tLUID.LowPart;
const int bufLength = 256;
IntPtr tu = Marshal.AllocHGlobal( bufLength );
Marshal.StructureToPtr(tkp, tu, true);
if(AdjustTokenPrivileges(hToken, 0, tu, bufLength, IntPtr.Zero, ref
ltkpOld) != 0)
{
// successful AdjustTokenPrivileges doesn't mean privilege could be changed
if (Marshal.GetLastWin32Error() == 0)
{
retval = true; // Token changed
}
}
TOKEN_PRIVILEGES tokp = (TOKEN_PRIVILEGES) Marshal.PtrToStructure(tu,
typeof(TOKEN_PRIVILEGES) );
Marshal.FreeHGlobal( tu );
}
Как видите вызов достаточно сложный, используется Сишный процедурный подход к заполнению полей структуры и передачи его по ссылке в вызываемую функцию.
После вызова проверяется наличие ошибки, также в стиле Си:
if (Marshal.GetLastWin32Error() == 0)
{
retval = true; // Token changed
}
0 это код возрата для успешного вызова, если он есть — считается что операция смены привилегий была выполнена успешно.
Наконец последняя функция, про которую стоит рассказать:
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true),
SuppressUnmanagedCodeSecurityAttribute]
static extern bool LookupPrivilegeValue(
string lpSystemName,
string lpName,
ref LUID lpLuid);
Она отвечает за поиск привилегии по имени, полагаю ведь заметили что мы передаем некое кодовое наименование при вызове TokenHelper:
TokenHelper.SetPrivilege("SeShutdownPrivilege",true);
Именно эта функция отвечает за поиск конкретной привилегии по названию «SeShutdownPrivilege», вот так выглядит ее вызов:
if (bEnablePrivilege)
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
else
tkp.Privileges[2] = 0;
if(LookupPrivilegeValue(null , lpszPrivilege , ref tLUID))
{
..
Переменная bEnablePrivilege булевая, это и есть то самое true передаваемое в качестве второго аргумента, а блок:
if (bEnablePrivilege)
tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;
else
tkp.Privileges[2] = 0;
Отвечает за формирование правильного вызова с использованием системных констант (SE_PRIVILEGE_ENABLED).
При вызове также передается ссылка (ref tLUID) на объект LUID, который будет содержать после вызова указание на найденную привилегию.
Вот такие интересные дела.
Итого
Все описанное не призыв к немедленным действиям, а лишь повод к размышлению о смысле бытия. Ну там насчет надежности, безопасности и всего такого — что вам продает большая иностранная корпорация.
Задумайтесь, если увидите любимую "венду" на атомной станции или военном объекте — без всяких ЦРУ и хакеров в ОС Windows адова гора функционала, который легко и просто можно использовать во вред.
P.S.
Статья была опубликована на Хабре, более вольный оригинал доступен в нашем блоге.
Скачиваем видео с YouTube, Rutube, VK Видео и Pikabu в два клика
Рунет переполнен различными веб-сайтами, предлагающими за пару кликов скачать видео с популярных видеохостингов. Однако предоставляемое ими качество часто оставляет желать лучшего, а скачивание плейлистов и каналов вовсе бывает недоступно. В этой небольшой инструкции вы узнаете, как, используя всего одну программу, скачивать видео, плейлисты и даже целые каналы с YouTube, Rutube, VK и других популярных видеохостингов.
Автор: Google Источник: myseldon.com
Описание
На самом деле в скачивании видео с популярных видеохостингов нет ничего сложного — достаточно воспользоваться бесплатной программой Video Grabber.
Video Grabber — бесплатное программное обеспечение с открытым исходным кодом, предназначенное для скачивания видео с популярных видеохостингов и веб-сайтов. Поддерживает скачивание видео более чем с 1800 различных веб-ресурсов, включая YouTube, Rutube, VK Видео, Дзен, Twitch, TikTok, Bilibili, Coub и многие другие. Не требует платы, не встраивает водяные знаки, не ограничивает количество загрузок. Работает на Windows 10/11.
Инструкция
Видеоролики защищены авторским правом. Используйте программу исключительно для архивации собственных видео. Автор статьи не поддерживает кражу чужих видеоматериалов.
1. Скачайте архив с программой с её официальной страницы на GitHub.
2. Распакуйте компоненты программы, используя архиватор, в любое удобное место, не содержащее в своём пути или названии кириллицы.
3. Запустите от имени администратора файл Video Grabber.exe. Если всё прошло без накладок, то перед вашим взором откроется окно программы с автообновлением компонентов и лицензионным соглашением. Примите условия использования ПО.
4. Вставьте веб-ссылку на желаемое видео, плейлист или канал, выберите желаемое качество и нажмите кнопку «Анализировать». Программа после секундной заминки автоматически начнёт скачивание видео в папку с ПО или в указанную вами.
5. Нажмите кнопку «Открыть папку», запустите видеоролик и наслаждайтесь его просмотром.
Автор оригинала: Павел Прилуцкий
Автовключение телевизора
У меня комп подключен к телику, я на нем в гостиной играю в игрушки. И меня в этой схеме парило включать телефизор. Клавиатура для вывода из сна, она большая, и лежит рядом, а пульт постоянно убегает. У консольщиков за это отвечате CEC, но на ПКшные видюхи их не завозят (я считаю это загоовором производителей консолей).
Меня эта проблема парила, и я таки нашел решение, может быть кому-нибудь поможет.
Далее будет контент нейросетей, ибо Кодекс мне проблему и решил.
1. Включаем ADB на телевизоре
На ТВ:
Открываем Настройки.
Идём в О телевизоре / Об устройстве.
Находим Сборка / Build.
Нажимаем на неё 7 раз, пока не появится сообщение “Вы стали разработчиком”.
Возвращаемся назад.
Открываем Для разработчиков.
Включаем:
Отладка по USB;
если есть, Отладка по сети / Network debugging / ADB over network.
Дальше на Windows ставим Android Platform Tools. Например, распаковываем сюда:
C:\platform-tools
(от себя добавлю - наверно можно поставить adb другим способом, но тут я уже не тестил, ибо сработало так)
Проверяем. win+x - Терминал - проверть, что выбран тип "Powershell", будет написно на вкладке
C:\platform-tools\adb.exe connect 192.168.1.12:5555
C:\platform-tools\adb.exe devices -l
На ТВ может появиться запрос “Разрешить отладку?” — разрешаем.
2. Создаём папку
Например: C:\haier-tv-adb-wake
Внутри создаём config.json (создаем текстовый документ, называем его config.json):
{ "tv_device": "192.168.1.12:5555", "adb_path": "C:\\platform-tools\\adb.exe", "delay_before_wake_seconds": 8 }
3. Там же создаём tv_wake.bat (тоже тестовый документ):
@Echo off
setlocal EnableExtensions EnableDelayedExpansion
cd /d "%~dp0"
if not exist "logs" mkdir "logs"
set "TV=192.168.1.12:5555"
set "ADB=adb"
set "DELAY=8"
set "CONNECT_RETRIES=3"
set "LOG=logs\tv_wake.log"
if exist "config.json" (
for /f "usebackq tokens=1,* delims==" %%A in (`powershell -NoProfile -ExecutionPolicy Bypass -Command "$ErrorActionPreference = 'Stop'; $c = Get-Content -Raw -LiteralPath 'config.json' | ConvertFrom-Json; if ($c.tv_device) { 'TV=' + $c.tv_device }; if ($c.adb_path) { 'ADB=' + $c.adb_path }; if ($null -ne $c.delay_before_wake_seconds) { 'DELAY=' + [int]$c.delay_before_wake_seconds }" 2^>nul`) do (
if /i "%%A"=="TV" if not "%%B"=="" set "TV=%%B"
if /i "%%A"=="ADB" if not "%%B"=="" set "ADB=%%B"
if /i "%%A"=="DELAY" if not "%%B"=="" set "DELAY=%%B"
)
)
echo ============================== >> "%LOG%"
echo [%date% %time%] Haier TV wake script started >> "%LOG%"
echo [%date% %time%] TV=%TV% ADB=%ADB% Delay=%DELAY%s >> "%LOG%"
powershell -NoProfile -Command "Start-Sleep -Seconds %DELAY%" >nul 2>&1
set "CONNECTED=0"
for /l %%I in (1,1,%CONNECT_RETRIES%) do (
echo [%date% %time%] Connecting to %TV% attempt %%I/%CONNECT_RETRIES% >> "%LOG%"
"%ADB%" connect "%TV%" >> "%LOG%" 2>&1
echo [%date% %time%] adb connect exit code: !errorlevel! >> "%LOG%"
"%ADB%" devices >> "%LOG%" 2>&1
"%ADB%" devices | findstr /c:"%TV% device" >nul 2>&1
if not errorlevel 1 (
set "CONNECTED=1"
goto :connected
)
powershell -NoProfile -Command "Start-Sleep -Seconds 2" >nul 2>&1
)
:connected
if not "%CONNECTED%"=="1" (
echo [%date% %time%] TV is not connected over ADB, skipping keyevents >> "%LOG%"
echo [%date% %time%] Done >> "%LOG%"
endlocal
exit /b 0
)
echo [%date% %time%] Sending WAKEUP keyevent 224 >> "%LOG%"
"%ADB%" -s "%TV%" shell input keyevent 224 >> "%LOG%" 2>&1
powershell -NoProfile -Command "Start-Sleep -Seconds 1" >nul 2>&1
echo [%date% %time%] Sending INPUT keyevent 178 >> "%LOG%"
"%ADB%" -s "%TV%" shell input keyevent 178 >> "%LOG%" 2>&1
powershell -NoProfile -Command "Start-Sleep -Seconds 1" >nul 2>&1
echo [%date% %time%] Sending OK keyevent 23 >> "%LOG%"
"%ADB%" -s "%TV%" shell input keyevent 23 >> "%LOG%" 2>&1
echo [%date% %time%] Done >> "%LOG%"
endlocal
exit /b 0
Логика такая:
224 = WAKEUP
178 = INPUT
23 = OK
То есть телевизор просыпается, открывает выбор входа и нажимает OK. У меня это возвращает ТВ на нужный HDMI.
4. Прописываем в Планировщик Windows
Создаём install_tasks.ps1 (тоже текстовый документ):
$ErrorActionPreference = 'Stop'
$ProjectDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$BatPath = Join-Path $ProjectDir 'tv_wake.bat'
$CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Action = New-ScheduledTaskAction -Execute $BatPath -WorkingDirectory $ProjectDir
$Principal = New-ScheduledTaskPrincipal -UserId $CurrentUser -LogonType Interactive -RunLevel Limited
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -MultipleInstances IgnoreNew
$LogonTrigger = New-ScheduledTaskTrigger -AtLogOn -User $CurrentUser
$ResumeTrigger = Get-CimClass -Namespace root/Microsoft/Windows/TaskScheduler -ClassName MSFT_TaskEventTrigger |
New-CimInstance -ClientOnly
$ResumeTrigger.Enabled = $true
$ResumeTrigger.Subscription = @'
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">
*[System[Provider[@name='Microsoft-Windows-Power-Troubleshooter'] and EventID=1]]
</Select>
</Query>
</QueryList>
'@
Register-ScheduledTask -TaskName 'Haier TV Wake On Logon' -Action $Action -Trigger $LogonTrigger -Principal $Principal -Settings $Settings -Force | Out-Null
Register-ScheduledTask -TaskName 'Haier TV Wake On Resume' -Action $Action -Trigger $ResumeTrigger -Principal $Principal -Settings $Settings -Force | Out-Null
Write-Host 'Installed'
Запускаем из папки проекта:
powershell -ExecutionPolicy Bypass -File .\install_tasks.ps1
Проверить:
Get-ScheduledTask -TaskName "Haier TV Wake On Logon","Haier TV Wake On Resume"
Логи будут тут:
logs\tv_wake.log
Важно: закрепите IP телевизора в роутере, иначе завтра он может стать не 192.168.1.12, и скрипт будет стучаться не туда.
Если телевизор уходит в глубокий сон и ADB по сети отваливается, этот способ его не разбудит. Тогда нужны настройки типа быстрый старт, сетевой режим ожидания, network standby или уже другие методы вроде IR/CEC.
Таким образом, телик будет включаться вместе с компьютером. Автовыключение у меня настроить не удалось (скрипт не успевает отрабатывать, пока комп выключается), так что я это сделал через функцию самого телевизора.
Также добавлю: я совсем не программист, так что любая критика будет уместна. Цель поста - показать, что так можно, а конкретную реализацию каждый теперь с помощью нейронок может сделать сам.
Большое Обновление Енота | Raccoon Flash Explorer
Уже прошло много времени с тех пор, когда вышел мой прогер, и сейчас к нему вышло мощное обновление прошивки.
Что нового:
Появилась поддержка SPI NAND и 93Cxx eeprom.
Объём флешек может быть до 16Гбит.
Появился горячий детект флешек, чип сразу определяется при втыкании в сокет.
Другими словами диск с дампом откроется быстрее, чем успеешь перевести с чипа взгляд.
Появился особый режим работы, в котором можно в процессе чтения и записи выдергивать флешки из сокета или снимать клипсу ISP, и после возвращения контакта работа продолжится с места остановки без каких-либо ошибок.
Это незаменимо при работе с флешками большого объёма, и особенно при записи Spi Nor Flash.
UPD:
Дополню про особый режим работы.
Например вы шьете биос через клипсу в плате, и клипса отошла или соскочила.
Ну или забыли помыть и подтереть свою любимую колодку, и она грязная у вас :)
Биосы сейчас 16-64мб, а запись SPI NOR очень медленная даже на самых быстрых прогерах, потому что ну вот так она устроена.
При работе с разными другими прогерами в одних случаях вы про наличие ошибки не узнаете до завершения всего процесса и проведения сверки, или получите ошибку связи (но о постоянной проверке связи внутри запущенного процесса обмена лично я ни у каких других прогеров не слышал, может где-нибудь она и есть).
Тут же наличие ошибок и корректность каждого байта проверяется сразу после их чтения или записи, и потому об ошибке можно узнать сразу.
Раньше тут процесс просто прерывался принудительно, и юзеру сразу показывалась причина ошибки и адрес сбоя.
Но теперь сразу же для исправления ошибки обмен остановится и будет автоматически предпринят комплекс мер для исправления, включая расширенную проверку состояния связи с чипом (что это действительно тот самый чип, что он живой и может общаться с нами), подбор подходящих частот, может быть в будущем дополнительная проверка защит(пока не нужно), пережидание внешней активности, и при нормализации связи процесс просто продолжится дальше.
Слабый пк или же что то да может показать?
У меня есть пк который собирался ещё в 2011-2013 в ручную(точную дату не помню),gt 660,8 гб оперативки и еще какой то там AMD или AMX но тут к сожалению не помню,пк в ремонте из-за кое каких нюансов... тянет ранее популярные игры "grand theft auto" все части на данный момент,cs go(cs 2 не тянет по логичным причинам,sse 4.2 инструкций нету),TWD(the walking dead 1-4),beaming drive(в 5 фпс...),и CoD 1/2/3/advanced и прочие старые игры,думаю в этом году полностью пересобрать этого франкенштейна...
Сменить Майкрософт аккаунт
Сегодня после автоматического обновления 11 винда просит подтвердить аккаунт, естественно у человека нет ни пароля ни от основного эмайла ни от второстепенного.
Скрин прилагается.
Как скипнуть или сменить админку или создать войти в другой Майкрософт аккаунт?









