C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ActiveXObjectの呼び出しに関して

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■88675 / inTopicNo.1)  ActiveXObjectの呼び出しに関して
  
□投稿者/ k3user (49回)-(2018/09/19(Wed) 11:47:29)

分類:[.NET 全般] 

InterNetExplorerの「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」は無効
した状態でJavaScriptのActiveXObject使用してDLLを呼び出したのですが、
エラーとなってしまいます。
(有効にするとエラーとはならず処理が行われます。)
あるサイトを参考に呼び出すDLLに対して以下のように
IObjectSafetyをImplementsしたのですが、実装に問題があるのか
うまく動作してくれません。
コーディング方法、設定等に問題がありましたら
ご指摘、ご教示のほどよろしくお願いいたします。


■呼出し方法
	Classic ASPにて以下ように呼出し
	var test = new ActiveXObject("TEST.clTEST");

■環境
	・InterNetExplorer Ver11
		・「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」は無効
		・「スクリプトを実行しても安全だとマークされているActiveXコントロールの初期化とスクリプトの実行」は有効
■その他
	・TEST.dllはクライアントPCに配置されている。
	・TEST.dllはGlobalSignにて署名されている。

■インターフェース:IObjectSafety
Imports System.Runtime.InteropServices
<ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD123")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Public Interface IObjectSafety

    <PreserveSig>
    Function GetInterfaceSafetyOptions(
                ByRef riid As Guid,
                <MarshalAs(UnmanagedType.U4)> ByRef pdwSupportedOptions As Integer,
                <MarshalAs(UnmanagedType.U4)> ByRef pdwEnabledOptions As Integer) As UInteger

    <PreserveSig>
    Function SetInterfaceSafetyOptions(
                ByRef riid As Guid,
                <MarshalAs(UnmanagedType.U4)> dwOptionSetMask As Integer,
                <MarshalAs(UnmanagedType.U4)> dwEnabledOptions As Integer) As UInteger
End Interface

■IObjectSafetyをImplementsしたClass:IObjectSafetyTLB
Public Class IObjectSafetyTLB : Implements IObjectSafety

    Private Const S_OK As UInteger = &H0

    Public Function GetInterfaceSafetyOptions(ByRef riid As Guid, ByRef pdwSupportedOptions As Integer, ByRef pdwEnabledOptions As Integer) As UInteger Implements IObjectSafety.GetInterfaceSafetyOptions
        Return S_OK
    End Function

    Public Function SetInterfaceSafetyOptions(ByRef riid As Guid, dwOptionSetMask As Integer, dwEnabledOptions As Integer) As UInteger Implements IObjectSafety.SetInterfaceSafetyOptions
        Return S_OK
    End Function
End Class

■IObjectSafetyTLBをInheritsしたClass:clTEST
<System.Runtime.InteropServices.ProgId("TEST.clTEST")>
<System.Runtime.InteropServices.Guid("3360D96C-4559-4158-A36A-F27B4CF00327")>
<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>
Public Class clTEST : Inherits IObjectSafetyTLB

    Public Function gfInit(param1 As String) As Short

		return 0;
    End Function

End Class


引用返信 編集キー/
■88676 / inTopicNo.2)  Re[1]: ActiveXObjectの呼び出しに関して
□投稿者/ 魔界の仮面弁士 (1844回)-(2018/09/19(Wed) 13:17:35)
No88675 (k3user さん) に返信
> InterNetExplorerの
× InterNetExplorer
○ Internet Explorer


>    Public Function gfInit(param1 As String) As Short
>		return 0;
>    End Function
これは Visual Basic の文法では無いような。(^^;


> <ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD123")>
これは何の GUID でしょうか?

ObjSafe.h で定められた IID_IObjectSafety のことだとすれば、
{CB5BDC81-93C1-11CF-8F20-00805F2CD064} で無ければなりませんよね。


>> DEFINE_GUID(IID_IObjectSafety, 0xcb5bdc81, 0x93c1, 0x11cf, 0x8f, 0x20, 0x0, 0x80, 0x5f, 0x2c, 0xd0, 0x64);

引用返信 編集キー/
■88677 / inTopicNo.3)  Re[2]: ActiveXObjectの呼び出しに関して
□投稿者/ k3user (50回)-(2018/09/19(Wed) 14:03:42)
魔界の仮面弁士様
返信ありがとうございます。

>Public Function gfInit(param1 As String) As Short
>    return 0;
>End Function
> これは Visual Basic の文法では無いような。(^^;
申し訳ございません。上記の関数はVB.Netの文法に則って
いないのでしょうか?

><ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD123")>
> これは何の GUID でしょうか?
> ObjSafe.h で定められた IID_IObjectSafety のことだとすれば、
> {CB5BDC81-93C1-11CF-8F20-00805F2CD064} で無ければなりませんよね。
上記に関しては投稿する際にGUIDを変えて投稿しました。本来は{CB5BDC81-93C1-11CF-8F20-00805F2CD064}です。

あれから以下のことを試した所、「安全だとマークされていないActiveXコントロールの実行」を無効にしても
動くようにはなったのですが、1は必須だと思うのですが、2〜5もしないといけないのでしょうか?


1.regasmによる登録
2.HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\Ext\PreApproved\{クラスのGUID}への登録
3.HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MicroSoft\Windows\CurrentVersion\Ext\PreApproved\{クラスのGUID}への登録
4.HKEY_CLASSES_ROOT\CLSID\{クラスのGUID}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
5.HKEY_CLASSES_ROOT\CLSID\{クラスのGUID}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}





引用返信 編集キー/
■88678 / inTopicNo.4)  Re[3]: ActiveXObjectの呼び出しに関して
□投稿者/ 魔界の仮面弁士 (1845回)-(2018/09/19(Wed) 18:38:27)
No88677 (k3user さん) に返信
>>> Public Function gfInit(param1 As String) As Short
>>>  return 0;
>>> End Function
>> これは Visual Basic の文法では無いような。(^^;
> 申し訳ございません。上記の関数はVB.Netの文法に則って
> いないのでしょうか?
Visual Basic では、セミコロンの箇所でシンタックスエラーになってしまうはず。
行末セミコロンを付与する言語文法は、JScript.NET や C# のものですね。


>>> Classic ASPにて以下ように呼出し
>>> var test = new ActiveXObject("TEST.clTEST");
これはおそらく、クライアントサイドのスクリプトでの呼び出しですよね。

クライアントサイドなら、それは、HTML + JScript の世界の話なので、
サーバー実装が Classic ASP であるかどうかは関係ありません。

もしも、サーバーサイドのスクリプトからの呼び出しである場合には、
JScript の new ActiveXObject や VBScript の CreateObject の代わりに、
ASP の Server.CreateObject メソッドを利用する必要があるのですが。


>>> TEST.dllはGlobalSignにて署名されている。
これは、<object> タグでロードするときに影響があったかと。
ActiveXObject からのロードに影響するかは未確認。



>>> <ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD123")>
>> ObjSafe.h で定められた IID_IObjectSafety のことだとすれば、
>> {CB5BDC81-93C1-11CF-8F20-00805F2CD064} で無ければなりませんよね。
> 上記に関しては投稿する際にGUIDを変えて投稿しました。
なんと。(^_^;)


> 本来は{CB5BDC81-93C1-11CF-8F20-00805F2CD064}です。
であれば OK ですね。

『ComImport』属性が付与されたものについては、レジストリに登録済みの
既知の ActiveX コンポーネントを示すための重要な値ですので、
ここは正確な 128bit 値で記載頂かないと、意味が変わってきてしまいます。
clTEST の方は自作されたクラスなので、任意の UUID で良いのですが。


それと、IObjectSafety の実装ですが、
::SetInterfaceSafetyOptions は、すべての引数が <[In]> なので空実装でも良いですが、
::GetInterfaceSafetyOptions は、第1引数が <[In]>、第2/第3属性が <[Out]> のはずなので、
出力引数に対して、0 あるいは 1〜15 のビットフラグ値を返答した方が良いと思います。
Out 引数の入力値が初期化済みである保証は無いので…。

第1引数に渡されてくる可能性のあるインターフェイスIDとしては、
ID_PersistStorage, IID_IPersistStream, IID_IPersistPropertyBag,
IID_IDispatch(Ex), IID_IInternetHostSecurityManager などが
ありそうですが、こちらは入力引数なので、今回は無視して良さそう。

肝心の 第2/第3引数に使うビット フラグの定義はこんな感じです。
 Const INTERFACESAFE_FOR_UNTRUSTED_CALLER As Integer = &H1 'Caller of interface may be untrusted
 Const INTERFACESAFE_FOR_UNTRUSTED_DATA As Integer = &H2 'Data passed into interface may be untrusted
 Const INTERFACE_USES_DISPEX As Integer = &H4 'Object knows to use IDispatchEx
 Const INTERFACE_USES_SECURITY_MANAGER As Integer = &H8 'Object knows to use IInternetHostSecurityManager

下記ページの後半部などで、少し説明されていました。
http://eternalwindows.jp/browser/activex/activex06.html


> 1は必須だと思うのですが、
必須ですね。もしくは
 regasm example.dll /regfile:example.reg
としてレジストリ情報を調べておき、
その内容をインストーラー等に組み込んでも OK です。

登録されるエントリはこのあたり。
https://qiita.com/EvilSpirit39/items/c959fc990d1660b77180


> 2〜5もしないといけないのでしょうか?
コンポーネントに安全マークを設定するには、IObjectSafetyを実装する方法と
カテゴリマネージャを使用する方法があると認識しています。

4 や 5 がカテゴリマネージャへの登録で、
4 が CATID_SafeForInitializing を、
5 が CATID_SafeForScripting ですね。
(コードからだと ICatRegister で登録されることが多いのかな?)

仕組みとしてはこのあたりに説明がありました。
https://tech.nikkeibp.co.jp/it/members/NBY/techsquare/20030502/4/


2 や 3 の PreApproved は、文字通り「事前承認済み」とマークする方法で、
ActiveX コンポーネントの提供者側が IObjectSafety を実装できない場合に、
利用者側で安全であるとマークするために使われるものだったと思います。



# IObjectSafety 関連は、私は実際に試したことが無いので、
# 正確に理解しているかは自信がありません。
# 間違っていたら、どなたかフォローいただけると有難いです。
引用返信 編集キー/
■88688 / inTopicNo.5)  Re[4]: ActiveXObjectの呼び出しに関して
□投稿者/ k3user (51回)-(2018/09/20(Thu) 09:42:30)
魔界の仮面弁士様
回答ありがとうございます。
> 申行末しセミコロンを訳付与ございませんする。上記言語文法のは関数、はVB.NetJScript.NET のや 文法に則って
>いないのでしょうか?C# のものですね。
申し訳ございません。元々のサンプルコードがC#だったのを私がVB.Netに置き換えたのですが、
投稿する際に手違いで混同してしまいました。

> もしも、サーバーサイドのスクリプトからの呼び出しである場合には、
> JScript の new ActiveXObject や VBScript の CreateObject の代わりに、
> ASP の Server.CreateObject メソッドを利用する必要があるのですが。

Test.Dllですが、クライアントに配置されているためActiveXObjectを使用しています。

以下のことを試してみました。(もう少し検証をしてみます。)

1.「事前承認済み」とマーク
2.カテゴリマネージャへの登録
3.IObjectSafetyの実装
○は登録または実装
&#9747;は未登録または未実装

----------------------
1   |&#9747;|○|&#9747;|&#9747;
-----------------------
2   |&#9747;|○|&#9747;|&#9747;
----------------------
3   |&#9747;|○|○|&#9747;
----------------------
結果  1  2  1  1 


結果1...「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」は無効にするとActiveXObject関数呼び出し時にエラー

結果2...「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」は無効にしてもエラーとならず処理が実行される。

引用返信 編集キー/
■88690 / inTopicNo.6)  Re[5]: ActiveXObjectの呼び出しに関して
□投稿者/ k3user (52回)-(2018/09/20(Thu) 09:43:35)
申し訳ございません。文字が化けてしまいました。
|&#9747;はバツマークです。
引用返信 編集キー/
■88703 / inTopicNo.7)  Re[6]: ActiveXObjectの呼び出しに関して
□投稿者/ Atata!! (5回)-(2018/09/21(Fri) 01:19:21)
2018/09/21(Fri) 01:24:22 編集(投稿者)

すみません。本当は検証してから回答したいのですが、
ちょっと時間が取れないのでポイントだけ回答します。

まずはセキュリティゾーンを確認してください。
現在のセキュリティのゾーンと設定しているゾーンが合致していることを。
ページを右クリックしてプロパティでゾーンを確認できます。
他の回答者とゾーンが違う場合、動作が異なるので確認しているゾーンを提示してもらえるとより正確な回答が期待できます。

.NET で実装する限りコードサイニング証明は IE からは参照されません。
他のセキュリティソフトに対する対策以外の理由がなければ適用しなくて問題ありません。
アセンブリの改竄を検出するのであれば、厳密名の付与だけで問題ないはずです。
ただし、コードをブラウザ越しにダウンロードする場合は上記の限りではありません。

IE11ではレジストリのコンポーネントカテゴリは無視してもらってよいはずです。
各IEのバージョンごとにかなり挙動が変わりましたが、IE11に限定するのであれば問題ないはずです。(やや自信なし)

IObjectSafety の実装状態によってブラウザの挙動が決定します。
IE11 では
・SetInterfaceSafetyOptions で S_OK を返す場合、「スクリプトを実行しても安全だとマークされているActiveXコントロールの初期化とスクリプトの実行」を参照します。
・IObjectSafety が実装されていないか SetInterfaceSafetyOptions が失敗を返す場合、「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」を参照します。
ですので、現在の IObjectSafety の実装ですと「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」の設定は関係ないはずです。

あと、ブラウザの保護モードも影響していたはずですが、この辺も検証できていません。すべてのブラウザで保護モードが有効であればとりあえず無視していただいてよいと思います。
引用返信 編集キー/
■88720 / inTopicNo.8)  Re[7]: ActiveXObjectの呼び出しに関して
□投稿者/ k3user (53回)-(2018/09/21(Fri) 17:42:06)
Atata!! 様

回答ありがとうございます。(返信が遅れて申し訳ございません。)

IEの設定は以下の通りです。

●セキュリティタブ
  ・信頼済みサイト(ASPが起動しているWEBサイトは信頼済みサイトに登録済み)
  ・保護モードを有効にする−>未チェック

 ■ActiveXコントロールとプラグイン
  ・ActiveXコントロールでのマルウェア対策ソフトウェアの実行
   −>無効
  ・ActiveXコントロールとプラグインの実行
   −>有効
  ・ActiveXコントロールに対して自動的にダイアログを表示
   −>無効
  ・ActiveXフィルターを有効にする。
   −>無効
  ・ActiveXフィルターを警告なしで使用することを承認済みドメインにのみ許可する。
   −>有効
  ・スクリプトレットの許可
   −>有効
  ・スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化と実行
   −>無効
  ・スクリプトを実行しても安全だとマークされているActiveXコントロールの初期化と実行
   −>有効
  ・バイナリピヘイピアとスクリプトピヘイピア
   −>有効
  ・署名されたActiveXコントロールのダウンロード
   −>有効
  ・未署名のActiveXコントロールのダウンロード
   −>有効

●詳細設定(関係がありそうなものを抜粋)
セキュリティの項目
 ・サーバーの証明書失効を確認する。 −>チェック
 ・TLS1.0を使用する −>チェック
 ・TLS1.1の使用−>チェック
 ・TLS1.1の使用−>チェック
 ・署名が無効な場合でもソフトウェアの実行またはインストールを許可する。−>未チェック
 ・統合Windows認証を使用する −>未チェック
 ・発行元証明書の取り消しを確認する。 −>未チェック
 ・
引用返信 編集キー/
■88778 / inTopicNo.9)  Re[8]: ActiveXObjectの呼び出しに関して
□投稿者/ k3user (54回)-(2018/09/26(Wed) 10:12:21)
当初の問題は解決しましたが、
十分な検証を行うために時間が必要なため
一旦は解決とさせてください。
回答を頂いた皆様、この度はありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ