2010年1月9日土曜日

wshスクリプトからpdfが開かない

windowxsp pro sp3
whh 5.7

現象
wshスクリプト経由でpdfファイルを開くと関連付けされているにも関わらずエラーで開かない
エラー
activexオブジェクトを作成できない
アプリケーションが関連付けられていません

処置
acrobat5.0 acrobat reader9.2アンイストール
再起動
acrobat readerインストールでok

やった処理 備考
acrobat5.0で開くようにしていたのでアンインストール
マイコンピュータから関連付けを確認 acrobat reader9.2に鳴っているのを確認
エクスプローラからpdfファイルをwクリックすると普通に開く
Subject: [ruby-list:42348] win32oleの「メソッドが無い」というランタイムエラー
↑似た現象
wise registry cleanerを使って不要レジストリクリア ・・・結果変わらず
別のbmpやtxtは開く
vbで同様の処理をしたら開くかと思って試したが開かず


wsh 関連付けられたファイルを指定して開く
Dim WSHShell
'dumen.vbs ファイル名で、エクスプローラからファイルをwクリックしたのと同じ動きをします。
'exeのインストールパスが端末によって特定できないので、これを作成。
'argumentsは 実行時に指定されるオプション=ファイル名。
'windows scripting host(wsh)使用。参考url http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/wshtop.htm
'ここではpdfをしていするので pdfに指定されたアプリで図面ファイルが立ち上がります。
dumen.vbs
Set WSHShell=Wscript.CreateObject("Wscript.Shell")
Set arg= WScript.Arguments
'msgbox arg.Item(0)
WSHShell.Run arg.Item(0),1,true

使用例
"パス\DUMEN.VBS" "パス\ファイル名.PDF"
起動ファイルの場所が頻繁に変わるacrobat readerをどこpcからも開くように設定するのに使える

関連付けられているファイルを起動する
外部変数を渡して起動する
googleで外部変数で検索してもなかなかヒットしなかった
test.exe test.pdfのような形でファイルを外から指定して関連付けられたpdfファイルを開きたかったんだが
外からの変数の与え方は 
5.知られざる関数たち
を参考にしました

ShellExecuteを使った例 vb
pdfopen.exe
------------------------------------------------------------------------------------------
Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _
String, ByVal lpszFile As String, ByVal lpszParams As String, _
ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Const SW_SHOWNORMAL = 1

Const SE_ERR_FNF = 2&
Const SE_ERR_PNF = 3&
Const SE_ERR_ACCESSDENIED = 5&
Const SE_ERR_OOM = 8&
Const SE_ERR_DLLNOTFOUND = 32&
Const SE_ERR_SHARE = 26&
Const SE_ERR_ASSOCINCOMPLETE = 27&
Const SE_ERR_DDETIMEOUT = 28&
Const SE_ERR_DDEFAIL = 29&
Const SE_ERR_DDEBUSY = 30&
Const SE_ERR_NOASSOC = 31&
Const ERROR_BAD_FORMAT = 11&

Sub Main()
Dim docname As String
Dim len1 As Integer
Dim ret As Integer
   docname = Command()
len1 = Len(docname)
’渡す変数が"月で渡されるので前後を除去する
docname = Mid(docname, 2, len1 - 2)
' MsgBox docname
    ret = ShellExecute(0, "open", docname, vbNullString, vbNullString, SW_SHOWNORMAL)
End Sub
------------------------------------------------------------------------------------------

vbaで動作確認
Private Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _
String, ByVal lpszFile As String, ByVal lpszParams As String, _
ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Const SW_SHOWNORMAL = 1

Const SE_ERR_FNF = 2&
Const SE_ERR_PNF = 3&
Const SE_ERR_ACCESSDENIED = 5&
Const SE_ERR_OOM = 8&
Const SE_ERR_DLLNOTFOUND = 32&
Const SE_ERR_SHARE = 26&
Const SE_ERR_ASSOCINCOMPLETE = 27&
Const SE_ERR_DDETIMEOUT = 28&
Const SE_ERR_DDEFAIL = 29&
Const SE_ERR_DDEBUSY = 30&
Const SE_ERR_NOASSOC = 31&
Const ERROR_BAD_FORMAT = 11&
Sub test()
ret = ShellExecute(0, "open", "ファイルパス/ファイル名", vbNullString, vbNullString, SW_SHOWNORMAL)
End Sub

2010年1月6日水曜日

sqlserver 移行時に ログインユーザーの再マッピングについて

sqlserver2000
参考リンク
け出しSEの備忘録

How to fix orphaned SQL Server users

引用
EXEC sp_change_users_login 'Report'
で、ログインにマッピングされていないユーザーを洗い出し
(今回は自分で追加したtestuserがいました)

EXEC sp_change_users_login 'Update_One',
'tesruser','test_login'

または
EXEC sp_change_users_login 'auto_fix',
'tesruser'