エンタープライズWindowsストアアプリの配布における正当なバックドア

こんにちは、Habr! この記事では、Windowsストア用のエンタープライズアプリケーションを配布した経験を共有します



クライアントがいます。 リモートエージェントサービス用の大規模なポータルソリューションを作成、実装、および開発し続けている優秀なクライアント。 約1年前、Windows 8タブレットをベースにした従業員向けのモバイル職場を作成することが決定されました。

ただし、アプリケーションの作成は1つのタスクにすぎません。 次のステップを検討する必要がありました。エンドユーザーはさまざまな地域の会社の代表者であるため、顧客企業のタブレットにインストールしてロシア全土に分散させる必要がありました。 同時に、アプリケーションを更新するためのメカニズムが必要です。これがないと、あなた自身がどこにも理解できないからです。



テスト段階では、開発者ライセンスをインストールすることにより、1か月間アプリケーションを使用できます( リンク )。 しかし、アプリケーションを起動するときが来たら。 さまざまなオプションを検討しました。



  1. アプリストアを介した配布。

    この方法は魅力的だと思われます。「独自の」機能がパスワードで保護されているアプリケーションをリリースし、従業員のみがその目的のためにアプリケーションを使用できます。 しかし、そのような配布は、アプリケーションストアでの公開のルールに違反します。 応答で応答を受信する可能性が高い(iOSアプリケーションで既に発生しているように):

    2.12あなたのアプリは非常に限られた、またはニッチな一連のユーザー、つまりあなたの会社を対象としていることがわかりました。
  2. Windows Intune( リンク )、Air-Watch( リンク )など、組織のコンピューター管理プログラムの使用

    これらは、購入と構成に追加コストが必要な深刻なソリューションです。 さらに、それらは会社のITサービスによって使用される必要があります。 これらのシステムの使用は、間違いなく、リモートコントロールとデバイスの監視のほとんどすべての問題を解決しますが、現時点では、これらのシステムを構成して使用する準備ができていませんでした。
  3. 多くの場合、方法がありますので、少しだけ見てください ...


更新インストーラー



私たちは自分でタスクに対処し、アプリケーションをインストールする前にOCを構成し、Modern UIインターフェイスを使用してアプリケーションを直接インストールおよび更新するのに役立つプログラムを作成する自転車発明することにしました。

実際、同社が使用している企業のタブレットは、Windows 8 Professionalがインストールされたx86でした。 このアーキテクチャにより、ストアからアプリケーションを実行できるだけでなく、「古き良き」プログラムも実行できます。



そのため、アルゴリズムは標準的なようです:

  1. ユーザーはインストーラーを受け取り、クラシックアップデートプログラムをインストールします。
  2. プログラムは、アプリケーションの新しいバージョンの可用性をチェックし、バージョンがある場合は、完成したパッケージをダウンロードします。
  3. プログラムはパッケージを展開し、インストールスクリプトを実行します。
  4. これで、アプリケーションがインストール/更新されました。




サイドローディング



しかし、いつものように、すべてがそれほどスムーズではありません-ニュアンスがあります。 マイクロソフトが私たちのために作成したもう1つの難点があり、それは回避する必要がありました。アプリケーションのインストールは、通常、いくつかのシステム構成でブロックされます。 グループポリシーで「信頼できるアプリのインストールを許可する」が設定されていない限り、アプリケーションをインストールできません。 ただし、一部のプラットフォームでは設定自体を使用できません。 サイドローディングメカニズムの詳細( こちら )。



アプリケーションのインストールは次の場合に利用可能です。



オペレーティングシステムWindows 8 Enterprise、Windows 8 Professionalの場合:



オペレーティングシステムWindows 8 Enterprise、Windows 8 Professional、Windows RTの場合:



ドメインにコンピューターを追加したバージョンでは拒否されましたが、サイドローディングをアクティブにするキーが提供されました。

ユーザーのキーの設定とポリシーの設定はどのようなものですか? キーと一緒に送信されたインストール手順で問題が解決する場合がありますか?

  1. 開始するには、サイドローディングキーをインストールします。 管理者としてコマンドプロンプトを開き、コマンドを入力します。

    slmgr / ipk <サイドローディングキーはこちら...>

    slmgr / ato ec67814b-30e6-4a50-bf7b-d55daf729d1e
  2. ローカルグループポリシーエディターを開きます(スタート-> gpedit.msc)。 フォルダーNを見つけて、Xの値を変更します。
  3. ...


一般的に、経験の浅いユーザー向けのプロセスは自明ではないように見えますが、これを行う必要があります。 したがって、インストーラーを使用してプロセスを自動化しようとします。



すべてをまとめる



そのため、提案されたソリューション(インストーラー)は次のように機能します。.msiファイルとして(従業員間でメールで)配布され、システムにインストールされ、次のアルゴリズムに従って動作します。







インストール後、プログラムはトレイに最小化し、すぐに自動更新チェックを開始します。 アプリケーションがインストールされていない場合、次のメッセージがトレイに表示されます。







クリックすると、フォーム自体が表示され、アプリケーションの簡単な説明、情報ウィンドウ、進行状況バー、ボタンが表示されます。 情報ウィンドウには、「アップデートが利用可能です...」、「アプリケーションをインストールしています...」などの碑文が表示される場合があります。











インストール後、アプリケーションはトレイ内にあり、定期的に(1日に数回)サーバーに更新を要求します。 更新が利用可能な場合、アプリケーションはこれについてユーザーに通知します。



プログラムの一部技術的な実装に少し焦点を合わせるのは理にかなっています



コード例



グループポリシー設定
public static void SetGroupPolicy() { var key = Registry.LocalMachine.CreateSubKey(@"Software\Policies\Microsoft\Windows\Appx"); //…… key.SetValue("AllowAllTrustedApps", 1, Microsoft.Win32.RegistryValueKind.DWord); }
      
      







サイドローディングキーをインストールする
 public static void InstallSideloadingKey() { // ,    sideloading key if (IsSideloadKeyInstalled()) return; Process p = new Process() { StartInfo = new ProcessStartInfo() { FileName = @"C:\Windows\System32\slmgr.vbs", }, }; //   p.StartInfo.Arguments = "/ipk " + _sideloadingKey; p.Start(); p.SuppressPopups(); p.Close(); //   p.StartInfo.Arguments = "/ato ec67814b-30e6-4a50-bf7b-d55daf729d1e"; p.Start(); p.SuppressPopups(); p.Close(); }
      
      







キーがインストールされていることを確認します
 private static bool IsSideloadKeyInstalled() { // ,           //  sideloading key. bool result = false; Process p = new Process() { StartInfo = new ProcessStartInfo() { FileName = @"C:\Windows\System32\slmgr.vbs", }, }; p.StartInfo.Arguments = "/dlv"; //          . p.Start(); for (int i = 0; (i < 10) && (!p.HasExited); i++) { p.Refresh(); if (p.MainWindowHandle.ToInt32() != 0) { var list = WindowsHelper.GetChildWindows(p.MainWindowHandle); foreach(var ptr in list) { string windowText = WindowsHelper.GetText(ptr); if(windowText.Contains("APPXLOB") && windowText.Contains(_sideloadingKeyPart)) { result = true; } } //       WindowsHelper.CloseWindow(p.MainWindowHandle); Thread.Sleep(1000); } p.Close(); return result; }
      
      







アプリケーションパッケージをインストールする
 public static void UpdateApp(string appxPath) { if (String.IsNullOrEmpty(appxPath)) { //    .appxbundle" return; } // //   string command = @"/C powershell Add-AppxPackage "; command += appxPath; //      ? var package = PackageHelper.GetPackage(); if (package != null) { //    -   command += " -Update"; } Process p = new Process() { StartInfo = new ProcessStartInfo() { WorkingDirectory = @"C:\", FileName = "cmd.exe", Arguments = command, RedirectStandardOutput = true, UseShellExecute = false, }, EnableRaisingEvents = true, }; p.Exited += (s, e) => { //     var pr = s as Process; string text = pr.StandardOutput.ReadToEnd(); if (String.IsNullOrEmpty(text)) { //   .    . else //     . }; p.Start(); // Start process p.WaitForExit(); }
      
      









おわりに



説明されている配布方法は、もちろん非常に紛らわしいです。 より正確で便利なWindows 8アプリケーションを配布する方法があります。 しかし、私たちが設定された条件は、この方法で問題を解決することを余儀なくされました。 この決定により、あなたと顧客はサードパーティのシステムを購入して構成する必要がなくなります。 複雑なアプリケーションインストールアルゴリズムをユーザーにロードしません。 アプリケーションが認証に合格しないことを恐れる理由はありません。



All Articles