2017年5月9日火曜日

RemoteFX って使えない

リモートデスクトップはすごく便利に使っています。

Windows7 のノートパソコンから 別室にあるWindows7 のデスクトップパソコンをリモートしたり、Windows 2008 Server r2 サーバー機のリモート管理を行ったりしています。

ところが、今回二要素認証を導入しなければならないことになり、ちょっと問題が発生しました。
全てのパソコンにUSBメモリー風のデバイスを接続して、対応するパスワードを入れないとログインすることができなくなりました。

このUSBメモリー風デバイスは一人1個しかない。
リモートで別のパソコンを操作するということは、2台のパソコンにログインするということ。
ということは、デバイスが2個必要となるので、事実上リモート接続が不可能になってしまいました。

ここで色々彷徨ったら、RemoteFXなるものを導入すれば、操作する側(自分の目の前)のパソコンに接続したUSBデバイス(ローカルデバイス)を、操作される側(別室にある)のデバイスとして認識させることができるという情報をつかんだ。

もともと、DVDドライブやプリンターなどはこちら側に繋いだものを利用できるので、それが拡張されたという感覚ですね。

得られた情報では、Windows7 なら 32bit でも64bitでもOKで、SP1が適用されていることが条件となっている。

これを使えば完璧!ということで、色々試行錯誤をしたのに、どうしても設定できない。

もうちょっと彷徨ったら、なんと RemoteFX は、
Windows7 でも「Enterprise」か「Ultimate」エディションしか使えない!

そんなエディションありえへん!
無駄な時間を費やしてしまった。

しかも、結局リモートデスクトップと二要素認証のジレンマは解消できず。
こりゃ困った。




ClickOnce がとつぜん

ClickOnece で組んであったシステムが突然以下のようなエラーを吐いて動かなくなってしまった。

複数台の端末で同じ実行環境を作ってあった内の数台でダメ。
サーバー自体で起動した場合は普通に起動する。

怪しいのは1か月ぐらい前に、ウィルス対策ソフトを入れ替えたこと。
マカフィーからカペルスキーに。

でも、すべての端末は同じ環境なのに、なぜ?
しかも、ダメな端末も朝一は正常起動していたのが、途中で端末の電源を入れなおした後からダメになったような気がする。

やはりカペルスキーか?
ということで、ダメな端末の内の1台で、カペルスキーをアンインストールして実行してみたけど、たっぱりダメ。

一晩ネットを彷徨ったら、やはりウィルス対策ソフトで ClickOnece がダメになった例が報告されていることを発見。

そこで、カペルスキーのログを確認したところ、ありましたありました。
システムの実行ファイルを隔離してやがった。

まだカペルスキーを削除していない端末は、カペルスキーのインターフェースを使って、隔離ファイルを復元し、実行ファイルのあるフォルダをスキャン対象から除外する設定を施したら、普通に起動するようになった。

カペルスキーをアンインストールしてしまった端末は、隔離されたファイルを復元する方法がないので、別の端末のログを参考に実行ファイルを本来のフォルダにコピーして復元。
ところが、この実行ファイルはカペルスキーが確実にウィルス扱いするので、コピーする際に、大元のClickOnece配信サーバーから一旦中間サーバーを経由してダメ端末にコピーしようとすると、その中間サーバーにカペルスキーが居るので即座に駆除(隔離)してしまうので、手動でコピーしようとした瞬間に駆除されるというのを数回繰り返してしまった。
別のルートを使ってなんとかコピーして、正常起動を確認。

正常起動してた端末でも同じようにカペルスキーが入っていて、同じ辞書ファイルが配信されているのに、なぜ正常起動していたのかは不明。
もしかしたら、辞書ファイルの配信が上手くいってなかったのかも。(それはそれでもっと問題ありかも)

また、配信サーバーには偶然カペルスキーを入れていなかったので、大元の構造は破壊されていなかったのはラッキーでした。

マカフィーの時はそんなことなかったのに、カペルスキーにしてから約1か月でアウトとは、カペルスキーの技術力に問題ありなんじゃないの?

今回起動しなかったのはほんの2~3台だったのと、このシステムを利用している端末が10数台だけだったので軽症で済んだけど、ネットワーク自体は100台以上規模なので、もしもっと重要なファイルをカペルスキーが勝手に駆除しちゃうと、大打撃となる可能性があります。

----------------------------- Error LOG -------------------------------------
PLATFORM VERSION INFO
Windows : 6.1.7601.65536 (Win32NT)
Common Language Runtime : 4.0.30319.18444
System.Deployment.dll : 4.0.30319.18408 built by: FX451RTMGREL
clr.dll : 4.0.30319.18444 built by: FX451RTMGDR
dfdll.dll : 4.0.30319.18408 built by: FX451RTMGREL
dfshim.dll : 4.0.41209.0 (Main.041209-0000)

SOURCES
Deployment url :serverURL
Server : Microsoft-IIS/8.5
X-Powered-By : ASP.NET
Application url :serverURL
Server : Microsoft-IIS/8.5
X-Powered-By : ASP.NET

IDENTITIES
Deployment Identity : appname.Application.app, Version=1.9.0.2, Culture=ニュートラル, PublicKeyToken=4cf906, processorArchitecture=msil
Application Identity : appname.Application.exe, Version=1.9.0.2, Culture=ja, PublicKeyToken=4cf906, processorArchitecture=msil, type=win32

APPLICATION SUMMARY
* Online only application.
* Trust url parameter is set.
ERROR SUMMARY
Below is a summary of the errors, details of these errors are listed later in the log.
* Activation of ServerURL resulted in exception. Following failure messages were detected:
+ Activation failed.
+ アクセスが拒否されました。 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

COMPONENT STORE TRANSACTION FAILURE SUMMARY
No transaction error was detected.

WARNINGS
There were no warnings during this operation.

OPERATION PROGRESS STATUS
* [2017/04/18 10:04:40] :

ERROR DETAILS
Following errors were detected during this operation.
* [2017/04/18 10:05:12] System.Deployment.Application.DeploymentException (Activation)
- Activation failed.
- Source: System.Deployment
- Stack trace:
--- Inner Exception ---
System.UnauthorizedAccessException
- アクセスが拒否されました。 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
- Source: System.Deployment
- Stack trace:
at System.Deployment.Application.NativeMethods.CorLaunchApplication(UInt32 hostType, String applicationFullName, Int32 manifestPathsCount, String[] manifestPaths, Int32 activationDataCount, String[] activationData, PROCESS_INFORMATION processInformation)
at System.Deployment.Application.ComponentStore.ActivateApplication(DefinitionAppId appId, String activationParameter, Boolean useActivationParameter)