暇なときにウェブプログラミングが好きです。 あなたの自転車を書き、同時にビジネスと喜びを組み合わせることが決定されました。 コンソールを使用してコンピューターを制御する可能性が研究されました。まず、次の最小量のタスク(少し遅れて増加しました)に興味がありました。
- PCをスリープ状態にする機能
- ボリュームをオフにする機能
有名な検索エンジンの助けを借りて、コンソールプログラムNirCmdを見つけました。このプログラムを使用すると、上記のアクション以外にも非常に多くのアクションを実行できます。 主要部分を決定しました。 私が言ったように、私は少しPHPを学んでいます。私のWebサーバーは通常常に実行されているので、サーバーに関して特定のことは思いつきませんでした。 サーバーはphpで記述され、コンソールコマンドを実行するメソッドを表すControlと、着信要求を検証してControlクラスのメソッドを実行するRouteの2つのクラスで構成されます。
コントロールは次のようになります(コードは同じなので、短縮しました):
class Control implements ActionControl { protected $Path; // nirCmd; function __construct($p = 'C:/nircmd/nircmd.exe') { $this->Path = $p; } function standby() { `{$this->Path} standby`; } function hibernate() { `rundll32 powrprof.dll,SetSuspendState 0,1,0`; } function reboot() { `{$this->Path} exitwin reboot`; } function turnOff() { `{$this->Path} exitwin poweroff`; } function logout() { `{$this->Path} exitwin logoff`; } }
2番目のクラスはルートです。 実際、クライアントは彼に連絡しています。 クラスは主にリクエストを検証し、リクエストが正しい場合はControlクラスのメソッドを呼び出します。
次のようになります。
class Route implements ActionRoute { protected $possible = []; protected $ControlObj; function __construct($obj) { $this->possible = get_class_methods($obj); $this->ControlObj = $obj; } function route($arr) { forEach($arr as $key => $value) { if (in_array($key, $this->possible) && $value == 'true') { $this->execute($key); } else { Message::sent('wrong method'); } } } function execute($c) { $this->ControlObj->$c(); Message::sent('executed'); } }
Controlクラスのメソッドの数を簡単に拡張できるようにするため、Routeクラスの検証はControlクラスのメソッドの特定のリストに厳密に結び付けられるのではなく、むしろ結び付けられますが、考えられるすべてのメソッドがオブジェクト自体から抽出され、着信データがそれらと比較されます。
クライアントがアクセスしているファイルは次のようになります。
<? define("PATH", "C:/nircmd/nircmd.exe"); function __autoload($name) { require "class/$name.class.php"; } $obj = new Control(PATH); $route = new Route($obj); if ($_GET) { $route->route($_GET); } ?>
GETリクエストが到着すると、配列全体をrouteメソッドに返します。
クライアント部分は、コントロールボタンと1つのハンドラーで構成され、ajaxを使用してサーバーにデータを送信します。
var wrapper = document.querySelector(".wrapper"); function getXmlHttpRequest(){ if (window.XMLHttpRequest) { try { return new XMLHttpRequest(); } catch (e){ } } else if (window.ActiveXObject) { try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e){} try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e){} } return null; } wrapper.addEventListener('click', function(e){ var target = e.target; if(target.tagName!= 'BUTTON') return; if (target.getAttribute('data')=='qestion') { var yn = confirm("?"); if (!yn) return ajaxf(target.id); } ajaxf(target.id); }) function ajaxf($com) { var command = $com+'=true'; var xhr = new getXmlHttpRequest(); xhr.open('GET', 'remote.php?'+command, true); xhr.send(); xhr.onreadystatechange = function() { if (xhr.readyState != 4) return; if (xhr.status != 200) { console.log(xhr.status + ': ' + xhr.statusText); } else { console.log(xhr.responseText); } } }
現在までに、次の管理機能が実装されています。
- スリープモード
- 冬眠
- 再起動します
- 消す
- 出かける
- モニターをオフにします
- トリガー音の有効化/無効化
- ボリュームが大きい
- ボリュームが少ない
- メディアボタン、停止/次へ/前へ
私が受け取りたかったものはすべて受け取られましたが、彼らが言うように、食欲は食べることによってもたらされます。 サーバーからのフィードバック、つまり たとえば、最初にページにアクセスしたときに、現在の音量レベルをリクエストするなどです。 残念ながら、nirCmdは実行時に値を返しません。そのため、今あるものでは、その方法がわかりません。
セキュリティの問題。 これらはすべてローカルマシンで実行されますが、攻撃者がnirCmdコマンドの実行にアクセスできる場合は非常に悲しいでしょう。 多くの破壊的なアクションを実行できます。
GIthubの準備完了プロジェクト。