AMAZON
最新記事
(07/14)
(10/27)
(05/17)
(05/13)
(05/13)
(04/11)
(10/22)
(10/18)
(07/27)
(07/09)
(06/15)
(06/13)
(06/13)
(06/12)
(06/12)
(06/12)
(06/11)
(06/11)
(06/11)
(06/10)
フリーエリア
最新コメント
最新トラックバック
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
久しぶりに、ActiveXを作って署名してアップしたら、丸一日はまってしまった。
実行しても安全として、MFC コントロールにマークするのをてっきりやり忘れてしまっていた事が原因。
忘れない為に、残しておこうということで、
普通に作成したMFC ActiveXは、スクリプトおよび初期化を実行しても安全としてマークされていません。
そのため、セキュリティ レベルが中または高に設定された Internet Explorer でコントロールの実行が出来ません。
そのため、開発者は、DllRegisterServerの関数を変更して スクリプトおよび初期化を実行しても安全として MFC ActiveX コントロールにマークする必要があります。
方法は、以下のとおり
実行しても安全として、MFC コントロールにマークするのをてっきりやり忘れてしまっていた事が原因。
忘れない為に、残しておこうということで、
普通に作成したMFC ActiveXは、スクリプトおよび初期化を実行しても安全としてマークされていません。
そのため、セキュリティ レベルが中または高に設定された Internet Explorer でコントロールの実行が出来ません。
そのため、開発者は、DllRegisterServerの関数を変更して スクリプトおよび初期化を実行しても安全として MFC ActiveX コントロールにマークする必要があります。
方法は、以下のとおり
- 以下の cathelp.h および cathelp.cpp ファイルをプロジェクトに追加して、ヘルパ関数 CreateComponentCategory および RegisterCLSIDInCategory を実装します。
Cathelp.h
#include "comcat.h"
// Helper function to create a component category and associated
// description
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);
// Helper function to register a CLSID as belonging to a component
// category
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
Cathelp.cpp
#include "comcat.h"
// Helper function to create a component category and associated
// description
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICatRegister,
(void**)&pcr);
if (FAILED(hr))
return hr;
// Make sure the HKCR\Component Categories\{..catid...}
// key is registered
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409 ; // english
// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is
int len = wcslen(catDescription);
if (len>127)
len = 127;
wcsncpy(catinfo.szDescription, catDescription, len);
// Make sure the description is null terminated
catinfo.szDescription[len] = '\0';
hr = pcr->RegisterCategories(1, &catinfo);
pcr->Release();
return hr;
}
// Helper function to register a CLSID as belonging to a component
// category
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICatRegister,
(void**)&pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by
// the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
- DllRegisterServer を変更し、コントロールを安全としてマークします。プロジェクトの .cpp ファイルに DllRegisterServer の実装を配置します。この .cpp ファイルにはいくつかの要素を追加する必要があります。CreateComponentCategory および RegisterCLSIDInCategory を実装するファイルをインクルードします。
#include "stdafx.h"※ ~Ctl.cppではなく、プロジェクト名.cpp のファイル。
#include "CatHelp.h" // ← 上記で追加したファイルをincludeする。
安全なコンポーネント カテゴリに関連付けられた GUID を定義します。
C~~App NEAR theApp; //これが書かれた後に以下のGUIDを追加※ここで指定されている 0x7dd~というGUIDは、気にせず、ここまま追加しちゃってください。
const CATID CATID_SafeForScripting =
{0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
const CATID CATID_SafeForInitializing = {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
コントロールに関連付けられた GUID を定義します。コントロールのメインの .cpp ファイルにある IMPLEMENT_OLECREATE_EX マクロから GUID を参照すると、容易に定義できます。以下のような形式に修正します。
const GUID CDECL BASED_CODE _ctlid =※ここで指定するGUIDは、コントロールのメインの.cppにある guidを指定するとなっていますが、要するに、プロジェクトCtl.cppの最初にほうに書かれている以下のソースの部分を探してください。
{ 0x43bd9e45, 0x328f, 0x11d0,
{ 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
//////////////////////////////////
// クラス ファクトリと guid を初期化します
IMPLEMENT_OLECREATE_EX(CTestCtrl, "Test.TestCtrl.1",
0x43bd9e45, 0x328f, 0x11d0, 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2)
CTestCtrl~は、作成したプロジェクトのコントロール名等
次に追加した関数などを実装する為に、DllRegisterServer 関数を以下のように変更します。
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
↓
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED( CreateComponentCategory(
CATID_SafeForScripting,
L"Controls that are safely scriptable") ))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED( CreateComponentCategory(
CATID_SafeForInitializing,
L"Controls safely initializable from persistent data") ))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED( RegisterCLSIDInCategory(
_ctlid, CATID_SafeForScripting) ))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED( RegisterCLSIDInCategory(
_ctlid, CATID_SafeForInitializing) ))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
- 他のコントロールがコンポーネント カテゴリを使用している可能性があるため、コンポーネント カテゴリは削除しない。
- UnRegisterCLSIDInCategory 関数が定義されてるが、デフォルトでは DllUnregisterServer によってコントロールのエントリがレジストリからすべて削除されるため、コントロールの登録情報からカテゴリを削除しても、ほとんど意味がない。
HKEY_CLASSES_ROOT\Component
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
HKEY_CLASSES_ROOT\Component
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
HKEY_CLASSES_ROOT\Component
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
PR
shutdown.exeでリモートからシャットダウンさせる為には、ファイアウォールでポートを開放しなければいけません。
ただ、shutdown.exeで使用されるリモート プロシージャ コール (RPC) の動的ポート割り当ては、DHCP (Dynamic Host Configuration Protocol) マネージャ、Windows インターネット ネーム サービス (WINS) マネージャなどのリモート管理アプリケーションによって使用されます。RPC の動的ポート割り当てでは、RPC プログラムによって 1024 より大きな特定のランダム ポートが使用されます。
ファイアウォールを使用しているユーザーは、RPC で使用するポートを制御することによって、ファイアウォール ルーターでこれらの TCP (Transmission Control Protocol) ポートのみが転送されるように構成することができます。
簡単に説明すると、まずリモート プロシージャ コール (RPC)の元TCP135ポートへ接続した後、動的に割り当てられた1024以上のわからないポートを使用して、このコマンドは、実行されます。
このわからないポートというのが曲者で、ポートが指定できないと、ファイアウォールの設定が出来ないので、動的に割り当てられるポートの範囲を指定してファイアウォールの設定ができるようにすれば、使用できますよ。って事です。
設定方法
ただ、shutdown.exeで使用されるリモート プロシージャ コール (RPC) の動的ポート割り当ては、DHCP (Dynamic Host Configuration Protocol) マネージャ、Windows インターネット ネーム サービス (WINS) マネージャなどのリモート管理アプリケーションによって使用されます。RPC の動的ポート割り当てでは、RPC プログラムによって 1024 より大きな特定のランダム ポートが使用されます。
ファイアウォールを使用しているユーザーは、RPC で使用するポートを制御することによって、ファイアウォール ルーターでこれらの TCP (Transmission Control Protocol) ポートのみが転送されるように構成することができます。
簡単に説明すると、まずリモート プロシージャ コール (RPC)の元TCP135ポートへ接続した後、動的に割り当てられた1024以上のわからないポートを使用して、このコマンドは、実行されます。
このわからないポートというのが曲者で、ポートが指定できないと、ファイアウォールの設定が出来ないので、動的に割り当てられるポートの範囲を指定してファイアウォールの設定ができるようにすれば、使用できますよ。って事です。
設定方法
以下で説明する値 (および Internet キー) は、レジストリに含まれていません。レジストリ エディタを使用して手動で追加する必要があります。また、REG_MULTI_SZ 値を追加する場合は、Regedit.exe ではなく Regedt32.exe を使用する必要があります。
警告 : レジストリ エディタまたは別の方法を使用してレジストリを誤って変更すると、深刻な問題が発生することがあります。最悪の場合、オペレーティング システムの再インストールが必要になることがあります。マイクロソフトは、レジストリの変更により発生した問題に関しては、一切責任を負わないものとしま す。レジストリの変更は、自己の責任において行ってください。
RPC に関する以下のパラメータは、レジストリ エディタを使用して変更することができます。以下に説明する RPC ポートに関連する値はすべて、レジストリ内の次のキーにあります。
HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\Internet\ Key Data Type
Ports (REG_MULTI_SZ)
開くポートの範囲には、5000 番より上のポートを指定します。5000 番より下のポート番号は、他のアプリケーションによって既に使用されている場合があり、DCOM アプリケーションとの競合を引き起こす可能性があります。また、これらの RPC ポートに依存して相互に通信するシステム サービスが複数あるため、少なくとも 100 のポートを開く必要があることが経験上わかっています。
注 : ポートの最小数は、コンピュータの構成に応じて、コンピュータ間で異なる場合があります。
警告 : レジストリ エディタまたは別の方法を使用してレジストリを誤って変更すると、深刻な問題が発生することがあります。最悪の場合、オペレーティング システムの再インストールが必要になることがあります。マイクロソフトは、レジストリの変更により発生した問題に関しては、一切責任を負わないものとしま す。レジストリの変更は、自己の責任において行ってください。
RPC に関する以下のパラメータは、レジストリ エディタを使用して変更することができます。以下に説明する RPC ポートに関連する値はすべて、レジストリ内の次のキーにあります。
HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc\Internet\ Key Data Type
Ports (REG_MULTI_SZ)
インターネットから使用できるすべてのポートを含む IP ポートの範囲、またはインターネットから使用できないすべてのポートを含む IP ポートの範囲を指定します。単一のポート ("5984" など) またはポートの範囲 ("5000 ~ 5100" など) を文字列で指定します。指定した文字列の表す数字が 0 ~ 65535 の範囲にない場合、または解釈できない文字列がある場合、RPC ランタイムにより、構成全体が無効なものとして処理されます。
PortsInternetAvailable (REG_SZ) : Y または N (大文字小文字は区別されません)
Y の場合、Ports キーで指定したポートは、そのコンピュータ上でインターネットから使用できるすべてのポートを示します。N の場合、Ports キーで指定したポートは、インターネットから使用できないすべてのポートを示します。
UseInternetPorts (REG_SZ) : Y または N (大文字小文字は区別されません)
システムのデフォルトのポリシーを指定します。
Y の場合、デフォルト値を使用するプロセスには、事前の定義に従って、インターネットから使用できるポートのセットからポートが割り当てられます。
N の場合、デフォルト値を使用するプロセスには、イントラネット専用ポートのセットからポートが割り当てられます。
以下に例を示します。1. | 以下のキーに Internet キーを追加します。 HKEY_LOCAL_MACHINE\Software\Microsoft\Rpc |
2. | Internet キーの下に、Ports 値 (REG_MULTI_SZ)、PortsInternetAvailable 値 (REG_SZ)、および UseInternetPorts 値 (REG_SZ) を追加します。 次の例で、ポート 5000 ~ 5100 は、新しいレジストリ キーがどのように設定されるかを示すために任意に選択されています。たとえば、新しいレジストリ キーは次のように表示されます。 Ports (REG_MULTI_SZ) : 5000-5100 PortsInternetAvailable (REG_SZ) : Y UseInternetPorts (REG_SZ) : Y |
3. | サーバーを再起動す ると、RPC の動的ポート割り当てを使用するすべてのアプリケーションが、5000 ~ 5100 の範囲のポートを使用するようになります。ほとんどの環境では、これらの RPC ポートに依存して相互に通信するシステム サービスが複数あるため、少なくとも 100 のポートを開く必要があります。 |
開くポートの範囲には、5000 番より上のポートを指定します。5000 番より下のポート番号は、他のアプリケーションによって既に使用されている場合があり、DCOM アプリケーションとの競合を引き起こす可能性があります。また、これらの RPC ポートに依存して相互に通信するシステム サービスが複数あるため、少なくとも 100 のポートを開く必要があることが経験上わかっています。
注 : ポートの最小数は、コンピュータの構成に応じて、コンピュータ間で異なる場合があります。
Windowsシステムが応答しなくなったり、VNCやリモートデスクトップでつながらなくなった場合、ほかのローカルのコンピュータから再起動したいことがまれにある。
またUSPに接続されている他のサーバを同時に停止させたいという時に便利な、shutdownコマンドについて解説します。
対象のOS: Windows XP、Windows Server 2003
ただ、この状態では、まだ問題があります。
ファイアウォールを設定している状態では、リモートシャットダウンが使用できません。
ファイアウォールで動作するように RPC の動的ポート割り当てを構成する方法
またUSPに接続されている他のサーバを同時に停止させたいという時に便利な、shutdownコマンドについて解説します。
対象のOS: Windows XP、Windows Server 2003
C:\>shutdown
使用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m \\コンピュータ名] [-t xx] [-c "コメント"] [-d up:xx:yy]
例えばこのコマンドを使って、リモートのコンピュータを再起動させるためには、次のようにパラメータを指定する。
使用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m \\コンピュータ名] [-t xx] [-c "コメント"] [-d up:xx:yy]
引数なし | このメッセージを表示します (-? と同じです) | |
-i | GUI インターフェイスを表示します。このオプションは最初に指定する必要があります | |
-l | ログオフ (-m オプションとは併用できません) | |
-s | コンピュータをシャットダウンします | |
-r | コンピュータをシャットダウンして再起動します | |
-a | システム シャットダウンを中止します | |
-m \\コンピュータ名 | シャットダウン/再起動/中止するリモート コンピュータの名前です | |
-t xx | シャットダウンのタイムアウトを xx 秒に設定します | |
-c "コメント" | シャットダウンのコメントです (127 文字まで) | |
-f | 実行中のアプリケーションを警告なしに閉じます | |
-d [u][p]:xx:yy | シャットダウンの理由コードです u = ユーザー コード p = 計画されたシャットダウンのコード xx = 重大な理由コード (255 以下の正の整数) yy = 重大ではない理由コード (65535 以下の正の整数) |
C:\>shutdown -r -f -m \\hogehoge -c "システムを再起動します"
※『-r』は、再起動するという意味で、『-f』は、警告なしで閉じます。ただ、この状態では、まだ問題があります。
ファイアウォールを設定している状態では、リモートシャットダウンが使用できません。
ファイアウォールで動作するように RPC の動的ポート割り当てを構成する方法
Vista OSでの失敗
購入したのは、Vaio TypeS VGN-SZ95Sなのですが、これはVistamモデル
法人のお客様向けのほうで同じ製品にXPモデルがあり、それにしておけばよかったのですが、まぁVistaを使った事がなかったので、時代の流れだし、Vistaでもいいかと思っていました。
そして、購入後、以前使用していた、VGN-S92を初期化して、インストールされていた、アプリケーション等を購入したバイオにインストールしていると、な、な、なんとVisual Studio 6.0がインストールできません!!
どうやらVistaには、Visual Studio 6.0がインストールできないようです。
Windows Vista と Visual Studio
(Visual Stdio 6.0のことなんて既に書かれていない・・・まぁサポートは終了しているので仕方ないですが)
後から知ったことなのですが、インストールを実行する時、管理者権限で実行するとすると無理やりインストールできるらしい。
但し、あとで色々と干渉して不具合も出るらしいです。
と、仕事でもまだバリバリ6.0で開発している自分にしては、この問題は致命的で、まだWindows XPである必要がある。
そこで、今のVistaをXPにダウングレードするか、デュアルブートを実現して、XPとVistaを共存させるかのどちらかである。
マイクロソフトでは、Windows Vista BusinessおよびUltimateインストールモデルは、新たにXPのライセンスを購入しなくても、Windows XP Professional へダウングレードすることができます。
マイクロソフトのダウングレード詳細
しかし、私が購入したのは、Windows Vista Home Premium なので対象外、これではとりあえずXPを購入する必要があるので、どうせ購入するのであれば、デュアルブートで共存させることにしました。
次回は、VistaインストールのVaioにXPをデュアルブートにする方法でも書こうかな
購入したのは、Vaio TypeS VGN-SZ95Sなのですが、これはVistamモデル
法人のお客様向けのほうで同じ製品にXPモデルがあり、それにしておけばよかったのですが、まぁVistaを使った事がなかったので、時代の流れだし、Vistaでもいいかと思っていました。
そして、購入後、以前使用していた、VGN-S92を初期化して、インストールされていた、アプリケーション等を購入したバイオにインストールしていると、な、な、なんとVisual Studio 6.0がインストールできません!!
どうやらVistaには、Visual Studio 6.0がインストールできないようです。
Windows Vista と Visual Studio
(Visual Stdio 6.0のことなんて既に書かれていない・・・まぁサポートは終了しているので仕方ないですが)
後から知ったことなのですが、インストールを実行する時、管理者権限で実行するとすると無理やりインストールできるらしい。
但し、あとで色々と干渉して不具合も出るらしいです。
と、仕事でもまだバリバリ6.0で開発している自分にしては、この問題は致命的で、まだWindows XPである必要がある。
そこで、今のVistaをXPにダウングレードするか、デュアルブートを実現して、XPとVistaを共存させるかのどちらかである。
マイクロソフトでは、Windows Vista BusinessおよびUltimateインストールモデルは、新たにXPのライセンスを購入しなくても、Windows XP Professional へダウングレードすることができます。
マイクロソフトのダウングレード詳細
しかし、私が購入したのは、Windows Vista Home Premium なので対象外、これではとりあえずXPを購入する必要があるので、どうせ購入するのであれば、デュアルブートで共存させることにしました。
次回は、VistaインストールのVaioにXPをデュアルブートにする方法でも書こうかな
以前使用していた、VAIO typeS 3年目を迎え、使えないわけじゃないが、調子が悪くなってきて、修理に出すか、購入するか、検討した結果、購入することにした。
前回、typeSを購入した理由は、B5サイズでスタイリッシュなデザインの割りに高スペックで、当時、オンラインゲーム(ファイナルファンタジーXI)をやってた事もあって、ノートパソコンで、FFが出来て、B5サイズのPCは、これぐらいしかなかった。
元々、ノートパソコンは、この15年間で
PowerBOOK(MAC 白黒液晶)
→Mebius(SHARP)
→ThinkPad(IBM)
→Let'sNote(松下)
→VAIO(SONY)
→Dynabook(東芝)
→VAIO typeS(SONY)
と、メーカにこだわらず、スペックやデザイン重視で購入してきましたが
ここにきて、特にこだわりもなかったので、色々見てたんですが、新しいtypeSのハイブリッドシステム、これには惹かれました。
やっぱり、ビデオ性能にこだわると、どうしても電池や、静音は犠牲にならざる得ない。
いままで、この問題だけは、あきらめていて、ほとんどノートパソコンなのに、電源は必須状態が続いていました。
でもこのハイブリッドシステムでは、起動時に、選択できるスタミナ時は、高性能なビデオカードを使用しないので、長時間PCが使える。
まぁバッテリが消耗してきたらどうなのかわかりませんが・・・(笑)
・・・・でもちょっと失敗しました。
OSをVistaモデルにしてしまったんです。
なぜかって? それは、また後日
前回、typeSを購入した理由は、B5サイズでスタイリッシュなデザインの割りに高スペックで、当時、オンラインゲーム(ファイナルファンタジーXI)をやってた事もあって、ノートパソコンで、FFが出来て、B5サイズのPCは、これぐらいしかなかった。
元々、ノートパソコンは、この15年間で
PowerBOOK(MAC 白黒液晶)
→Mebius(SHARP)
→ThinkPad(IBM)
→Let'sNote(松下)
→VAIO(SONY)
→Dynabook(東芝)
→VAIO typeS(SONY)
と、メーカにこだわらず、スペックやデザイン重視で購入してきましたが
ここにきて、特にこだわりもなかったので、色々見てたんですが、新しいtypeSのハイブリッドシステム、これには惹かれました。
やっぱり、ビデオ性能にこだわると、どうしても電池や、静音は犠牲にならざる得ない。
いままで、この問題だけは、あきらめていて、ほとんどノートパソコンなのに、電源は必須状態が続いていました。
でもこのハイブリッドシステムでは、起動時に、選択できるスタミナ時は、高性能なビデオカードを使用しないので、長時間PCが使える。
まぁバッテリが消耗してきたらどうなのかわかりませんが・・・(笑)
・・・・でもちょっと失敗しました。
OSをVistaモデルにしてしまったんです。
なぜかって? それは、また後日
SonyStyle
カテゴリー
プロフィール
HN:
かおん
性別:
非公開
最古記事
(02/26)
(02/27)
(05/07)
(05/11)
(05/11)
(05/12)
(05/13)
(05/13)
(05/23)
(09/14)
(10/01)
(02/25)
(02/25)
(02/29)
(03/02)
(03/02)
(03/07)
(03/08)
(04/20)
(02/12)
アクセスカウンタ