2010年11月30日星期二

VB.Net UserControlにEventを追加する。

UserControlは複数の子Controlを組み込んで新たなUserControlを作ることです。
例えば、Label,TextBoxとButtonの三つControlを組み込んで、InputPanelを作ります。
TextBoxに入力する内容をButtonクリックよりMessgeBoxで表示する。
この場合、
① UserControlを新規作ります。
② Label,TextBoxとButtonの三つControlを追加します。
③ UserControlはControlから継承なので、ButtonのようなClickイベントがありませんが、
  Clickイベントを発生させるため、追加します。
  追加内容は
  1、Event Clickを宣言します。
  2、該当UserControl所属するButtonがクリックされる時点で、UserControlのClickとして、処理を走ります。
  
  追加ソース例:
  Public Event Click As EventHandler
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        RaiseEvent Click(sender, e)
    End Sub
    注意点:UserControの使い画面にはUserControl.Clickイベントに対する処理Subが存在しなくても、RaiseEventで問題ありません。

2010年11月29日星期一

净化思想的两幅对联

————————————————
花繁柳密处拨得开,方见手段
风狂雨骤时立得定,才是脚跟
————————————————

每当遇到困惑时,可以想想自己的手段是否够严密老辣。

每当遇到抉择时,可以想想自己的脚跟是否够稳固持久。

————————————————
做好人,自当有正大光明之气象
成大事,不可无勤勉谨慎之功夫
————————————————

不可因小恶而为之,不可因小善而不为。
不为恶是义务,不为善是权利。
义务要遵守,同时善举也要做。

成事在天谋事在人,所以一定要勤勉谨慎。

2010年11月26日星期五

自定义HttpModule遇到的问题 解答Shadow和OverLoads及Overrides的区别

自定义的IHttpModule孙子CustomModule没有被Load的问题,搞清楚了。
其实并不是没有被Load,而是没有VB.net的语法问题,导致的执行BaseHttpModule的方法,而不是孙子CustomModule的方法。
具体情况是:
————————————————
类层次:
BaseHttpModule
   Implements IHttpModule
  ————————————————
CustomModule
   Inherits BaseHttpModule
————————————————
BaseHttpModule中的Init(context As HttpApplication)是Overridable的,
在子类CustomModule中可以被Overrides的。
刚开始没有注意到这个Overridable,简单写成了OverLoads才出的问题。
还改成了Shadow,结果也不行,最后才注意到这个Overridable。

顺便说一下,Shadow和OverLoads及Overrides的区别。
Overrides :通过Interface和具体类型名生成实体后,调用其方法的时候,实际调用的是最底层的实现逻辑。有时候在方法的开头会加上
例如MyBase.Init(context)
这样一句,目的是基类逻辑执行完之后,在执行自己的具体逻辑。

Shadow    通过Interface和具体类型名生成实体后,调用其方法的时候,实际调用的是最上层类的实现逻辑。底层的都被隐藏掉了。所以一般少用。

OverLoads    原意是重载。同一类中方法重载可以省略OverLoads,但是父子类中方法的重载,必须加上OverLoads。同参数的重载也是可以的,但是通过Inteface来调用的时候,只会调用上层的方法,类似于Shadow,底层的被隐藏了。想不被隐藏,还是得用Overrides明确。

自定义HttpModule遇到的问题

自定义HttpModule 继承自IHttpModule,
基本条件,实现其中的Init(HttpApplication app), Dispose()就可以了。
如果需要抓错,可以重写OnError。

由于HttpModule拦截处理的是Application级别的内容,
所以,Application范围内的任何内容都可以被过滤处理一遍。
比如想将所有的Request.Form中的内容都打出来,
就可以在Init方法中通过遍历app.Request.Form实现。
实现好的CustomModule需要加到Web.Config中的HttpModule段中,
这样下一次Application启动的时候,才会被调用的。
要注意的是,IIS7之后,单独在Web.Config中写也不会被Load,还要在IIS7中的Module管理中
追加这个自定义的Module。
<add name="ConstomModule"  type="Wxg.Web.ConstomModule, Wxg.Web"/>
type的值是[类型名称 + ,+ Assembly名称], Assembly名称就是*.dll或*.exe的*名称。


今天遇到了一个想不通的问题,我想在CustomModule和IHttpModule中间加一层BaseHttpModule,
目的是为了出一些Module级别的共通性Log。 CustomModule 从IHttpModule的儿子,降级成孙子之后,在Web.Config中将孙子配好了,却不被Load。
等调查清楚了再追加说明吧。

浏览器地址栏显示自定义图标

以为很难的问题,明白了,才知道就一句话的事。
IE7开始支持自定义图标,其他的主流浏览器也基本都支持。

方法是,在html头部加上一个
<link rel=”shortcut icon” href="sample.ico" />
おしまい。

2010年11月24日星期三

ReplaceHelper and FileReplacer's ReadMe.

ReplaceHelper and FileReplacer's ReadMe.
ReplaceHelper and FileReplacer is Written by WANGXG on 2010.
They are Regex Replace tool, and the main functions is below.
Functions
① Regex's Matches, Show the MatchCollection Results in a tree.
   tree structure:
   +Match
   |    |--Group
   |            |--Capture[index, length]1
   |            |--Capture[index, length]1
   |-----
   |    |--Group
   |            |--Capture[index, length]1
   +Match
   |    |--Group
   |            |--Capture[index, length]1
  
② Replace By Group Index under conditions.
   e.g.
   input:[ ZIP:001002, TEL:009-0032-3232 ] AND [ ZIP:001002, TEL:009-0022-3232 ]
   replace[ZIP:XXXXXX] to ZIP:002XXX, and replace[TEL:XX9-XXXX-XXXX] to [PHONE:XX3-XXXX-XXXX],
   conditions: Only ZIP:XXX0XX AND NOT TEL:009-003X-XXXX will be replaced.
   the replace systex is :
    <item>
     <pattern>
      <![CDATA[
   ZIP:([\d]{3})[\d]+,\s*(TEL):\d\d(\d)-[\d-]+
  ]]></pattern>
  <replace group="1"><![CDATA[
          002
  ]]></replace>
  <replace group="2"><![CDATA[
          PHONE
  ]]></replace>
  <replace group="3"><![CDATA[
          8
  ]]></replace>
  <do><![CDATA[
   ZIP:([\d]{3})0[\d]{2},\s*(TEL):\d\d(\d)-[\d-]+
  ]]></do>
  <undo><![CDATA[
   ZIP:[\d]+,\s*(TEL):009-002[\d-]+
  ]]></undo>
    </item>
③ For Replace a text file and replace patterns by name, with the next XML format:
 <?xml version="1.0" encoding="utf-8" ?>
 <replaces>
     <replace name="DeleteRemarksComment">
         <item>
             <pattern>
                 <![CDATA[\s*'''\s*\<remarks\>\s*\<\/remarks\>]]>
             </pattern>
             <replace group="0"><![CDATA[]]></replace>
         </item>
     </replace>
     <replace name="AspControl2CustomControl">
         <item>
             <pattern>
                 (asp:)\w+
             </pattern>
             <replace group="1"> sct:Custom </replace>
         </item>
     </replace>
 </replaces>

④ For different xmls:
 <?xml version="1.0" encoding="utf-8" ?>
 <replaces>
   <replace file="SubReplace2.xml"/>
     <replace file="SimplifyTextBox.xml"/>
     <replace file="InsertResource.xml"/>
    </replaces>
  
⑤ Add Systex with:
 [$WORDS$]: use WORDS to replace
 <$KEY$>  : use dictionary[KEY] to replace.
 {GROUPINDEX}: use Match.Group[GROUPINDEX]  to replace.

WINDOWS2008R2(64bit) + IIS7.5 +VB.Net3.5 + Oracle11g64bit WebApp発行問題解決策

誤解しないように:
①WINDOWS2008R2は64bitだけ提供していますが、64bitを明確に記述します。
②IIS7.5には.NetFrameworkの選択は.net2.0だけですが(.net3.5や.net4.0が選択できません)、
 正しいです。.net3.5/4.0は.net2.0をベースとして追加したライブですので、
 .net3.5をインストールしたら、.netFramework2.0のもとで動けます。
IIS7.5で発行時の「問題・原因・解決策」
①問題:Web.Configに <authentication mode="Windows"/>の記述で、Machine.configに上書きできません。
 原因:該当WebAppはIISManager中でApplicationに変換していませんでした。
 解決方法:IISManagerで仮ディレクトリに設定し、DefaultWebSiteではなく、独立のWebAppにする。
②問題:IISのLog確認より、HTTP302エラーが発生、アクセス権限が不足。
 原因:IIS_USERSからWebApp所在Directoryにアクセス権限なし。
 解決方法:WebApp所在Directoryの属性よりIIS_USERSのアクセス権限を追加する。
③問題:Application Start途中でエラーが発生、http500エラー。
 原因:Web.ConfigのHttpModuleにカスタマイズモジュールをAddしましたが、IIS7.5の「モジュール」管理には追加しません。
    IIS7.5のモジュール管理にはディフォルトはScriptModuleだけがLocalとして追加されています。
 解決方法:Web.configのHttpModuleに記述されたModuleを全部IIS7.5の「モジュール」管理に追加する。
④問題:発行環境と開発環境のODPバージョンが不一致、DBProvider見つかりません、または読み込めません。
    DBFactorys.GetFactory(providername)の行からエラーがthrowされました。
    発行環境IIS7.5で、ORACLEサーバは11g(64.bit), ODPは2.112.2.0
    開発環境ORACLE11gClient(32bit) ODPは2.112.2.2
 原因:IIS7.5の使っている.netFrameworkの環境はC:\windows\Microsoft.net\Framework64\Config\machine.config
    Not:                                   C:\windows\Microsoft.net\Framework\Config\machine.config
    IIS7.5 は64bitのODP2.112.2.2を読込もうとしてますが、見つからないため、エラーが出る。
 解決方法:32bitのODPVer2.112.2.2をサーバにインストールして、
    IISのApplicationPoolsの属性「enable 32 bit applications]をtrueに設定する。32bitのAPPをWOW64として実行する。
    ちなみにOTNに探したが、Ver2.112.2.2(64bit)のODPがありません。
以上で、環境がやっとできました。他のPCで発行のURLでアクセスしてみた結果OKでした。

2010年11月19日星期五

Log4net.config

the steps to let Log4Net run in ASP.Net 1.1 are:
  1. writing config section for Log4Net in web.config file
  2. insert logging code in conponents and web page code-behind
  3. At website's AssemblyInfo.cs or .vb file, add "<Assembly: log4net.Config.DOMConfigurator(Watch:=True)>" for VB.net or "[assembly: log4net.Config.XmlConfigurator(Watch=true)]" for C# to enable Log4Net to Log stuffs.
  4. compile the web application and run.
By searching and refering the posts here and here and here, comes out that the configuration way in ASP.NET 2.0 is little bit different, as follows:
  1. writing config section for Log4Net in web.config file
  2. insert logging code in conponents and web page code-behind
  3. At Global.asax file, under Application_Start event, add "log4net.Config.XmlConfigurator.Configure()" to trigger Log4Net to log stuffs.
  4. compile the web application and run.
By doing the settings above, Log4Net started to output logs in my ASP.Net 2.0 application.

2010年11月18日星期四

PowerShell概要

PowerShellはWSHの替わりものであります。
WSHの利用できる言語はVBScript,Javascriptですが、もうすでに.net時代なので、この二つのScriptはなかなか古い感じられ、さっさとOS管理用のScriptも昇級しよう。

PowerShellの特徴:
  • 豊富に用意された高機能なコマンド(「コマンドレット」
  • 「.NET Frameworkクラス・ライブラリ」との連携(.net Framework2.0必須)
  • 「ドライバ」経由でさまざまなデータストアへのアクセスが可能
これで、.netに上手な管理者たちは楽になるでしょう。

PowerShell2.0はWINDOW2008R2とWINDOWS7からOSに含まれています。
この前のバージョンのOS(WINXPまで)には使いたければ、先に.netframework2.0のインストールが必要です。それから、PowerShellをOSに対応するバージョンをインストールする。

PowerShellを利用するに当たって、何はおいても、まず「コマンドレット(Cmdlet)」の理解は欠かせない。コマンドレットとは、要は、PowerShellで利用可能なコマンドのことである。
標準で129種類にも及ぶコマンドレットが提供されており、これらコマンドレットを組み合わせることで、従来、コマンド・プロンプトやWSHでは実現できなかった(もしくは困難であった)処理を限りなく短いコードで実現することができる。

まずPowerShellで利用可能なコマンドレットをざっと確認してみることにしよう。利用可能なコマンドレットの一覧を取得するのはGet-Commandコマンドレットの役割だ。Get-Commandコマンドレットを利用することで、名前(Name)、構文(Definition)などを確認することができる。

詳細情報の確認にはGet-Helpコマンドレットを使う。
コマンドレットの末尾に「-?」オプションを付けてもよい
PowerShellでは、主要なコマンドレットに対してエイリアス(別名)を提供します。
例えば、カレント・フォルダ配下の情報を取得するためのGet-ChildItemコマンドレット――これはエイリアスを利用することで、以下のように書き換えることも可能だ。
例:
Set-Alias remove Remove-Item
意味はPowerShell中のファイル削除命令の Remove-Item をremoveに別名つけて、
PowerShell中でCMD中のようにファイル削除命令removeが使えることにした。

Get-Aliasにより現在の別名リスをを表示できます。

基本は命令キーワードにより実行するものですが、一行不足の場合、改行継続は”|”で使う。
例:
PS > Get-ChildItem |
>> Where-Object {$_.LastWriteTime -lt (Get-Date).AddMonths(-6)} |
>> ForEach-Object {$_.Delete()}

Get-ChildItemはCurrentDirectory下のファイルをリストする。|で改行
Where-Objectで最新書き込み時間は6ヶ月以内の条件をつける。
For-Each-ObjectでLOOPして結果を$_.Delete()で削除する。

PowerShellは変数のタイプがあります。


エイリアス .NET Frameworkの型名
byteSystem.Byte
intSystem.Int32
longSystem.Int64
single、floatSystem.Single
doubleSystem.Double
decimalSystem.Decimal
charSystem.Char
boolSystem.Boolean
stringSystem.String
array/td> System.Array
xmlSystem.Xml.XmlDocument
typeSystem.Type

特別なCHARもあります。

エスケープ・シーケンス概要
`bバックスペース
`n改行
`rキャリッジ・リターン
`tタブ

つまり、PowerShellは前と違って、.netFramework baseの高級Scriptである。

==========================================================
WINDOWS2008R2のServerCoreを最小インストールする場合は、
PowerShellと.NetFramework2.0が使えないですが。以下のコマンドで起動できます。
start /w ocsetup NetFx2-ServerCore
start /w ocsetup MicrosoftWindowsPowerShell

PowerShellを起動するには
start C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe
とします。

netコマンドの使い方

netコマンドは、Microsoft Windowsネットワークにおいて、ネットワーク関係の設定を行ったり、現在の状態を表示させたりするために使われるコマンドである。

クライアントOSの主流がMS-DOSからWindows環境に移るにつれ、ほとんどのネットワーク機能はWindows上からGUIベースで管理できるようになったが、同時にコマンド版の管理ツールであるnetコマンドの強化も継続して行われているので、必要に応じて使い分けるとよいだろう。特に、リモートからTelnetなどでログオンしてネットワークのトラブルシューティングを行うためには、このようなコマンドラインのツールはぜひとも使いこなせるようになっておきたい。

netコマンドには数多くのサブコマンドがあり、実際に利用する場合は、いずれかのサブコマンド名とそれに対するパラメータ類を続けて指定する必要がある。netコマンドだけを単独で起動すると(このコマンドの実体は%windir%\system32\net.exe。Windows 9x/Meの場合は%windir%\net.exe)、サブコマンドの一覧が表示される。

2010年11月17日星期三

IIS での HTTP 401 エラーのトラブルシューティング

トラブルシューティングの手順
HTTP 401 エラーのサブステータス コードを識別します。
サブ状態コードを識別する一般的な 2 つの方法があります。
サブステータス コードから IIS 6. 0 では、Web ログに記録です。 Web ログは、次の場所にあります。
%SYSTEMROOT%\System32\LogFiles\W3SVC###\
HTTP 401. 1: が無効なユーザーの資格情報によって拒否されました。
説明

IIS はユーザーの要求を実行するログオンできませんでした。 すべての要求は、要求が匿名場合でも、ユーザーに関連付けられたでなければなりません。

一般的な理由
  • 間違ったユーザー名またはパスワードが提供されます。 ログオンに失敗しましたしたユーザーを特定し、ユーザー名またはパスワードの修正します。
  • Kerberos 認証は失敗します。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください:
    326985  (http://support.microsoft.com/kb/326985/ ) IIS での問題の Kerberos 関連のトラブルシューティング方法
    ほかにも便利な Kerberos 記事次のとおりです。
    871179  (http://support.microsoft.com/kb/871179/ ) 受信した、"HTTP エラー 401. 1 - 権限: 無効な資格情報によりアクセスが拒否されました"エラー メッセージ IIS 6.0 アプリケーション プールの一部である Web site をアクセスするとき
    IIS 6. 0 (IIS 6. 0) を持つアプリケーション プール ID を構成します。
    http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/f05a7c2b-36b0-4b6e-ac7c-662700081f25.mspx (http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/f05a7c2b-36b0-4b6e-ac7c-662700081f25.mspx)

    統合 Windows 認証 (IIS 6. 0)
    http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/523ae943-5e6a-4200-9103-9808baa00157.mspx (http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/523ae943-5e6a-4200-9103-9808baa00157.mspx)

    (IIS 6. 0) の Kerberos の制約付き委任を構成します。
    http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/df979570-81f6-4586-83c6-676bb005b13e.mspx (http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/df979570-81f6-4586-83c6-676bb005b13e.mspx)
  • ローカルまたはドメイン ポリシーまたはユーザー権利の割り当て、ユーザーを防ぎますサーバーへのアクセスします。 サーバーはログオンの失敗を監査するには構成されている場合、セキュリティ ログに詳細可能性があります。 必要なユーザー権利は、次の資料を参照します。
    812614  (http://support.microsoft.com/kb/812614/ ) IIS 6.0 でのデフォルトのアクセス許可とユーザー権利
    271071  (http://support.microsoft.com/kb/271071/ ) IIS 5.0 Web サーバーに必要な NTFS アクセス許可とユーザー権利の設定方法
    832981  (http://support.microsoft.com/kb/832981/ ) ユーザーのセキュリティ イベント ログがいっぱいになったら Web サイトにアクセスできません。
    300549  (http://support.microsoft.com/kb/300549/ ) 有効にし、Windows 2000 のセキュリティ監査を適用する方法
  • このエラーは匿名アクセスが構成されている場合にも発生する可能性があります。 これは、ユーザー名または IIS メタベースに格納されている匿名アカウントに対してパスワード、ドメイン アカウントを使用する場合、ローカル ユーザー データベース (または、Active Directory ディレクトリ サービス) に格納された実績情報と異なる場合に発生します。 この問題を解決して IIS アカウントのパスワードをリセットします。
  • IIS 5. 0 を IIS 6. 0 を実行するサーバーをアップグレードした後は IIS は IIS 5. 0 互換モードで実行してください。 サーバーが IIS に切り替えられると 6. 0 分離モード、匿名の要求に対して HTTP 401. 1 エラーが表示されます。 これは IIS 5. 0 匿名パスワード同期の原因発生します。 この問題を解決をするには AnonymousPasswordSync メタベース キーを false に設定して、アカウントを IIS の匿名ユーザーのパスワードをリセットします。
  • このエラーに関するについては、記事の「サポート技術情報」(Microsoft Knowledge Base) を表示する次の資料番号をクリックしてします。
    896861  (http://support.microsoft.com/kb/896861/ ) 統合認証を使用して、IIS 5. 1 または IIS 6 でホストされている Web サイトを参照するとエラー 401. 1 を受信します。
    304201  (http://support.microsoft.com/kb/304201/ ) できないアクセス Web サイトまたは IIS を起動できないサービスを非ローカル システム アカウントと IIS と Windows 認証を使用して実行
    263140  (http://support.microsoft.com/kb/263140/ ) 匿名および基本認証ドメイン コントローラー上で IIS 5. 0 に接続するときの失敗します。
HTTP 401. 2: サーバーの構成によっては拒否されました
説明

クライアントのブラウザーと IIS でした認証プロトコルに一致しません。

一般的な理由
  • IIS での認証プロトコルの (匿名を含む) が選択されていません。 少なくとも 1 つの認証の種類選択してください。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください:
    253667  (http://support.microsoft.com/kb/253667/ ) エラー メッセージ: HTTP 401. 2 - 権限: 認証なしのサーバーの構成のため、ログオンに失敗しました
  • 統合認証のみを有効にし、それ以前]、非 - クライアント ブラウザーが、サイトにアクセスします。 これはクライアントのブラウザーに統合認証を実行できないためです。 この問題を解決をするには、次の方法のいずれかを使用します。
    • 基本認証を受け入れる IIS を構成します。 これはだけ発生 SSL 経由でセキュリティを確保するため。
    • 統合認証を実行できるクライアント ブラウザーを使用します。 Internet Explorer および Netscape ナビゲーターと Mozilla Firefox の新しいバージョンには、統合認証を実行できます。
  • 統合認証は、プロキシを経由します。 これは、プロキシ、NTLM 認証された接続を維持しないし、したがって、クライアントからサーバーに匿名の要求を送信するためです。 この問題を解決するオプションは次のとおりです。
    • 基本認証を受け入れる IIS を構成します。 これはだけ発生 SSL 経由でセキュリティを確保するため。
    • プロキシを使用しないでください。
リソースの ACL によって HTTP 401.3: が拒否されました
説明

このエラーは、ユーザーは、サーバーに正常に認証が、ユーザーが要求されたコンテンツに NTFS アクセス許可を持たない場合に返されます。

一般的なソリューション
  • コンテンツに NTFS アクセス許可を正しく設定します。 以下の資料の「NTFS のアクセス許可] を確認します。
    812614  (http://support.microsoft.com/kb/812614/ ) IIS 6.0 でのデフォルトのアクセス許可とユーザー権利
    271071  (http://support.microsoft.com/kb/271071/ ) IIS 5.0 Web サーバーに必要な NTFS アクセス許可とユーザー権利の設定方法
  • 適切な認証方法が設定されるされている確認します。 たとえば、統合認証を使用してユーザーが認証の資格情報のように求めされません。 この場合は、明確でないか、要求が認証する場合があります。
  • コンテンツがリモート共有上にある場合、は、ユーザーが十分な NTFS および共有のアクセス許可でことを確認します。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください:
    332142  (http://support.microsoft.com/kb/332142/ ) UNC 共有のコンテンツに対して NTLM 要求を行うと 401 エラー メッセージが表示される
HTTP 401.4: がカスタムの ISAPI フィルターによって拒否されました
説明

読み込まれた ISAPI フィルターには、要求拒否しました。

ソリューション

ISAPI フィルターは、要求を拒否を識別し、ソリューションを決定する開発者またはベンダーに連絡します。
カスタムの ISAPI または CGI Web アプリケーションで HTTP 401.5: が拒否されました
説明

ISAPI 拡張機能または CGI アプリケーション要求を拒否しました。

ソリューション

どの ISAPI 拡張機能または CGI アプリケーションは、要求を拒否を識別し、ソリューションを決定する開発者またはベンダーに連絡します。

結果

要約すると、HTTP 401 エラーをトラブルシューティングするときは、まずは常になりますサブステータス コードを確認します。
  • 401. 1: 認証が、試行しますが、失敗しました。
  • 401. 2: サーバーとクライアントでした認証プロトコルに同意できないため、認証が行われません。
  • 401.3: 認証が成功したがアカウントを認証には、要求されたリソースまたはコンテンツにアクセスする権限がありません。
  • 401.4: ISAPI フィルターは、要求を拒否します。
  • 401.5: ISAPI 拡張機能または CGI アプリケーションは、要求を拒否します。

IIS6.0 WebApplication Publish

開発環境: VS2008, Ajax3.5
発行環境:Windows XP IIS6.0

発行手順:
① VS2008でサンプルのWebApplication2を作成して、コンパイルする。

② VS2008でWebApplication2のプロジェクトを選択して、右クリック→発行→

 ③発行画面で発行パスを設定する。
注意:コピー内容について、基本は実行に必要なファイルのみですが、場合により変わります。

④ 発行先のフォルダにNETWORK SERVICEのアクセス権限を渡す。
これがアクセスできるの第一歩です。

⑤IISの配置、仮想ディレクトリを作成する。途中は全部ディフォルトでOKです。



⑥下図はディフォルト設定です。ディレクトリの参照を選択しない場合、アクセスフォルダ下に
default頁が見つからない場合、FileListしません、アクセスエラーの画面を表示する。

以上は簡単なIIS6.0の設定手順で。
上図のASP.NET Tabには.netframeworkのバージョン設定があります。
バージョン不一致のエラーが発生する場合、そこで調整ができます。

IIS7 Web.Config Security Filter Set

1 Filter Based on URL Sequences禁止输入URL直接访问WEB画面

<configuration>
<system.webServer>
<security>
<requestfiltering>
<denyurlsequences>
<add sequence=".."/>
</denyUrlSequences>
</requestFiltering>
</security>
</system.webServer>
</configuration>

2 Filter by Verbs 过滤访问动词,例如只允许Get方法的访问。

<configuration>
<system.webServer>
<security>
<requestfiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
</configuration>

3 Filter Based on Request Limits.对Request的过滤。
包括Request总长度,URL长度,查询字符串的长度。

<configuration>
<system.webServer>
<security>
<requestfiltering>
<requestLimits
       maxAllowedContentLength="30000000"
       maxUrl="260"
       maxQueryString="25" />
</requestFiltering>
</security>
</system.webServer>
</configuration>

4 Filter Based on File Extensions 过滤访问文件的后缀名。
例如禁止.asp,.xml的访问.

<configuration>
<system.webServer>
<security>
<requestfiltering>
<fileextensions allowUnlisted="true" >
<add fileExtension=".asp" allowed="false"/>
<add fileExtension=".xml" allowed="false"/>
</fileExtensions>
</requestFiltering>
</security>
</system.webServer>
</configuration>

5 Filter High Bit Characters 禁止包含非ASCII码的Request访问。

<configuration>
<system.webServer>
<security>
<requestFiltering allowHighBitCharacters="true" />
</security>
</system.webServer>
</configuration> 

6 Filter Out Hidden Segments禁止访问子目录下的部分目录
例 有http://test.com/A, http://test.com/B两个目录,只想A被访问。

<configuration>
<system.webServer>
<security>
<requestfiltering>
<hiddensegments>
<add segment="A"/>
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>

7 Filter Double-Encoded Requests 过滤二次编码的请求,回避二次编码攻击。

<configuration>
<system.webServer>
<security>
<requestFiltering
                  allowDoubleEscaping="false">
</requestFiltering>
</security>
</system.webServer>
</configuration>

什么是二次编码请求攻击, 将在下一篇详细说明。

cacls简介:ACL(Access Control Entry即[文件/目录]访问控制入口)的CUI工具

cacls是NTFS文件系统的命令行访问控制工具。
具体的使用方法可以在CMD下通过cacls查看帮助。
常用的有:
1 授予[用户/组],[文件/目录]权限

'授予users组 系统目录system32下所有dll r读权限
cacls "%SystemRoot%/system32/*.dll" /g users:r /e
'授予users组 系统目录/临时文件夹 c变更权限
cacls "%SystemRoot%/Temp" /g users:c /e

2 删除[用户/组],[文件/目录]权限
'删除users组 系统目录/system 访问权限
cacls "%SystemRoot%/system" /r "users" /e
'删除everyone组 系统目录/驱动文件夹 访问权限
cacls "%SystemDrive%" /r "everyone" /e

アクセス権: N なし
W 書き込み
R 読み取り
C 変更 (書き込み)
F フル コントロール

IIS 6.0 的默认权限和用户权限[FROM MSDN]

下表记录了 NTFS 文件系统权限、注册表权限和 Microsoft Windows 用户权限。此信息在安装套件中包含 Microsoft ASP.NET 时适用。本文重点关注 World Wide Web 发布服务,并不考虑文件传输协议 (FTP) 服务、简单邮件传输协议 (SMTP) 服务和 Microsoft FrontPage Server Extensions (FPSE) 等其他组件。

注意:为便于说明,本文档中的 IUSR_MachineName 帐户和配置的匿名帐户在使用时可以互换。



NTFS 权限


目录用户\组权限
%windir%\help\iishelp\commonAdministrators完全控制
%windir%\help\iishelp\commonSystem完全控制
%windir%\help\iishelp\commonIIS_WPG读取、执行
%windir%\help\iishelp\commonUsers(请参见“注意 1”。)读取、执行
%windir%\IIS Temporary Compressed FilesAdministrators完全控制
%windir%\IIS Temporary Compressed FilesSystem完全控制
%windir%\IIS Temporary Compressed FilesIIS_WPG完全控制
%windir%\IIS Temporary Compressed FilesCreator owner完全控制
%windir%\system32\inetsrvAdministrators完全控制
%windir%\system32\inetsrvSystem完全控制
%windir%\system32\inetsrvUsers读取、执行
%windir%\system32\inetsrv\*.vbsAdministrators完全控制
%windir%\system32\inetsrv\ASP compiled templatesAdministrators完全控制
%windir%\system32\inetsrv\ASP compiled templatesIIS_WPG完全控制
%windir%\system32\inetsrv\HistoryAdministrators完全控制
%windir%\system32\inetsrv\HistorySystem完全控制
%windir%\system32\LogfilesAdministrators完全控制
%windir%\system32\inetsrv\metabackAdministrators完全控制
%windir%\system32\inetsrv\metabackSystem完全控制
Inetpub\AdminscriptsAdministrators完全控制
Inetpub\wwwroot(或内容目录)Administrators完全控制
Inetpub\wwwroot(或内容目录)System完全控制
Inetpub\wwwroot(或内容目录)IIS_WPG读取、执行
Inetpub\wwwroot(或内容目录)IUSR_MachineName读取、执行
Inetpub\wwwroot(或内容目录)ASPNET(请参见“注意 2”。)读取、执行
注意 1:在使用基本身份验证或集成身份验证时以及在配置自定义错误时,都必须对此目录拥有相应的权限。例如,在出现错误 401.1 时,只有向已登录用户授予了读取 4011.htm 文件的权限,该用户才会看到预期的自定义错误详细信息。

注意 2:默认情况下,IIS 5.0 隔离模式中使用 ASP.NET 作为 ASP.NET 进程标识。如果将 ASP.NET 切换到 IIS 5.0 隔离模式,则 ASP.NET 必须对内容区域具有访问权限。IIS 帮助中对 ASP.NET 进程隔离进行了详细说明。有关其他信息,请访问下面的 Microsoft 网站:

ASP.NET 进程隔离
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e409289d-2786-4a34-bb7e-9c546602c2c8.mspx (http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e409289d-2786-4a34-bb7e-9c546602c2c8.mspx)
(可能为英文网页)


注册表权限


收起该表格展开该表格
位置用户\组权限
HKLM\System\CurrentControlSet\Services\ASPAdministrators完全控制
HKLM\System\CurrentControlSet\Services\ASPSystem完全控制
HKLM\System\CurrentControlSet\Services\ASPIIS_WPG读取
HKLM\System\CurrentControlSet\Services\HTTPAdministrators完全控制
HKLM\System\CurrentControlSet\Services\HTTPSystem完全控制
HKLM\System\CurrentControlSet\Services\HTTPIIS_WPG读取
HKLM\System\CurrentControlSet\Services\IISAdminAdministrators完全控制
HKLM\System\CurrentControlSet\Services\IISAdminSystem完全控制
HKLM\System\CurrentControlSet\Services\IISAdminIIS_WPG读取
HKLM\System\CurrentControlSet\Services\w3svcAdministrators完全控制
HKLM\System\CurrentControlSet\Services\w3svcSystem完全控制
HKLM\System\CurrentControlSet\Services\w3svcIIS_WPG读取


Windows 用户权限


收起该表格展开该表格
策略Users
从网络访问此计算机Administrators
从网络访问此计算机ASPNET
从网络访问此计算机IUSR_MachineName
从网络访问此计算机IWAM_MachineName
从网络访问此计算机Users
调整进程内存配额Administrators
调整进程内存配额IWAM_MachineName
调整进程内存配额Local service
调整进程内存配额Network service
跳过遍历检查IIS_WPG
允许本地登录(请参见“注意”)Administrators
允许本地登录(请参见“注意”)IUSR_MachineName
拒绝本地登录ASPNET
在身份验证之后模拟客户端Administrators
在身份验证之后模拟客户端ASPNET
在身份验证之后模拟客户端IIS_WPG
在身份验证之后模拟客户端Service
作为批处理作业登录ASPNET
作为批处理作业登录IIS_WPG
作为批处理作业登录IUSR_MachineName
作为批处理作业登录IWAM_MachineName
作为批处理作业登录Local service
作为服务登录ASPNET
作为服务登录Network service
替换进程级别令牌IWAM_MachineName
替换进程级别令牌Local service
替换进程级别令牌Network service

注意:在以默认设置全新安装的带有 IIS 6.0 的 Microsoft Windows Server 2003 中,Users 组和 Everyone 组都拥有“跳过遍历检查”权限。工作进程标识通过这两个组当中的一个继承“跳过遍历检查”权限。如果从“跳过遍历检查”权限中删除这两个组,工作进程标识将不会通过任何其他分配继承“跳过遍历检查”权限,因此工作进程将无法启动。如果必须从“跳过遍历检查”权限中删除 Users 组和 Everyone 组,请添加 IIS_WPG 组以允许 IIS 按预期方式运行。

注意:在 IIS 6.0 中,如果将基本身份验证配置为身份验证选项之一,则基本身份验证的 LogonMethod 元数据库属性将为 NETWORK_CLEARTEXT。NETWORK_CLEARTEXT 登录类型不需要“允许本地登录”用户权限。这同样适用于匿名身份验证。有关其他信息,请参见 IIS 帮助中的“基本身份验证默认登录类型”主题。您也可以访问下面的 Microsoft 网站:

基本身份验证
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/cf438d2c-f9c7-4351-bf56-d2ab950d7d6e.mspx (http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/cf438d2c-f9c7-4351-bf56-d2ab950d7d6e.mspx)

Windows Work Flow Foundation 勉強の1概要紹介

図一枚は文字千字より説明並びに理解し易いと感じられるでしょう。

「Windows Workflow Foundation」(以下、WF)*1は、2005年9月に開催されたPDC(Professional Developers Conference)で発表されたマイクロソフトの次世代ワークフロー基盤のことである。
業務や処理の流れを図示・ルール化したものです。

容易な開発と実行をサポートするWFが、Windows Communication Foundation(以下、WCF)やWindows Presentation Foundation(以下、WPF)と一緒に、Windows Vistaに搭載されるWinFX*2の一部として提供されることである。

 ※WinFXは次期WindowsクライアントOSのWindows Vistaに搭載される新APIセットで、次世代アプリケーションの開発・実行基盤である


マイクロソフトが公開しているWFの資料の中では、
WFは一連処理と人間参与処理を分けて定義すると、
・システム・ワークフロー(System Flow)
・ヒューマン・ワークフロー(Human Flow)
に分けています。普段のネットショッピングなどの流れはシステムワークフローであって、
人の承認などはヒューマン・ワークフローである。


システムワークフローはまた二つに分けれます。
・シーケンシャル・ワークフロー(Sequential Workflow)
・ ステートマシン・ワークフロー(State Machine Workflow

シーケンシャル・ワークフローは、UMLのアクティビティ図と同じような感じでワークフローを記述できる。アクティビティは行為と考えられ、何かをやるやらせることです。
シーケンシャルは行為に関するから、どの条件でなにをやるのかは基本です。

ステートマシン・ワークフローは、UMLの状態遷移図のイメージでワークフローを記述できる。
状態はやる前に、やった後、待ち合わせ等と考えられます。

BPEL (Business Process Execution Language)は何?

BPELは、WSDLで記述されたWebサービス・インターフェイスをベースとして、Webサービスの呼び出し、データの操作、障害通知、例外処理、プロセスの終了などのアクティビティを結び合わせて、複雑なプロセスを定義する。また、処理フロー記述のほかに、B2B(企業間の取引)フローのように、異なる企業間でのWebサービス連携の記述にも適用可能となっている。

BPELは、それまであったWSFL(IBM)とXLANG(マイクロソフト)というベンダ仕様を融合し、2002年8月にIBM、マイクロソフト、BEAシステムズによって発表され、その後2003年5月にIBM、マイクロソフト、BEA、SAP、シーベルによってBPEL 1.1が公開された。これを叩き台に標準化団体のOASISで標準化の作業が進められている。現状でも、BPEL仕様に準拠していれば、どのベンダ製品でも実行可能な形になっている。

ビジネスプロセスを記述・設計するための言語としての側面と、ビジネスプロセス・エンジン(オーケストレーション・エンジン)などと呼ばれる実行環境で、Webサービスによるプロセスを実行するスクリプト言語としての側面がある。

Windows Script勉強の1 補足パラメータを渡す

一件補足します。
WSにパラメータを渡すときに、渡されたパラメータがどう取得して使うのか、例を挙げます。

Set objArgs = WScript.Arguments
For I = 0 to objArgs.Count - 1
WScript.Echo objArgs(I)
Next

この例で、渡されたパラメータをメッセージとして表示する。
簡単ですが、test.vbsに保存して、ファイル(c:\log.txt)をtest.vbs上にドラッグしてドロップしていたら、メッセージ「c:\log.txt」を表示される。

2010年11月16日星期二

Create Windows Service by C#

.Net 下创建Windows Service 非常简单。

1 继承ServiceBase,根据需要Override OnStart, OnStop, OnPauce, OnContinue,OnShutDown等方法。
所以并不是所有的基类虚方法都要重写的,一般来说写一个OnStart就够了。
例如
public partial class HellowordService : ServiceBase
    {
        public HellowordService()
        {
            // ServiceBase继承自Component,所以也是个组件,可以直接将想要的服务
            // 分线程Component直接托近来使用,比如将FileSystemWatcher拖进来监视系统文件状况
            // 还可以拖个Backgroudworker近来,将具体的逻辑委托出去。
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            // TODO: Add code here to start your service.
            Console.WriteLine("Hello word!");
        }
    }
再来一个HelloWxgService
public partial class HelloWxgService: ServiceBase
    {
        public HelloWxgService()
        {
              InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            // TODO: Add code here to start your service.
            Console.WriteLine("Hello wxg!");
        }
    }

2 具体的Service类做好后,要做个Service安装类。
安装类要继承Installer基类,也是个组件,而且还要对这个继承类声明成执行安装属性
[RunInstaller(true)],是为了通过.net的安装工具installUtil安装时,告诉installUtil,安装入口是谁。
例:
    [RunInstaller(true)]
    public partial class WSManagerInstaller : Installer
    {
        public WSManagerInstaller ()
        {
            InitializeComponent();
        }
    }

3 Installer的子类HellowordServiceInstaller 中要添加ServiceInstaller和ServiceProcessInstaller。
一个Service,对应一个ServiceInstaller, 而ServiceProcessInstaller 就一个就够了。
ServiceProcessInstaller 是在InstallUtil安装服务时,写注册表用的安装类。
ServiceInstaller.ServiceName 设定值将在控制面板-管理工具-Service的列表中显示。
例:
   private ServiceInstaller serviceInstaller1;
   private ServiceInstaller serviceInstaller2;
   private ServiceProcessInstaller processInstaller;

   private InitializeComponent(){

      // Instantiate installers for process and services.
      processInstaller = new ServiceProcessInstaller();
      serviceInstaller1 = new ServiceInstaller();
      serviceInstaller2 = new ServiceInstaller();

      // The services run under the system account.
      processInstaller.Account = ServiceAccount.LocalSystem;
      processInstaller.User=null;
      processInstaller.Password=null;

      // The services are started manually.
      serviceInstaller1.StartType = ServiceStartMode.Manual;
      serviceInstaller2.StartType = ServiceStartMode.Manual;

      // ServiceName must equal those on ServiceBase derived classes.           
      serviceInstaller1.ServiceName = "TestFileWatherService";
      serviceInstaller2.ServiceName = "HelloewordService";

      // Add installers to collection. Order is not important.
      this.Installers.Add(serviceInstaller1);
      this.Installers.Add(serviceInstaller2);
      this.Installers.Add(processInstaller);
   }
4 Installer类做成后,通过InstallUtil.exe执行安装/卸载
InstallUtil.exe的路径是
%WINDOWS%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
安装命令:
%WINDOWS%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe  TestServices.exe
卸载命令(增加 -u ):
%WINDOWS%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe  -u TestServices.exe

以上,安装完之后,就可以通过windows的Service管理工具查看,并启动或停止。
注意:以上的例子中将服务设定成手动启动,
安装完后,可能要重起PC才有效,不然总是会出1083的服务不能启动错误。

2010年11月12日星期五

共通キーで暗号化複合化(対称アルゴリズム)

キーの作成と管理は、暗号プロセスの重要な部分です。
対称アルゴリズムでは、キーと初期化ベクター (IV) を作成する必要があります。
共通キーは暗号化複合化同一ということですので、
誰でも手に入れたら、復号できるのです。
したがって、作成したキーと IV は、情報共有者内部のみで公開します。

一般に、キーと IV はセッションごとに新しく作成する必要があり、
キーも IV も格納して、後のセッションで使用することは望ましくありません。

通常、共通キーと IV を離れた場所にいる人へ送信するためには、
非対称暗号化方式を使用して共通キーと IV を暗号化します。
これらの値を暗号化せずに安全でないネットワークをとおして送信することは、
値を傍受した人ならだれでもデータを復号化できるようになるため、非常に危険です。

つまり共通キーを使うのは
①セッション単位で共通キー(KEYとIV)を作成する。
②非対称キー(元私、先公)で共通キーを暗号化する。
③送信相手に暗号化された共通キーを送信する。
④送信相手は自分のに対する非対称キー(元私、先公)で復号化して、共通キーを取得する。
⑤お互いに共通キーで送受信する。
代表的な例はSSLです。
.Netで共通キーの生成例:
// インスタンス化された時点で、KEY、IVが生成されます。
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
//明示的に生成KEY,IVで、新たな別のKEY、IVを生成します。
//毎回生成されたKEY、IVは固定ではないです。
TDES.GenerateIV();
TDES.GenerateKey();

2010年11月11日星期四

.Net2.0明确手动管理Transaction简介

.Net2.0对业务Transaction的管理,有两种方式,
一种是TransactionScope的自动管理,所有逻辑只要包含在TransactionScope范围内,会被自动注册到一个Transaction,最终一次提交或回滚。

第二种就是用户自己创建ICommittableTransaction, 自己规定什么时候调用Commit或者Rollback。

第一种TransactionScope方式,已经在TransactionScope简介中介绍了。
说说第二种,手动明确管理Transaction.
代码例:

// Create the Transaction
ICommittableTransaction oTran = Transaction.Create();

// Open a connection to SQL Server 2005
using (SqlConnection oCn1 = new SqlConnection(this.sCn1))
{
    SqlCommand oCmd1 = new SqlCommand(this.sSQL, oCn1);
    oCn1.Open();

    // The connection is not yet enlisted in the transaction scope 
    oCn1.EnlistTransaction();

    // Now the connection is enlisted in the transaction scope 
    oCmd1.ExecuteNonQuery((ITransaction)oTran);
    oCn1.Close();
}

// Tell the transaction to commit 
oTran.Commit();

ICommittableTransaction,TransactionScope都在在.Net2.0的System.Transactions命名空间下。
注意ICommittableTransaction是管理业务Transaction用的,
有别于具体的某个DBConnection.BeginTransaction得到的DBTransaction.

TransactionScope简介

TransactionScope是.net2.0开始提供的事务处理机制中的关键。
Java2EE中有分散业务的Transaction管理,所以.net中也应该有。

TransactionScope能够实现的功能,简单的说其实就是分散业务的统合管理,
不再仅仅是一个DBConnection中的一连处理,可以像Java2EE一样管理所有的业务,
比如对多个数据库的操作,只要在TransactionScope内,就全受其所管。
而且,TransactionScope还可以嵌套,设定范围。

对于涉及Transaction的Aplication, MS推荐使用黯然型的TransactionScope,
即,具体的业务逻辑不需要关注什么时候BeginTransaction,什么时候Commit,或者Rollback,
只要将一堆事情,当成一件事做完就可以了。

具体例:
void btnImplicitDistributed_Click(object sender, EventArgs e)
{
    // Create the TransactionScope
    using (TransactionScope oTranScope = new TransactionScope(TransactionScopeOptions.Required))
    {
        // first job
        using (IConnection oCn1 = new SqlConnection(this.constr1))
        {
            ICommand oCmd1 = new SqlCommand(this.sSQL, oCn1);
            oCn1.Open();
            // At this point, the connection is in the transaction scope,
            // which is a lightweight transaction.
            oCmd1.ExecuteNonQuery();
            oCn1.Close();
        }
        // second job
        using (IConnection oCn2 = new OracleConnection(this.constr2))
        {
            ICommand oCmd2 = new OracleCommand(this.sSQL, oCn2);
            oCn2.Open();
            // The connection is enlisted in the transaction scope,
            // which is now promoted to a distributed transaction
            // controlled by MSDTC
            oCmd2.ExecuteNonQuery();
            oCn2.Close();
        }
        // Tell the transaction scope to commit when ready
        oTranScope.Consistent = true;
        // The following bracket completes and disposes the transaction
        // or do this.
        // oTranScope.Complete();
    }
}

上例中,各自DBTransaction会隐式的加入到TransactionScope中,正常处理结束后,在跳出using之后,就会判断TransactionScope的Commitable属性,决定是否执行Commit;中途出现Exception的话,自动调用Scope中保存的各个Tranasction的Rollback.

上例的两个DB操作,通常会放到两个Method中调用,或反射调用,甚至在一个LIST中遍历调用。只要是在这个Scope内,就算是一个大的Transaction。

TransactionScopeOptions范围限定简介:
TransactionScopeOptionsDescription
Required(default)If within a currently active transaction scope, this transaction scope will join it. Otherwise it will create its own transaction scope.
RequiresNewThis transaction will create its own transaction scope.
SuppressNo transaction.


嵌套
using(TransactionScope scope1 = new TransactionScope())
{
     try
     {
          //Start of non-transactional section 
          using(TransactionScope scope2 = new
             TransactionScope(TransactionScopeOption.Suppress))
          {
               //Do non-transactional work here
          }
          //Restores ambient transaction here
   }
     catch
     {}
   //Rest of scope1
}

.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>

Windows Script勉強の5 高級3-Shellの機能:レジストリにアクセス

WSH を使用すると、システム レジストリを管理できます。次のスクリプトは、それらの機能の使用例を示しています。
 
// JScript.
Sh = new ActiveXObject("WScript.Shell");
key =  "HKEY_CURRENT_USER\\"
Sh.RegWrite( key + "WSHTest\\", "testkeydefault");
Sh.RegWrite( key + "WSHTest\\string1", "testkeystring1");
Sh.RegWrite( key + "WSHTest\\string2", "testkeystring2", "REG_SZ");
Sh.RegWrite( key + "WSHTest\\string3", "testkeystring3", "REG_EXPAND_SZ");
Sh.RegWrite( key + "WSHTest\\int", 123, "REG_DWORD");
WScript.Echo( Sh.RegRead(key + "WSHTest\\"));
WScript.Echo ( Sh.RegRead(key + "WSHTest\\string1"));
WScript.Echo ( Sh.RegRead(key + "WSHTest\\string2"));
WScript.Echo ( Sh.RegRead(key + "WSHTest\\string3"));
WScript.Echo ( Sh.RegRead(key + "WSHTest\\int"));
Sh.RegDelete(key + "WSHTest\\");

' VBScript.
Set Sh = CreateObject("WScript.Shell")
key =  "HKEY_CURRENT_USER\"
Sh.RegWrite key & "WSHTest\", "testkeydefault"
Sh.RegWrite key & "WSHTest\string1", "testkeystring1"
Sh.RegWrite key & "WSHTest\string2", "testkeystring2", "REG_SZ"
Sh.RegWrite key & "WSHTest\string3", "testkeystring3", "REG_EXPAND_SZ"
Sh.RegWrite key & "WSHTest\int", 123, "REG_DWORD"
WScript.Echo Sh.RegRead(key & "WSHTest\")
WScript.Echo Sh.RegRead(key & "WSHTest\string1")
WScript.Echo Sh.RegRead(key & "WSHTest\string2")
WScript.Echo Sh.RegRead(key & "WSHTest\string3")
WScript.Echo Sh.RegRead(key & "WSHTest\int")
Sh.RegDelete key & "WSHTest\"

Windows Script勉強の5 高級3-Shellの機能:プログラムを実行

Shell.Execのできること:
強化された環境変数の引き渡し機能
実行可能ファイルの標準ストリームにアクセスする機能
// MyWhere.JS
if (WScript.Arguments.Count() == 0)
   WScript.Quit();
var Pattern = WScript.Arguments(0);
var Shell = new ActiveXObject("WScript.Shell");
var Pipe = Shell.Exec("%comspec% /c \"cscript //nologo mydir.vbs | cscript //nologo mygrep.vbs " + Pattern + "\"");
while(!Pipe.StdOut.AtEndOfStream)
   WScript.StdOut.WriteLine(Pipe.StdOut.ReadLine());
このプログラムは、オペレーティング システムを使ってプログラム間で情報をパイプし、
さらにその結果を自身の StdOut にパイプします。

追加説明:
%comspec%はCMDの環境変数です。
CMDで set  %comspec% で確認すると、
「ComSpec=C:\WINDOWS\system32\cmd.exe」が表示されるべきです。

Windows Script勉強の5 高級3-Shellの機能:ShortCutの作成

Shell オブジェクトを使って、デスクトップ上に特定のフォルダへのショートカットを作成する。
システム関連な処理やフォルダへアクセスにはShellが必要です。

URLのShortCut作成方法
// JScript.
var Shell, DesktopPath, URL;
Shell = new ActiveXObject("WScript.Shell");
DesktopPath = Shell.SpecialFolders("Desktop");
URL = Shell.CreateShortcut(DesktopPath + "\\MSDN Scripting.url");
URL.TargetPath = "HTTP://MSDN.Microsoft.com/scripting/";
URL.Save();

' VBScript.
Dim Shell, DesktopPath, URL
Set Shell = CreateObject("WScript.Shell")
DesktopPath = Shell.SpecialFolders("Desktop")
Set URL = Shell.CreateShortcut(DesktopPath & "\MSDN Scripting.URL")
URL.TargetPath = "HTTP://MSDN.Microsoft.com/scripting/"
URL.Save
ローカルファイルのShortCut作成方法

// JScript.
Shell = new ActiveXObject("WScript.Shell");
DesktopPath = Shell.SpecialFolders("Desktop");
link = Shell.CreateShortcut(DesktopPath + "\\test.lnk");
link.Arguments = "1 2 3";
link.Description = "test shortcut";
link.HotKey = "CTRL+ALT+SHIFT+X";
link.IconLocation = "app.exe,1";
link.TargetPath = "c:\\blah\\app.exe";
link.WindowStyle = 3;
link.WorkingDirectory = "c:\\blah";
link.Save();

' VBScript.
Set Shell = CreateObject("WScript.Shell")
DesktopPath = Shell.SpecialFolders("Desktop")
Set link = Shell.CreateShortcut(DesktopPath & "\test.lnk")
link.Arguments = "1 2 3"
link.Description = "test shortcut"
link.HotKey = "CTRL+ALT+SHIFT+X"
link.IconLocation = "app.exe,1"
link.TargetPath = "c:\blah\app.exe"
link.WindowStyle = 3
link.WorkingDirectory = "c:\blah"
link.Save
ShortCutの移動、コピー、削除はファイルとしてFSOで行う。
// JScript.
Shell = new ActiveXObject("WScript.Shell");
FSO = new ActiveXObject("Scripting.FileSystemObject");
DesktopPath = Shell.SpecialFolders("Desktop");
FSO.DeleteFile(DesktopPath + "\\test.lnk")

' VBScript.
Set Shell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
DesktopPath = Shell.SpecialFolders("Desktop")
FSO.DeleteFile DesktopPath & "\test.lnk"
’FSO.MoveFile DesktopPath, MyDocumentsPath

Windows Script勉強の5 高級2-Application Objectの起動および実行

①Wordの起動、Word のスペル チェック機能の使用例
// JScript.
//==========================================
var Word, Doc, Uncorrected, Corrected;
var wdDialogToolsSpellingAndGrammar = 828;
var wdDoNotSaveChanges = 0;
Uncorrected = "Helllo world!";
Word = new ActiveXObject("Word.Application");
Doc = Word.Documents.Add();
Word.Selection.Text = Uncorrected;
Word.Dialogs(wdDialogToolsSpellingAndGrammar).Show();
if (Word.Selection.Text.length != 1) 
   Corrected = Word.Selection.Text;
else
   Corrected = Uncorrected;
Doc.Close(wdDoNotSaveChanges);
Word.Quit();

' VBScript.
'==========================================
Dim Word, Doc, Uncorrected, Corrected
Const wdDialogToolsSpellingAndGrammar = 828
Const wdDoNotSaveChanges = 0

Uncorrected = "Helllo world!"
Set Word = CreateObject("Word.Application")
Set Doc = Word.Documents.Add
Word.Selection.Text = Uncorrected
Word.Dialogs(wdDialogToolsSpellingAndGrammar).Show

If Len(Word.Selection.Text) <> 1 Then 
Corrected = Word.Selection.Text
Else
   Corrected = Uncorrected
End If

Doc.Close wdDoNotSaveChanges
Word.Quit
 
 

②FSOでファイルを操作
' VBScript.
'  MYDIR.VBS
Option Explicit
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
DoDir FSO.GetFolder(".")
Sub DoDir(Folder)
   On Error Resume Next
   Dim File, SubFolder
   For Each File In Folder.Files
      WScript.StdOut.WriteLine File.Path
   Next
   For Each SubFolder in Folder.SubFolders
      DoDir SubFolder
   Next
End Sub

③RegExpでパラメータを解析して、ファイルを探す
' MyGrep.VBS
Option Explicit
Dim RE, Line
If WScript.Arguments.Count = 0 Then WScript.Quit
Set RE = New RegExp
RE.IgnoreCase = True
RE.Pattern = WScript.Arguments(0)
While Not WScript.StdIn.AtEndOfStream
   Line = WScript.StdIn.ReadLine
   If RE.Test(Line) Then WScript.StdOut.WriteLine Line
WEnd

Windows Script勉強の5 高級1-ネットワーク

ネットワークに関する制御にはWScript.Networkオブジェクトが必要です。
① MapNetworkDrive 作成
// JScript.
var net;
net = new ActiveXObject("WScript.Network");
net.MapNetworkDrive("I:", "\\\\computer2\\public","True","jdoe","jdoepassword");
' VBScript.
Dim net
Set net = CreateObject("WScript.Network")   
net.MapNetworkDrive "I:", "\\computer2\public","True","jdoe","jdoepassword"

パラメータ説明:
  • ローカル ドライブの割り当て (I: など)
  • マップされたリモート ドライブへのUNC (Universal Naming Convention) パス
  • ドライブを永続的に接続するかどうかを示すブール値 (省略可能)
  • ユーザー名 (省略可能)。別のアカウント情報を使用する場合に指定
  • パスワード (省略可能)。別のユーザー名を使用する場合に指定

②プリンタに接続
// JScript.
var net;
net = new ActiveXObject("WScript.Network");
net.AddWindowsPrinterConnection("\\\\ServerName\\PrinterName");

' VBScript.
Dim net
Set net = CreateObject("WScript.Network")   
net.AddWindowsPrinterConnection \\ServerName\PrinterName

③プリンタを既定に設定
// JScript.
var net;
net = new ActiveXObject("WScript.Network");
net.SetDefaultPrinter("\\\\ServerName\\PrinterName");

' VBScript.
Dim net
Set net = CreateObject("WScript.Network")   
net.SetDefaultPrinter file://servername/PrinterName

④Windows起動後、自動でLoginUserによりプリンタを設定等
// JScript.
var oNet, sUser, cInitial, startTime;
oNet = new ActiveXObject("WScript.Network");
// ユーザー名を取得します。Windows 9x および Windows Me では、スクリプト 実行時にユーザー
// がログオンしていない可能性があります。
// ログオンが完了するまで 0.5 秒間隔でチェックを繰り返します。
sUser = oNet.UserName;
startTime = new Date();
while (sUser == "")
{
   var curTime = new Date();
   if (curTime – startTime > 30000) WScript.Quit();
   WScript.Sleep(500);
   sUser = oNet.UserName;
}
// ユーザー名の頭文字に基づいて「H」ドライブおよびプリンタの共有を作成します。
cInitial = sUser.charAt(0).toUpperCase();
if (cInitial < "L")
{
   oNet.MapNetworkDrive("h:", "\\\\server1\\users\\" + sUser);
   oNet.AddWindowsPrinterConnection("\\\\printer1\\hp", "HP LaserJet 4");
}
else
{
   oNet.MapNetworkDrive("h:", "\\\\server2\\users\\" + sUser);
   oNet.AddWindowsPrinterConnection("\\\\printer2\\hp", "HP LaserJet 4");
}

' VBScript.

Option Explicit
Dim oNet, sUser, cInitial, startTime
' Helper object
Set oNet = CreateObject("WScript.Network")
' ユーザー名を取得します。Windows 9x および Windows Me では、スクリプト 実行時にユーザー
' がログオンしていない可能性があります。
' ログオンが完了するまで 0.5 秒間隔でチェックを繰り返します。
sUser = oNet.UserName
startTime = Now
Do While sUser = ""
   If DateDiff("s", startTime, Now) > 30 Then Wscript.Quit
   Wscript.Sleep 500
   sUser = oNet.UserName
Loop
' ユーザー名の頭文字に基づいて「H」ドライブおよびプリンタの共有を作成します。
cInitial = UCase(Left(sUser, 1))
If (cInitial < "L") Then
   oNet.MapNetworkDrive "h:", "\\server1\users\" & sUser
   oNet.AddWindowsPrinterConnection "\\printer1\hp", "HP LaserJet 4"
Else
   oNet.MapNetworkDrive "h:", "\\server2\users\" & sUser
   oNet.AddWindowsPrinterConnection "\\printer2\hp", "HP LaserJet 4"
End If

Windows Script勉強の4 WScript.exe および CScript.exe のオプション

次の表に示すオプションは、この表の中で例外として明記している場合を除いて、基本的に WScript.exe と CScript.exe のどちらでも使用できます。
パラメータ説明
//Bバッチ モードでスクリプトを実行します。ユーザー プロンプトおよびスクリプト エラーをコマンド ライン表示しません。既定の設定は、対話モードです。
//Dアクティブ デバッグを使用可能にします。
//E:engine指定したスクリプト エンジンでスクリプトを実行します。
//H:CScript または //H:WscriptCScript.exe または WScript.exe をスクリプト実行用の既定アプリケーションとして登録します。どちらも指定しなければ、WScript.exe が既定のアプリケーションとみなされます。
//I既定値です。対話モードでスクリプトを実行します。バッチ モードとは逆に、ユーザー プロンプトおよびスクリプト エラーの表示を有効にします。
//Job:<JobID>指定した JobID を .wsf ファイルから実行します。
//logo既定値です。バナーを表示します。nologo の逆の設定です。
//nologo実行時にバナーを表示しません。既定の設定では、logo が適用されます。
//Sこのユーザーに対して、現在のコマンド ライン オプションを保存します。
//T:nnスクリプトの実行を継続できる時間の上限 (タイムアウト) を設定します。既定では、スクリプトは制限なしで実行されます。//T パラメータでタイムアウトを設定すると、スクリプトが長時間にわたって実行されるのを防止できます。実行時間が指定値を超過すると、CScript が IActiveScript::InterruptThread メソッドを使用してスクリプト エンジンに割り込み、プロセスを強制終了します。
//UWindows NT および Windows 2000 で使用できるオプションです。コマンド ライン出力を Unicode にします。CScript には、Unicode と ANSI を自動的に判別する機能はありません。既定の設定では、ANSI が使用されます。
//Xスクリプトをデバッガで実行します。
//?コマンド パラメータの説明および使用法に関する概略を表示します。

Windows Script勉強の3 追加説明特別機能

 Wshはドラッグドロップ機能がサポートします。
例:
以下のソースをtest.vbsとしてHDに保存して、ほかのファイルをtest.vbsのICONにドラッグドロップすると、test.vbsは自動的に実行されて、ドラッグされたファイル名をメッセージボックスで表示する。
Set objArgs = WScript.Arguments
For I = 0 to objArgs.Count - 1
  WScript.Echo objArgs(I)
Next

スクリプトに対して .wsh ファイルを作成して、プロパティ指定で実行できます。

特定のスクリプトに対して .wsh ファイルを作成するには
  1. Windows エクスプローラで スクリプト ファイルを右クリックします。
  2. [プロパティ] をクリックします。
  3. スクリプトに適用する設定を選択します。
  4. [OK] または [適用] をクリックします。
注意:特定のスクリプトが存在しなければいけないエラーが発生します。
wshはshortcutファイル見たいです。

Windows Script勉強の2 拡張子

拡張子
VBS VBScript言語で記述されたスクリプト・ファイル
JS JScript言語で記述されたスクリプト・ファイル
WSF ジョブ単位でスクリプトを管理するXMLファイル 。
VBE エンコードされたVBScript
JSE エンコードされたJScript
======================
特にWSF はXMLファイルなので、中にはVB、JavascriptでJOB単位で
混在してもOKです。
例:
<job id="IncludeExample">
   <script language="JScript" src="FSO.JS"/>
   <script language="VBScript">
      ' C ドライブの空き領域を取得します。
      s = GetFreeSpace("c:")
      WScript.Echo s
   </Script>
</job>

Windows Script勉強の1

オブジェクトこのオブジェクトで実行できるタスク
Wscript
  • コマンド ライン引数を設定および取得する
  • スクリプト ファイルの名前を取得する
  • ホスト ファイルの名前 (wscript.exe または cscript.exe) を取得する
  • ホスト バージョン情報を取得する
  • COM オブジェクトを作成、接続、および切断する
  • イベント シンクを作成する
  • プログラムによってスクリプトの実行を停止する
  • 既定の出力デバイス (ダイアログ ボックスやコマンド ラインなど) に情報を出力する
WshArgumentsすべてのコマンド ライン引数にアクセスする
WshNamed名前付きコマンド ライン引数にアクセスする
WshUnnamed名前なしコマンド ライン引数にアクセスする
WshNetwork
  • ネットワーク共有およびネットワーク プリンタを接続および切断する
  • ネットワーク共有のマッピングを設定および解除する
  • 現在ログオンしているユーザーに関する情報にアクセスする
WshControllerWshController のメソッド CreateScript() を使用してリモート スクリプト プロセスを作成する
WshRemote
  • コンピュータ ネットワーク上のコンピュータ システムをリモートで管理する
  • プログラムによってほかのプログラムやスクリプトを操作する
WshRemote Errorスクリプト エラーが発生してリモート スクリプト (WshRemote オブジェクト) が異常終了した場合のエラー情報にアクセスする
WshShell
  • プログラムをローカルで実行する
  • レジストリの内容を操作する
  • ショートカットを作成する
  • システム フォルダにアクセスする
  • 環境変数 (WINDIR、PATH、PROMPT など) を操作する
WshShortcutプログラムによってショートカットを作成する
WshSpecialfoldersWindows の専用フォルダのいずれかにアクセスする
WshURLShortcutプログラムによってインターネット リソースへのショートカットを作成する
WshEnvironment環境変数 (WINDIR、PATH、PROMPT など) のいずれかにアクセスする
WshScriptExecExec() で実行したスクリプトに関するステータス情報およびエラー情報を取得する StdIn、StdOut、StdErr にアクセスする


VBScriptで書いた場合、拡張子は.vbsで,Javascriptで書いた場合、拡張子は.jsで保存します。
実行方法は二つあります。
①直接ダブルクリックして実行できます。
実際はWscript.exeを経由で実行しています。
②CMD中で実行できます。コマンドのフォーマットは:
Cscript.exe test.vbs

例:
Dim result(4)  
result(0) = "C#"
result(1) = "CSS"
result(2) = "VB"
result(3) = "XML"
result(4) = "C++"

’Rnd()をコールする前に乱数生成器を初期化しなければならないです。
Randomize
'初期化してから使える。しないといつも同じ値になっています。
num = Int(Rnd() * 5)
’メッセージボックスを表示する。
WScript.Echo "I Like ", result(num)
をtest.vbsに保存して実行してみてください。

2010年11月9日星期二

How to do File Download ?

详细参照http://msdn.microsoft.com/ja-jp/library/cc719227.aspx

简单叙述:
従来の ASP では、Response オブジェクトの AddHeader メソッドで HTTP ヘッダを指定し、Response オブジェクトの WriteFile メソッドにダウンロードさせたいファイルを指定して出力します。
ASP.NET 2.0 では、HttpResponse クラスの AddHeader メソッドで HTTP ヘッダを指定し、HttpResponse クラスの WriteFile メソッドにダウンロードさせたいファイルを指定して出力します。

CODE:
----------------------------------------------------------
Protected Sub btnDownload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDownload.Click

Dim strFile As String

strFile = lstFile.SelectedValue // get filename from request

If strFile <> "" Then
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment; filename=" + strFile)
Response.Flush()
Response.WriteFile(strFile)
Response.End()
End If

End Sub
----------------------------------------------------------

FileUpload In UpdatePanel HasFile Return False Always

花了半天时间,才搞定。
原因:
FileUpload选择完上传目标文件后,
在点上传按钮之前,UpdatePanel会将FileUpload的内容清空掉。

解决方法:
PageLoad事件处理中(是否PostBack都要执行这句),追加
ScriptManager.GetCurrent(Me.Page).RegisterPostBackControl(btnUpload)

————————————————————————————————————————————
不过,要注意文件的大小,最好在web.config里明确指定
system.web
//最大リクエストサイズ(KB)
httpRuntime maxRequestLength="100"
system.web

クライアント側キャッシュの更新について

クライアントとプロキシのキャッシュを無効にする
<%@ OutputCache Location="None" VaryByParam="None" %>

or

Response.Cache.SetCacheability(HttpCacheability.NoCache);

期間を指定して出力キャッシュを格納する

宣言によるアプローチ :
<%@ OutputCache Duration="60" VaryByParam="None" %>


プログラムによるアプローチ :
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);

要求元のブラウザ クライアントに出力キャッシュを格納する

宣言によるアプローチ :
<%@ OutputCache Duration="60" Location="Client" VaryByParam="None" %>


プログラムによるアプローチ :
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Private);

HTTP 1.1 キャッシュに対応した任意のデバイス (プロキシ サーバーや要求送信元のクライアントなど) に出力キャッシュを格納する

宣言によるアプローチ :
<%@ OutputCache Duration="60" Location="Downstream" VaryByParam="None" %>


プログラムによるアプローチ :
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetNoServerCaching();

Web サーバーに出力キャッシュを格納する

宣言によるアプローチ :
<%@ OutputCache Duration="60" Location="Server" VaryByParam="None" %>


プログラムによるアプローチ :
TimeSpan freshness = new TimeSpan(0,0,0,60);
DateTime now = DateTime.Now;
Response.Cache.SetExpires(now.Add(freshness));
Response.Cache.SetMaxAge(freshness);
Response.Cache.SetCacheability(HttpCacheability.Server);
Response.Cache.SetValidUntilExpires(true);

受信した各 HTTP 要求の City の値に応じて出力をキャッシュする

宣言によるアプローチ :
<%@ OutputCache duration="60" varybyparam="City" %>


プログラムによるアプローチ :
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.VaryByParams["City"] = true;

HttpCachePolicy クラスは、@ OutputCache ディレクティブの VaryByCustom 属性、VaryByHeader 属性、および VaryByParam 属性に対して、VaryByHeaders プロパティ、VaryByParams プロパティ、および SetVaryByCustom メソッドを提供します。