いろんなソフトを作って社内に非公式に公開する。というときに、いろいろとユーザーを認証する方法を考えます。うちの会社ってあんまり横のつながりがないからなのか、私が自己責任!!!ってしつこく言うからか、あんまり妙なところへ広がったりはしていません。どうやったらいいかなぁって思ったときに、今どきは常時接続なので、WinXPのようにオンライン認証かな。と思います。認証ってほどでもなくて、使っている相手の情報を取り込んだ上で、そのまま許可すればいいので、起動ごとにネットに情報を送って、それを記録してOKのデータを返すことにしました。ネット上の特定のページへアクセスしてそこでCGIを動かせば簡単なので、主にローカルで使うExcelについてHTTPアクセスしてデータを送って。って調べてみると。http://www.happy2-island.com/access/gogo03/capter90100.shtmlにそのまんま載っていました。といっても複数ページにわたっているので、最初の宣言部分が省略されていたりで、うろうろしましたが、いい感じで動きます。CGIから帰ってきたデータを確認するだけで良いので、データをファイルに保存する部分はコメントアウトして、代わりにchr関数で文字列を取り出しています。保存が必要ならその部分を有効にすれば保存できます。データを送って受け取る。最終的なサンプルの宣言部分を補完したものを引用しておきます。
'変数の定義 ※(General)(Declarations)です
Private lngWinINet As Long 'インターネットハンドルの保存用
Private lngHttpHnd As Long 'HTTPハンドルの保存用
Private lngReqHnd As Long 'HTTPリクエストハンドルの保存用
Private strBuffer As String * 1024 'サーバからの応答保存用
Private lngLength As Long '応答結果のデータ長
Private bytDataArea() As Byte '取得したファイルの保存用
Private lngDataLength As Long '取得したファイルのデータ長
Private lngSavePos As Long '取得中ファイルの保存位置
Private Declare Function HttpOpenRequest _
Lib "wininet.dll" _
Alias "HttpOpenRequestA" _
(ByVal hConnect As Long _
, ByVal lpszVerb As String _
, ByVal lpszObjectName As String _
, ByVal lpszVersion As String _
, ByVal lpszReferer As String _
, ByVal lpszAcceptTypes As String _
, ByVal dwFlags As Long _
, ByVal dwContext As Long) As Long
'dwFlags(ダウンロード方法)
'キャッシュを無視し、サーバから強制的にダウンロード
Private Const INTERNET_FLAG_RELOAD As Long = &H80000000
'ダウンロードファイルをキャッシュに加えない
Private Const INTERNET_FLAG_DONT_CACHE As Long = &H4000000
'サーバから再読み込みします
Private Const INTERNET_FLAG_RESYNCHRONIZE As Long = &H800
'キャッシュできないときに一時ファイルを生成
Private Const INTERNET_FLAG_NEED_FILE As Long = &H10
'有効期限、最終更新時刻がサーバから返されない場合は強制的に再読み込み
Private Const INTERNET_FLAG_HYPERLINK As Long = &H400
'(General)(Declarations)へ記述します
Private Declare Function HttpSendRequest _
Lib "wininet.dll" _
Alias "HttpSendRequestA" _
(ByVal hRequest As Long _
, ByVal lpszHeaders As String _
, ByVal dwHeadersLength As Long _
, ByRef lpOptional As Any _
, ByVal dwOptionalLength As Long) As Boolean
'(General)(Declarations)へ記述します
Private Declare Function HttpQueryInfo _
Lib "wininet.dll" _
Alias "HttpQueryInfoA" _
(ByVal hRequest As Long _
, ByVal dwInfoLevel As Long _
, ByVal lpvBuffer As String _
, ByRef lpdwBufferLength As Long _
, ByRef lpdwIndex As Long) As Boolean
'dwInfoLevel(取得内容)
'コンテンツの種類
Private Const HTTP_QUERY_CONTENT_TYPE As Long = 1
'データ長
Private Const HTTP_QUERY_CONTENT_LENGTH As Long = 5
'サーバ日付
Private Const HTTP_QUERY_DATE As Long = 9
'更新日時
Private Const HTTP_QUERY_LAST_MODIFIED As Long = 11
'HTTPリクエストの結果コード
Private Const HTTP_QUERY_STATUS_CODE As Long = 19
'ヘッダー情報
Private Const HTTP_QUERY_RAW_HEADERS_CRLF As Long = 22
'サーバ情報
Private Const HTTP_QUERY_SERVER As Long = 37
'要求したメソッドの種類
Private Const HTTP_QUERY_REQUEST_METHOD As Long = 45
'(General)(Declarations)へ記述します
Private Declare Function InternetReadFile _
Lib "wininet.dll" _
(ByVal hRequest As Long _
, ByRef lpBuffer As Any _
, ByVal dwNumberOfBytesToRead As Long _
, ByRef lpdwNumberOfBytesRead As Long) As Boolean
'(General)(Declarations)へ記述します
Private Declare Function InternetCloseHandle _
Lib "wininet.dll" _
(ByVal hInternet As Long) As Boolean
'(General)(Declarations)へ記述します
Private Declare Function InternetConnect _
Lib "wininet.dll" _
Alias "InternetConnectA" _
(ByVal hInternet As Long _
, ByVal lpszServerName As String _
, ByVal nServerPort As Long _
, ByVal lpszUsername As String _
, ByVal lpszPassword As String _
, ByVal dwService As Long _
, ByVal dwFlags As Long _
, ByVal dwContext As Long) As Long
'nServerPort(接続ポート)
'FTP
Private Const INTERNET_DEFAULT_FTP_PORT As Long = 21
'GOPHER
Private Const INTERNET_DEFAULT_GOPHER_PORT As Long = 70
'HTTP
Private Const INTERNET_DEFAULT_HTTP_PORT As Long = 80
'HTTPS
Private Const INTERNET_DEFAULT_HTTPS_PORT As Long = 443
'SOCK
Private Const INTERNET_DEFAULT_SOCKS_PORT As Long = 1080
'dwService(サービスの種類)
'FTP
Private Const INTERNET_SERVICE_FTP As Long = 1
'GOPHER
Private Const INTERNET_SERVICE_GOPHER As Long = 2
'HTTP
Private Const INTERNET_SERVICE_HTTP As Long = 3
'dwFlags(オプション)
'PASSIVEモードで接続(FTP時)
Private Const INTERNET_FLAG_PASSIVE = &H8000000
'(General)(Declarations)へ記述します
Private Declare Function InternetOpen _
Lib "wininet.dll" _
Alias "InternetOpenA" _
(ByVal lpszAgent As String _
, ByVal dwAccessType As Long _
, ByVal lpszProxyName As String _
, ByVal lpszProxyBypass As String _
, ByVal dwFlags As Long) As Long
'dwAccessType(接続方法)
'全てのホスト名をローカルで解決します
Private Const INTERNET_OPEN_TYPE_DIRECT As Long = &H1
'既存の設定(要はIEの設定)を利用します
Private Const INTERNET_OPEN_TYPE_PRECONFIG As Long = &H0
'プロキシサーバ経由で接続します
Private Const INTERNET_OPEN_TYPE_PROXY As Long = &H3
'dwFlags(ネットワーク使用有無)
'サーバーから取得します
Private Const INTERNET_FLAG_ASYNC As Long = &H10000000
'キャッシュから取り出します(ネットワークを使用しません)
Private Const INTERNET_FLAG_FROM_CACHE As Long = &H1000000
Sub prcHTTPReadFileSample()
Dim lngRc As Long
Dim lngStatus As Long
'インターネットサービスをオープンします
lngRc = fcInternetOpen
'オープンに成功したらHTTPサーバとの接続と切断を行います
If lngRc = 0 Then
'HTTPサーバへ接続します
lngRc = fcHTTPConnect("www.yahoo.co.jp")
'接続に成功したらリクエストを初期化します
If lngRc = 0 Then
lngRc = fcHTTPOpenRequest("GET", "index.html")
End If
'リクエストの初期化に成功したら、リクエストを送信します
If lngRc = 0 Then
lngRc = fcHTTPSendRequest
End If
'HTTPステータスコードを取得します
If lngRc = 0 Then
lngRc = fcHTTPQueryInfo(HTTP_QUERY_STATUS_CODE)
'HTTPステータスコードを保存
lngStatus = CLng(strBuffer) '取得した値を数値型に変換
'HTTPステータスコードが200番台(ファイルあり)
'以外なら以下の処理を実行しないように設定
'(サーバの設定により、なぜか200を返す場合もあります)
If lngStatus < 200 Or lngStatus > 299 Then
lngRc = 9
End If
End If
'対象のファイルをダウンロードします
If lngRc = 0 Then
lngSavePos = 0 '保存位置を初期化
lngDataLength = 0 '取得データ長を初期化
lngRc = fcHTTPReadFile 'ファイルの取得処理
End If
'ダウンロードしたファイルを保存します
If lngRc = 0 Then
Sum = Chr(bytDataArea(0)) & Chr(bytDataArea(1))
' Call fcDataSave("c:\happy", "news.html")
End If
'HTTPリクエストをクローズします
Call fcHttpRequestClose
'HTTPサーバから切断します
Call fcHTTPDisConnect
End If
'インターネットサービスをクローズします
Call fcInternetClose
End Sub
Function fcHTTPReadFile() As Long
Dim tmpIndex As Long
Dim lngSize As Long
Dim i As Long
Dim tmpBuffer(1023) As Byte
'ファイルはいくつかに分割して受信するため
'Do~Loopで(InternetReadFileを)複数回繰り返します
Do
strBuffer = vbNullString
lngSize = 0
'ファイルを取得
Call InternetReadFile(lngReqHnd _
, tmpBuffer(0) _
, 1024 _
, lngSize)
'InternetReadFileが正常時のみ
'データの保存処理を実行
If Err.LastDllError = 0 Then
'取得データ長が0なら取得終了
If lngSize = 0 Then
Exit Do
End If
'データ長の加算と取得データ保存領域の拡張
lngDataLength = lngDataLength + lngSize
ReDim Preserve bytDataArea(lngDataLength)
'取得したデータの保存(一時領域から保存領域へ)
For i = 0 To lngSize - 1
bytDataArea(lngSavePos) = tmpBuffer(i)
lngSavePos = lngSavePos + 1
Next
End If
Loop
'何らかのデータを取得しているときは
'取得データ保存領域のデータ長を調整
If lngDataLength > 0 Then
ReDim Preserve bytDataArea(lngDataLength - 1)
End If
'この関数の戻り値には、APIの処理結果コードを返します
fcHTTPReadFile = Err.LastDllError
End Function
Sub fcDataSave(strPath As String, strFileName)
' 'ファイルの保存はバイナリモードで行うため
' 'ADO.Streamを使用します。
' 'ADO.Streamを使う場合は「ADO 2.5以上」を指定しましょう
'
' Dim objADOStream As New ADODB.Stream
' Dim objFS As Object
'
' Set objFS = CreateObject("Scripting.FilesystemObject")
'
' '保存形式はバイナリモード
' objADOStream.Type = adTypeBinary
' objADOStream.Open
' objADOStream.Write bytataArea
'
' 'データの保存(adSaveCreateOverWriteは上書きの意味)
' objADOStream.SaveToFile objFS.BuildPath(strPath, strFileName) _
' , adSaveCreateOverWrite
'
' objADOStream.Close
'
' Set objFS = Nothing
' Set objADOStream = Nothing
End Sub
Function fcHTTPQueryInfo(lngInfoLevel As Long) As Long
Dim tmpIndex As Long
lngLength = 1024 '初期値はstrBufferの長さ
tmpIndex = 0
strBuffer = vbNullString
'APIの実行/サーバからの応答を取得
Call HttpQueryInfo(lngReqHnd _
, lngInfoLevel _
, strBuffer _
, lngLength _
, tmpIndex)
'この関数の戻り値には、APIの処理結果コードを返します
fcHTTPQueryInfo = Err.LastDllError
End Function
Function fcHTTPOpenRequest(strMethod As String, strURL As String) As Long
Dim tmpURL As String * 255
'URLは255バイトの固定長文字列で渡す
tmpURL = strURL
'APIの実行/リクエストを初期化
lngReqHnd = HttpOpenRequest(lngHttpHnd _
, strMethod _
, tmpURL _
, "HTTP/1.1" _
, vbNullString _
, vbNullString _
, INTERNET_FLAG_RELOAD _
, 0)
'この関数の戻り値には、APIの処理結果コードを返します
fcHTTPOpenRequest = Err.LastDllError
End Function
Function fcHTTPSendRequest() As Long
'APIの実行/リクエストを送信
Call HttpSendRequest(lngReqHnd _
, vbNullString _
, 0 _
, vbNullString _
, 0)
'この関数の戻り値には、APIの処理結果コードを返します
fcHTTPSendRequest = Err.LastDllError
End Function
Function fcHttpRequestClose() As Long
'APIの実行/インターネットサービスをクローズ
Call InternetCloseHandle(lngReqHnd)
'この関数の戻り値には、APIの処理結果コードを返します
fcHttpRequestClose = Err.LastDllError
End Function
Function fcHTTPConnect(Server As String) As Long
'APIの実行/HTTPサーバへ接続
lngHttpHnd = InternetConnect(lngWinINet _
, Server _
, INTERNET_DEFAULT_HTTP_PORT _
, vbNullString _
, vbNullString _
, INTERNET_SERVICE_HTTP _
, 0 _
, 0)
'この関数の戻り値には、APIの処理結果コードを返します
fcHTTPConnect = Err.LastDllError
End Function
Function fcHTTPDisConnect() As Long
'APIの実行/HTTPサーバから切断
Call InternetCloseHandle(lngHttpHnd)
'この関数の戻り値には、APIの処理結果コードを返します
fcHTTPDisConnect = Err.LastDllError
End Function
Function fcInternetOpen() As Long
'APIの実行/インターネットサービスをオープン
lngWinINet = InternetOpen(vbNullString _
, INTERNET_OPEN_TYPE_PRECONFIG _
, vbNullString _
, vbNullString _
, 0)
'この関数の戻り値には、APIの処理結果コードを返します
fcInternetOpen = Err.LastDllError
End Function
Function fcInternetClose() As Long
'APIの実行/インターネットサービスをクローズ
Call InternetCloseHandle(lngWinINet)
'この関数の戻り値には、APIの処理結果コードを返します
fcInternetClose = Err.LastDllError
End Function
最近のコメント