2010年11月11日星期四

.NetのDLLをCOMにして、VB6に使うように

.Net作成されたDLLをCOMとして使えるように、以下とステップ:
① .netでDLLを作成する。
    VS2005などIDEで行う。
  
② CMDよりregasm.exeでDLLファイルの型をレジストする。
  CMD例:
  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe Wxg.dll /tlb /codebase
  注意点: /tlbが必要です、これがあればWxg.tlbファイルを生成できます。
      後でEXCELのVBAやVB6のIDEの参照メニューからtlbファイルを参照する必要です。
      直接wxg.dllを参照するのはできないです。
      /codebaseは署名に関するものです、なくても大丈夫そうです。
      逆にあったら、署名ファイルを提供する必要です。

③ EXCELのVBAやVB6の「参照設定」からWxg.tlb を読み込む。
  これでVBの統合開発環境上で各クラスを呼び出す準備が整った事になる。

④ VB6ソースの中で、Dimで変数を宣言して使える。
  ただ補完機能ができないです。
  できるようにするにはClassInterface属性にClassInterfaceType.Noneを設定する。
  例:
  [ClassInterface(ClassInterfaceType.None)]
   public class GroupReplace : IReplacer

 さらにVB6中で.net DllのEventも使えようとすると、
 先に.netのEvent interfaceを宣言しなければなりません。
 例:
 public delegate void ReplaceEventHandler( string name );
 [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
 public interface ReplaceEvents
 {
   void Replaced( string input, string format );
 }
 次にComSourceInterfaces属性を使ってクラス側にそのインターフェイス名を指定する。
 [ComSourceInterfaces("Wxg.ReplaceEvents, Wxg")]
 [ClassInterface(ClassInterfaceType.None)]
 public class GroupReplacer: IReplacer
 {
   public event ReplaceEventHandler Replaced;
  }
   ComSourceIntarfaces属性値の引数は、最初がイベント用に定義したインターフェイス名、
   二番目がそのインターフェイスが存在するアセンブリ名である。
   これでVB6からイベントを利用できるようになる。

⑤ 一回でRegasmでレジストした後、また.netソースが改修しても再びRegasm不要のため
  dllのClassIDを固定GUIDで設定すればOKです。
  GUIDの生成はVS2008のTOOLsメニューGUID生成からできます。

ネットワーク上のセキュリティおよび信用確保:非対称暗号化復号化概略

ネットワーク上のセキュリティおよび信用確保するには
まず、以下3つの問題を解決する必要です。
①暗号化された内容は第三者に見れない。
②暗号化された内容は送信先に自分の身分を証明できる。
③暗号化された内容を一旦送信したら、それまでだ、後悔できないです。
 例:AはBに1000円振込のメールを送るとする場合、
   Bが受信できたら、復号して確信すると1000円だと了解しました。
   Aが送信した内容を2000円の振込履歴に改修しようとしても
   (仮証拠を作りたい)、できないです。


非対称暗号化復号化は以上の問題が解決できます。理論は以下で簡単に説明します。

非対称暗号化複合化の使用条件および場合
①A,B,C三人がいる。
三人とも自分の公開KEYを他の人に公開する、同時に自分の私有KEYをしっかり保管する。
例:
A :KeyList(A私、B公、C公)
B :KeyList(A公、B私、C公)
C :KeyList(A公、B公、C私)
②A⇒Bに送信するが、Cに見たくない場合。
暗号化方法:
Ⅰ Aは送信内容をKEY(A私、B公)で暗号化する。
Ⅱ A⇒A,B,Cに暗号化内容を送信する。
Ⅲ BはKEY(B私,A公)で復号できる。
   A,CはKEY(B公)があるが、KEY(B私)がないため復号できない、
   もちろん改修もできない。


======================
現実の運用中には、
①専門組織から企業や法人にKEY_PAIR(私、公)発行する。
②企業法人は自分のKEY私をしっかり保管するが、KEY公は社会に公開する。
③企業法人は社会に情報公開する時、KEY私で暗号化してから公開する。
 こうすると、誰でも真似はできないです。
④社会上のその他の企業や個人から公開された情報を見る先にその企業
 のKEY公を取得しなければなりません。
 KEY公を取得並びに本当にその企業であるかを確認するのは、
 KEY発行の専門組織のサーバに確認すればOKです。

例:
銀行から個人へ情報送付する時に、銀行のKEY(私)で暗号化し,個人は銀行のKEY(公)で見る。
個人から銀行へ振込や住所変更等重要な指示をする時に、先に銀行から個人のKEY_PAIRを
もらってから、個人のKEY(私)で暗号してから送信することです。

銀行のほうは個人のKEY(公)で復号して、指示通りに行うことです。
そうすることで、信用の確保ができることです。

2010年11月10日星期三

PLSQL Developer8 KEY

Official Download  And Register with under KEY.

product code:jtlhlj6flzrwd4dnwwpju2y8za89vb8r8yehxa32qvfv
serial number:2049878599
password:xs374ca

product code:4vj6rhs6wf5c844tfcpqqqzg5uprd29pax5tz4ln75
serial number:368600710
password:xs374ca

product code:khleqwl9ksfrghw9eh7ffwcn7fndjzt9sbsyw556
serial number:53696408
password:xs374ca

Windows Script勉強の5 高級3-SQLPlusでSQLを実行

'ORACLE11gでテストOK。

'-----はじまり
WScript.Echo "はじまり"
WScript.Echo "=================================="
Dim wsh
Dim sqlplus
Dim strStdOut
'SHELLを作成
Set wsh = CreateObject( "WScript.Shell" )
WScript.Echo "SQLPLUSを起動"
Set sqlplus = wsh.Exec( "SQLPLUS.EXE -S /NOLOG" )
WScript.Echo "SQLPLUSに初期設定"
sqlplus.StdIn.WriteLine( "SET PAGES 0" )
sqlplus.StdIn.WriteLine( "SET FEEDBACK OFF" )
sqlplus.StdIn.WriteLine( "WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK" )
WScript.Echo "DBに接続"
sqlplus.StdIn.WriteLine( "CONN UID/PASSWORD@DBName" )
WScript.Echo "DBに接続成功"
'SQLを実行
Dim sql
sql = "SELECT SYSDATE FROM DUAL;"
WScript.Echo "SQL実行: " & sql
sqlplus.StdIn.WriteLine( sql )
'EXIT SQLPLUS
sqlplus.StdIn.WriteLine( "EXIT SUCCESS;" )
'実行結果をログで出力
While Not sqlplus.StdOut.AtEndOfStream
 WScript.Echo "SQL実行結果:   " & sqlplus.StdOut.ReadLine
WEnd
WScript.Echo "SQLPLUSを終了"
WScript.Echo "=================================="
WScript.Echo "おしまい。"
'-----おしまい

出力結果ログ:
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
はじまり
==================================
SQLPLUSを起動
SQLPLUSに初期設定
DBに接続
DBに接続成功
SQL実行: SELECT SYSDATE FROM DUAL;
SQL実行結果:            10-NOV-10
SQLPLUSを終了
==================================
おしまい。

Windows Script勉強の5 高級3-WMIを使うPC管理

WSH を使用すると、WMI (Windows Management Instrumentation) を簡単に使用できます。
次のスクリプトは、WSH と WMI を使って特定ユーザーのログオン時刻を ADSI 経由で取得する例を示しています。

// JScript.
LoginProfiles = GetObject("winmgmts:").InstancesOf ("Win32_NetworkLoginProfile");
for(e = new Enumerator(LoginProfiles) ; !e.atEnd() ; e.moveNext())
{
   Profile = e.item();
   WScript.Echo(Profile.Name);
   WScript.Echo(Profile.LastLogon);
}

' VBScript.
Set LoginProfiles = GetObject("winmgmts:").InstancesOf ("Win32_NetworkLoginProfile")
   for each Profile in LoginProfiles 
      WScript.Echo Profile.Name
      WScript.Echo Profile.LastLogon
   next

Windows Script勉強の5 高級3-Scripting.Signer でファイルを署名する

スクリプトに署名すると、デジタル署名ブロックがコメントとしてスクリプトに書き込まれます。署名には、作成者の身元に関する情報がエンコードされて格納されるほか、スクリプト自体に関する情報もエンコードされてカプセル化されます。
このため、スクリプトを変更すると、署名が無効になります。

スクリプトへの署名をプログラムによって行うには、Scripting.Signer オブジェクトの
SignFile メソッドを使います。
<job>
<runtime>
   <named name="file" helpstring="the file to sign" required="true" type="string"/>
   <named name="cert" helpstring="the name of the signing certificate" required="true" type="string"/>
   <named name="store" helpstring="the name of the certificate store" required="false" type="string"/>
</runtime>
<script language="JScript">
   var Signer, File, Cert, Store;
   if (!(WScript.Arguments.Named.Exists("cert") && WScript.Arguments.Named.Exists("file"))) 
   {
      WScript.Arguments.ShowUsage();
      WScript.Quit();
   }
   Signer = new ActiveXObject("Scripting.Signer");
   File  = WScript.Arguments.Named("file");
   Cert  = WScript.Arguments.Named("cert");
   if (WScript.Arguments.Named.Exists("store"))
   {
      Store = WScript.Arguments.Named("store");
   }
   else
   {
      Store = "";
   }
    Signer.SignFile(File, Cert, Store);
</script>
</job>
注:スクリプトに署名するには、有効な証明書が必要です。

Windows Script勉強の5 高級3-WSHControllerの機能:リモートでスクリプトを実行

スクリプトをリモートで実行するにはWSHControllerが必要です。
// JScript.
RemoteTest.WSF
------------------------------- 
<package>
<job>
<script language="JScript">
var oController = new ActiveXObject("WSHController");
var oProcess = oController.CreateScript("c:\\wsh5.6\\beenhere.wsf", "remoteMachineNameOrIP");
// remoteでbeenhere.wsfを実行する。
oProcess.Execute();
while (oProcess.Status != 2) WScript.Sleep(100);
WScript.Echo("Done"); 
</script>
</job>
</package>
------------------------------- 
BeenHere.WSF ------------------------------- <package> <job> <script language="JScript"> var fso = new ActiveXObject("Scripting.FileSystemObject"); var fout = fso.CreateTextFile("c:\\beenhere.txt", true); fout.WriteLine(new Date); fout.Close(); </script> </job> </package> ------------------------------- 実行完了後、remoteMachineのc:\\beenhere.txtを確認して、
作成できた、中身は今の時間であれば、成功です。
' VBScript. RemoteTest.WSF ------------------------------- <package> <job> <script language="VBScript"> set oController = CreateObject("WSHController") set oProcess = oController.CreateScript("c:\wsh5.6\beenhere.wsf", "remmachine") oProcess.Execute While oProcess.Status <> 2 WScript.Sleep 100 WEnd WScript.Echo "Done" </script> </job> </package> ------------------------------- BeenHere.WSF ------------------------------- <package> <job> <script language="VBScript"> set fso = CreateObject("Scripting.FileSystemObject") set fout = fso.CreateTextFile("c:\beenhere.txt", true) fout.WriteLine Now fout.Close </script> </job> </package>