プラットフォームとしての有用性またはWindowsレジストリ

特定のアプリケーションの問題の解決策が、コードを保存および実行するためのプラットフォームとしてWindowsレジストリを使用することになった経緯をお話ししたいと思います。



優先順位



むかしむかし、XPからSevenに切り替えたとき、新しいシステムの重要な利点の1つは、プロセッサだけでなく、I / Oとページングの優先順位の導入であると考えました。 しかし、現在、私たちは庭に1ダースあり、これらの優先順位を管理するための便利な人員配置ツールはまだ登場していません。

驚いたことに、ほとんどのユーザーはこのような優れた機能をまったく認識していません。 既に実行中のプロセスの現在のCPU優先度を変更するタスクマネージャーのオプションに満足しています(許可されている場合のみ)。 また、ディスク交換またはスワッピングでバックグラウンドプロセスがLOWに設定されていても、より優先度の高いタスクを処理できない場合は、避けられない悪と見なされます。



起動するたびにタスクマネージャーにアクセスすることにうんざりしている人の中には、オブジェクト自体の前に重要なプログラムの起動にショートカットのようなものを挿入する人もいます。



cmd /c start /realtime
      
      





これにより、高優先度(リアルタイムではなく)で何かを実行できますが、I / O優先度の問題には影響しません。 さらに、多くのアプリケーションがファイルランチャーを使用し、ファイルランチャーがメインプログラムを起動します。 また、このバージョンでは、デフォルトの優先度で起動され、不要なランチャーのみが優先度が高いタスクマネージャーに表示されます。



この問題の解決策は、レジストリの「 Image File Execution Options



」にブランチを作成することですが、これを手で行うのは非常に面倒です。



もちろん、目的のプログラムのレジストリに正しいブランチを登録できるサードパーティのアプリケーションがいくつかありますが、最初の段落で「通常」という言葉を具体的に言及しました:多くの場合、これはサードパーティの実行可能ファイルのインストールを許可しないマシンで実行する必要があり、リムーバブルメディアは無効になっています、実行可能ファイル、パッケージ、アーカイブ、BAT、CMD、さらにはREGファイルを(インターネットとメールの両方から)受信することは困難です。 特に深刻な場合、ファイルの実際の内容は、タイプの変更またはドキュメントコンテナへの不正なタイプの埋め込みについて監視されます。



そこで、最近レジストリを使用して、CPU、IO、およびページングの両方でプログラムを起動する基本的な優先順位を変更できるユーティリティを作成するタスクを自分で設定しました。





最後の要件は、配信の観点だけでなく重要です。 これは、ユーティリティにブックマークや不要な機能が含まれていないことをユーザーに示すための普遍的な方法です。 同時に、GPLの要件の1つはソースコードの提供です。



記述された要件により、スクリプト言語であることが選択されました。その後の調査では、PowerShellに頼る必要さえないことが示されました。CMDとVBSの通常の構文で十分です。次に、batファイルではなく1行に1つのアクションを合わせました。 、いずれの場合もレジストリへのエントリが必要であるため、レジストリ内のすべてに適合するアイデアが生まれ、それによりファイルが存在しないという条件が満たされました。



結果は、実行可能ファイルのプロパティのドロップダウンサブメニューのようなユーティリティです。



画像



そしてここに彼女は:



 Windows Registry Editor Version 5.00 ;Copyright 2016 Trottle ;This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License version 3. ;This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ;See <http://www.gnu.org/licenses/> for more details. [-HKEY_CLASSES_ROOT\exefile\shell\Bpc] [HKEY_CLASSES_ROOT\exefile\shell\Bpc] "HasLUAShield"="" "MUIVerb"="Set base priority" "subcommands"="" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\01low] "MUIVerb"="Idle CPU, lowest IO, low paging" "Icon"="comres.dll,9" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\01low\command] @="cmd /q /c echo Windows Registry Editor Version 5.00>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & for /f \"delims=<\" %%i in (\"%1\") do echo [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%%~nxi\\PerfOptions]>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"CpuPriorityClass\"=dword:00000001>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"IoPriority\"=dword:00000000>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"PagePriority\"=dword:00000001>>%%TEMP%%\\pr.reg & regedit /s %%TEMP%%\\pr.reg & del %%TEMP%%\\pr.reg & msg * %~ni priority is set to IDLE" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\02below] "MUIVerb"="Below normal CPU, low IO" "Icon"="comres.dll,12" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\02below\command] @="cmd /q /c echo Windows Registry Editor Version 5.00>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & for /f \"delims=<\" %%i in (\"%1\") do echo [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%%~nxi\\PerfOptions]>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"CpuPriorityClass\"=dword:00000005>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"IoPriority\"=dword:00000001>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"PagePriority\"=->>%%TEMP%%\\pr.reg & regedit /s %%TEMP%%\\pr.reg & del %%TEMP%%\\pr.reg & msg * %~ni priority is set to BELOW NORMAL" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\03above] "Icon"="comres.dll,8" "MUIVerb"="Above normal CPU" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\03above\command] @="cmd /q /c echo Windows Registry Editor Version 5.00>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & for /f \"delims=<\" %%i in (\"%1\") do echo [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%%~nxi\\PerfOptions]>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"CpuPriorityClass\"=dword:00000006>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"IoPriority\"=->>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"PagePriority\"=->>%%TEMP%%\\pr.reg & regedit /s %%TEMP%%\\pr.reg & del %%TEMP%%\\pr.reg & msg * %~ni priority is set to ABOVE NORMAL" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\04high] "MUIVerb"="High CPU" "Icon"="comres.dll,16" "CommandFlags"=dword:00000040 [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\04high\command] @="cmd /q /c echo Windows Registry Editor Version 5.00>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & for /f \"delims=<\" %%i in (\"%1\") do echo [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%%~nxi\\PerfOptions]>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"CpuPriorityClass\"=dword:00000003>>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"IoPriority\"=->>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & echo \"PagePriority\"=->>%%TEMP%%\\pr.reg & regedit /s %%TEMP%%\\pr.reg & del %%TEMP%%\\pr.reg & msg * %~ni priority is set to HIGH" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\06ask] "MUIVerb"="Show current priorities" "Icon"="shell32.dll,23" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\06ask\command] @="cmd /q /c for /f \"delims=<\" %%i in (\"%1\") do reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%%~nxi\\PerfOptions\" /s | msg *" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\07default] "MUIVerb"="Restore to default" "Icon"="comres.dll,4" [HKEY_CLASSES_ROOT\exefile\shell\Bpc\shell\07default\command] @="cmd /q /c echo Windows Registry Editor Version 5.00>%%TEMP%%\\pr.reg & echo.>>%%TEMP%%\\pr.reg & for /f \"delims=<\" %%i in (\"%1\") do echo [-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%%~nxi\\PerfOptions]>>%%TEMP%%\\pr.reg & regedit /s %%TEMP%%\\pr.reg & del %%TEMP%%\\pr.reg & msg * %~ni priority is restored to default" ; If you do not want to have uninstaller you can skip next part: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\BpcSubMenu] "DisplayName"="'Set base priority' submenu" "DisplayIcon"="imageres.dll,73" "UninstallString"="cmd /q /c echo Windows Registry Editor Version 5.00>%TEMP%\\pr.reg & echo.>>%TEMP%\\pr.reg & echo [-HKEY_CLASSES_ROOT\\exefile\\shell\\Bpc]>>%TEMP%\\pr.reg & echo.>>%TEMP%\\pr.reg & echo [-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\BpcSubMenu]>>%TEMP%\\pr.reg & regedit /s %TEMP%\\pr.reg & del %TEMP%\\pr.reg" "DisplayVersion"="1.1" "URLInfoAbout"="http://habrahabr.ru/post/317802/" "NoModify"=dword:00000001 "NoRepair"=dword:00000001
      
      





したがって、インストールプロセスは次のようになります。上記のソースコードを取得し、regファイルとして保存し、実行します。 その後、安全に削除できます。 そして、実行可能ファイルを右クリックして、新しいサブメニューを取得します。



ただし、この場合、次の2つのことを検討する価値があります。



1.ユーティリティが行うことは管理者のみに許可されているため、管理者グループのメンバーでない場合、UACリクエストの費用は1人だけではありません。



2.Wind®wsは、何らかの理由で、EXEだけでなくラベルにもサブメニューを表示しますが、同時に最後のサブメニュー項目を呼び出しません。



また、次のことにも注意してください。



-まず、リアルタイムの優先度はありません。

-第二に、CPUを除くすべての優先順位が下にのみ下がる

-第三に、ページングの優先度はIOの優先度よりも少し高くなります。



これは、優先順位付けに関するマイクロソフトの推奨事項に沿っています。



-不要なものを減らし、権利を増やしません。

-スワップは、ファイルを操作するよりも重要です。

-リアルタイムを使用しないでください(「正直な」リアルタイムは、システム全体の安定性にとって本当に危険な場合があるため、レジストリを使用して設定したり、IOの優先度を高くしたりすることはできません)。



ファイアウォール



最初と2番目のギャップの間は小さいです-私は通常のファイアウォールで作業を簡素化するために同じ方法で決めました。 多くの人にとって彼は良い人ですが、彼を扱うのは便利ではありません。 この場合、プログラムの許可または禁止の作成を高速化することにしました。 (ルールをプログラムにバインドする機能は、外部に対する内部ファイアウォールの主な利点であると考えています。)発信接続をブロックするデフォルトモードでファイアウォールを使用するため、多くの場合、新しいプログラムを追加する必要があります。



これが判明しました:



画像



およびテキスト:



 Windows Registry Editor Version 5.00 ;Copyright 2016 Trottle ;This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License version 3. ;This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ;See <http://www.gnu.org/licenses/> for more details. [-HKEY_CLASSES_ROOT\exefile\shell\FWc] [HKEY_CLASSES_ROOT\exefile\shell\FWc] "MUIVerb"="Set firewall rules" "Icon"="imageres.dll,102" "subcommands"="" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\01] "MUIVerb"="block inbound" "Icon"="imageres.dll,100" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\01\command] @="cmd /q /c echo CreateObject(\"Shell.Application\").ShellExecute \"cmd\", \"/q /c chcp 1251 & netsh advfirewall firewall add rule name=\"\"%1\"\" dir=in action=block program=\"\"%1\"\" enable=yes | msg * \", \"\", \"runas\" > %%temp%%\\ev.vbs & cscript %%temp%%\\ev.vbs & del %%temp%%\\ev.vbs" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\02] "MUIVerb"="allow inbound" "Icon"="imageres.dll,101" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\02\command] @="cmd /q /c echo CreateObject(\"Shell.Application\").ShellExecute \"cmd\", \"/q /c chcp 1251 & netsh advfirewall firewall add rule name=\"\"%1\"\" dir=in action=allow program=\"\"%1\"\" enable=yes | msg * \", \"\", \"runas\" > %%temp%%\\ev.vbs & cscript %%temp%%\\ev.vbs & del %%temp%%\\ev.vbs" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\03] "Icon"="imageres.dll,100" "MUIVerb"="block outbound" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\03\command] @="cmd /q /c echo CreateObject(\"Shell.Application\").ShellExecute \"cmd\", \"/q /c chcp 1251 & netsh advfirewall firewall add rule name=\"\"%1\"\" dir=out action=block program=\"\"%1\"\" enable=yes | msg * \", \"\", \"runas\" > %%temp%%\\ev.vbs & cscript %%temp%%\\ev.vbs & del %%temp%%\\ev.vbs" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\04] "MUIVerb"="allow outbound" "Icon"="imageres.dll,101" "CommandFlags"=dword:00000040 [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\04\command] @="cmd /q /c echo CreateObject(\"Shell.Application\").ShellExecute \"cmd\", \"/q /c chcp 1251 & netsh advfirewall firewall add rule name=\"\"%1\"\" dir=out action=allow program=\"\"%1\"\" enable=yes | msg * \", \"\", \"runas\" > %%temp%%\\ev.vbs & cscript %%temp%%\\ev.vbs & del %%temp%%\\ev.vbs" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\06] "MUIVerb"="Show firewall panel" "Icon"="imageres.dll,109" [HKEY_CLASSES_ROOT\exefile\shell\FWc\shell\06\command] @="mmc.exe wf.msc" ; If you do not want to have uninstaller you can skip next part: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\FWcSubMenu] "DisplayName"="'Set firewall rules' submenu" "DisplayIcon"="imageres.dll,102" "UninstallString"="cmd /q /c echo Windows Registry Editor Version 5.00>%TEMP%\\pr.reg & echo.>>%TEMP%\\pr.reg & echo [-HKEY_CLASSES_ROOT\\exefile\\shell\\FWc]>>%TEMP%\\pr.reg & echo.>>%TEMP%\\pr.reg & echo [-HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\FWcSubMenu]>>%TEMP%\\pr.reg & regedit /s %TEMP%\\pr.reg & del %TEMP%\\pr.reg" "DisplayVersion"="1.1" "URLInfoAbout"="http://habrahabr.ru/post/317802/" "NoModify"=dword:00000001 "NoRepair"=dword:00000001
      
      





最初のユーティリティとは異なり、ここで1つのアイテムをクリックしても、他のアイテムはキャンセルされません。 禁止ルールを作成しても許可は消去されません。逆も同様です。 これは、1つのプログラムに対して複数のルールが作成され、将来、それぞれが(ポート、アドレス、モードなどによって)指定される場合に行われます。 したがって、「許可」と「ブロック」をクリックすると、2つのルールが作成され、プログラムへのネットワークアクセスが閉じられます(ルールの許可は許可よりも優先されます)。



両方のユーティリティのアンインストールは標準です-「プログラムと機能」に移動して削除します:



画像



PS Friendsは、レビューのおかげで、Win10のサブメニューの表示を改善し、ソースはバージョン1.1に更新されました



All Articles