Monthly Archives: 1月 2011

UltraVNCの小技(6) — VNC Serverのビルド(1.0.9.5)

UltraVNC 1.0.9.5(のサーバ)をソースコードからビルドする方法のメモです。
Windows 7(32bit版) 上で、VisualStudio 2008 の環境でビルドしています。

  1. ソースコードの取得
  2. ソリューションを開く
      ソースコードを解凍したら、VisualStudioより、winvnc¥winvnc2008.sln を開きます(VS2008の場合)。

      「zlibstat」プロジェクトが読み込めない旨のエラーが出ますが、差し当たり無視します。
      また、デバッグに備えて、winvnc をスタートアッププロジェクトに指定しておきます。

  3. 「zlib」プロジェクト関連の設定
      ソリューションエクスプローラから「追加」−「既存のプロジェクト」をクリックし、zlib¥zlib.dsp を選択し、「zlib」プロジェクトを追加します(zlib フォルダは winvnc と同じ階層にある)。

      次に winvnc プロジェクトを右クリックし、「プロジェクトの依存関係」をクリックします。
      ダイアログが開いたら、依存先「zlib」にチェックを入れて「OK」ボタンを押します。

  4. libjpeg-turbo-win/libjpeg の設定(オプション)
      標準では libjpeg-turbo-win がビルドされて使われます。この際、ビルドに nasm(Netwide Assembler)が必要です。

      もし、何らかの理由で nasm が使えない場合は 「ソリューションのプロパティ」−「構成プロパティ」の「ビルド」項目で、 libjpeg-turbo-win のチェックを外し、 libjpeg のチェックを入れることで、nasm 無しでビルドできます(libjpeg-turbo-win の代わりに libjpeg を使います)。

  5. ビルド
      特に問題はないですが、リンクエラーが出る場合は、
      libjpeg-turbo-win のライブラリが作成済みかどうか確認しましょう。
  6. デバッグ
      特に問題はないです。「デバッグ開始」しましょう。

p.s. ソースコードは後日アップします(何も変えてませんが…)。

ソースコードは、ここ からダウンロードできます。

ライセンスは、オリジナルの UltraVNC に準じます。

無保証です。

UltraVNCの小技(5) — cad.exe の自作

UltraVNC で「Ctrl-Alt-Del」を可能にするための「cad.exe」ですが、残念ながらソースコードが付いていません(大人の事情で)。

「cad.exe」は簡単に自作する事が出来ます(動作環境にやや制約がでますが)。
これで、オープンソースになります。

《参考リンク》http://blogs.msdn.com/b/itasupport/archive/2009/09/16/sendsas-step-by-step.aspx

ここに出てくる SAS は「secure attention sequence 」の略で、デフォルトは「Ctrl-Alt-Del」キーの同時押しです。Windows 7(2008 R2も) では、SAS をシミュレートするための SendSAS という API と、これを実現する sas.dll を最初から内蔵しており、追加ソフトウェア無しで API を利用できます( この記事 を参照)。

自作の cad.exe のソースコードは、実質1行です。

// (my)cadexe.cpp

#include "stdafx.h"
#include <windows.h>

#include<sas.h>

int _tmain(int argc, _TCHAR* argv[])
{
SendSAS(false); // サービスから呼び出す場合は、false を渡す。
return 0;
}

更に、SendSAS API を適切に実行するためには、UAC に関して適切な設定でビルドした上に、出来たバイナリに対して署名をしなければなりません。

所謂「オレオレ証明書」を使ってお手軽に作る手順は、下記のようになります。

  1. ソリューションを用意し、上記のソースコードをビルドする準備を整えます。
  2. マニフェストの設定を行います。
    1. 「UACの実行レベル」を「requireAdministrator」に設定します。
    2. 「UACによるUI保護のバイパス」を「True」に設定します。
  3. ビルドし、EXEファイルを作成します。
  4. 「オレオレ証明書」ファイル(.cer)を作成します。Visual Studio コマンドプロンプトを起動し、下記を実行します。
     >makecert -r -pe -n "CN=Test Certificate - For SendSAS Use Only" -ss MY testcert.cer
  5. 「オレオレ証明書」ファイルを、開発用マシンにインストールします。
    >certmgr.exe -add testcert.cer -s -r localMachine root
    
  6. 実行ファイルに署名します
    >SignTool sign /v /s MY /n "Test Certificate - For SendSAS Use Only" /t http://timestamp.verisign.com/scripts/timestamp.dll "cad.exe"
    
  7. UltraVNC(サーバ)を実行するマシンの「信頼されたルート証明機関」証明書ストアにも、先ほど作成した「オレオレ証明書」をインストールします。
  8. 自作した cad.exe を、オリジナルのそれと入れ替えます。

「Ctrl-Alt-Del」を試しましょう。期待した動作になりましたでしょうか。 Continue reading

UltraVNCの小技(4) — cad.exe の導入

改造した UltraVNC を使っていて、一つ不便な事があります。
「Ctrl-Alt-Del」キーを押した時の動作はどうでしょうか(vncviewer上では「Send Ctrl+Alt+Del to host」ボタンを押した時の動作)。「Ctrl-alt-del require service, no permission」というダイアログが出て、受け付けてもらえないと思います。UltraVNC をサービスとして実行している時がそうです(正式版を使っている場合は、ログオンダイアログが表示されたり、画面が切り替わったりするでしょう)。
次は、この問題を解決します。

  1. 「cad.exe」(UltraVNC が利用する追加モジュール)を入手
      正式版のインストーラを使ってインストールする際に、「Download Vista addons files now」にチェックを入れればインストールされます。ライセンスは これ )。
      入手したら、UltraVNC の実行ファイルがあるフォルダに置きます。
  2. ファイルの配置場所の確認
      UltraVNC のファイル群が、Program Files 配下にあるか確認します。
      サービスから「あの」画面を呼ぶ為には、ファイル群は特権のあるフォルダ配下に置かなければなりません。
  3. グループポリシーの設定
      グループポリシーエディタを起動し、「コンピューターの構成」−「管理用テンプレート」−「Windows コンポーネント」−「Windows ログオンのオプション」を開きます。
      Vista/7 では、「ソフトウェアの Secure Attention Sequence を無効または有効にする」という項目があります。
      「状態」を「有効」に、「オプション」を「サービスとコンピューターの簡単操作アプリケーション」に設定します。

もう一度、「Ctrl-Alt-Del」キーを試しましょう。期待した動作になったのではないでしょうか。

Continue reading

UltraVNCの小技(3) — VNC Serverのビルド(1.0.8.2)

ここまで触れてませんでしたが、UltraVNC(のサーバ)をソースコードからビルドしてみます。

私が幾つかの点で躓いたので、そのメモです。
以下は、Windows 7(32bit版) 上で、VisualStudio 2008 の環境でビルドしています。

  1. ソースコードの取得
      UltraVNCのサイトからダウンロードします。
      一つ前の安定版である 1.0.8.2 を取得します。
      私は、最新バージョンの 1.0.9.5 は上手くビルドすることが出来ませんでした(必要なファイルが幾つか無いようです)。
      (バージョンの 1.0.9.5 のビルドは こちら を参照)

      http://www.uvnc.com/download/1082/
  2. ソリューションを開く
      ソースコードを解凍したら、VisualStudioより、winvnc¥winvnc.sln を開きます。
      いきなり、一部読み込めないプロジェクトがある旨のエラーが出ますが、無くても何とかなります。ソリューションを開いた後で削除してしまいましょう。

      また、デバッグに備えて、winvnc をスタートアッププロジェクトに指定しておきます。

  3. ビルド
      ソリューションのビルドを実行します。

      「ファイルが使用中で書き込めない」旨のエラーが発生した場合は、めげずに再度ビルドを実行します。
      何度かビルドを実行すれば、実行ファイル等が生成されるでしょう(競合の理由は謎です…)。

  4. デバッグ(の前に幾つか設定)
      ビルドが通せるようになっても、更に UAC 関連の設定が必要です(設定してないと「開始できません。アプリケーション構成が正しくないため、このアプリケーションの開始に失敗しました」エラーが出ます)。
      winvnc のプロパティページから「リンカ」−「マニフェスト ファイル」の設定を開きます。
      「UACの実行レベル」が「asInvoker」になっているので「requireAdministrator」に変更します。
      「winvnc.exe」の manifest ファイルと requestedExecutionLevel が一致しない旨の警告が出る場合は、これも「requireAdministrator」に変更します。

      ちなみに、私の環境では、「winvnc.exe.x64.manifest」が使われたりして、アーキテクチャが「AMD64」になってて更に怒られるので、ここらも「X86」に変更しました(プラットフォームは 「Win32」 になっているのに何故?)。尚、可能であれば、winvncリソース中の名前を「winvnc.exe.x86.manifest」に変更した上で、修正した方がよいでしょう。

      再度ビルドしたら、VisualStudio 上でデバッグできるようになっています。「デバッグ開始」しましょう。

    p.s. VNCViewer は、ビルドに関して引っ掛かる部分はありません。サクッとビルドできます。

UltraVNCの小技(2) — 簡易インストーラの作成

改造したUltraVNC(サーバ)ですが、当然ながらインストールしないと話になりません。

という訳で、至極簡単なインストーラをバッチファイル(!)で作成してみました。

やることは、3つだけ。

  1. 必要なファイルのコピー
  2. Windows ファイアウォールの設定
  3. UltraVNCサービスの設定(登録と起動)

echo off
REM UltraVNC installer Modoki ver. 0.02

SET TARGETFOLDER=%ProgramFiles%\UltraVNC
SET EXEFILE=winvnc_32.exe
SET INIFILE=ultravnc.ini
SET DLLFILES=authadmin.dll authSSP.dll ldapauth.dll ldapauth9x.dll ldapauthnt4.dll logging.dll logmessages.dll vnchooks.dll workgrpdomnt4.dll
SET FILES=%EXEFILE% %INIFILE% %DLLFILES%
SET WINVNCSERVICE=uvnc_service
SET WINVNCPORT=5900
SET ALLOWIP=192.168.0.0/24

SET PWD=%~d0%~p0

REM *** ターゲットフォルダ内にファイルをコピー ***
mkdir "%TARGETFOLDER%"
for %%f in ( %FILES% ) do (
copy "%PWD%%%f" "%TARGETFOLDER%¥%%f"
if errorlevel 1 goto :ERROR
)

REM *** Windowsファイアウォールの設定 ***
for %%i in ( %ALLOWIP% ) do (
netsh advfirewall firewall add rule name=%WINVNCSERVICE% dir=in protocol=tcp remoteip=%%i localport=%WINVNCPORT% action=allow
)

REM *** UltraVNCサービスの登録と起動 ***
sc create %WINVNCSERVICE% binpath= "%TARGETFOLDER%\%EXEFILE% -service" start= auto
if errorlevel 1 goto :ERROR
sc start %WINVNCSERVICE%
if errorlevel 1 goto :ERROR

:SUCCESS
echo Success.
pause
goto :END

:ERROR
echo Error!
pause
goto :END

:END

「管理者として実行」してください(Vista/7等)。

ultravnc.ini ファイルは、uvnc_settings.exe を使って作成しましょう。

アンインストールは手作業で、というか、インストーラを元にして直ぐアンインストールバッチが書けますね。

UltraVNCの小技(1) — メニューの不要な項目を隠す

とても高機能で便利なUltraVNCですが、自分以外の人に使って貰おうとすると「この機能は触らせたくないな〜」と思う事も多々あります(サーバ起動後にタスクトレイのメニューからアクセスできる「Close VNC Connections」などの項目は、その筆頭)。という訳で、触らせたくなければメニューから隠してしまえ、というコロンブスの卵的なアイデア。

  1. UltraVNCのソースコードを取得し、解凍したら、VisualStudioで winvnc¥winvnc.sln を開きます。
  2. リソースビューから「IDR_TRAYMENU」を開けば、目的のメニューを編集することができます(下図を参照)。
  3. メニュー中の不要な項目を削除し、ビルドすればOK(ビルドに関しては こちら を参照)。

これで、誤操作を未然に防ぐことができます。

ソースコードは、ここ からダウンロードできます。

ライセンスは、オリジナルの UltraVNC に準じます。

無保証です。