ちゃっぴ さん 2005年 09月 20日 23時 08分 34秒

[訂正]

> IInternetSecurityManager::GetSecuritySite Method あたりが

IInternetSecurityManager::GetZoneMappings Method 

です。

ちゃっぴ さん 2005年 09月 20日 23時 07分 06秒

To ばんのしゃーによかばんた さん 2005年 09月 19日 15時 29分 11秒

順序が逆転してしまいましたが・・・

> 「インターネットのプロパティ」の「セキュリティ」の
> 「レベルのカストマイズ」の「セキュリティの設定」の一覧のところを
> 印刷やテキストファイルに取り出す方法はないものでしょうか。
>レジストリのエクスポートファイルを生でってぇのは、なしで。

あらら、先に言われちゃった(^^;)

> レジストリを読んでいちいち変換するしかないものでしょうか。

IInternetSecurityManager::GetSecuritySite Method あたりが
使えそうですが、Script用の Interface が無いようなので、
ゴリゴリしか方法がないんじゃないかなと思っています。

ちゃっぴ さん 2005年 09月 20日 23時 00分 18秒

To ばんのしゃーによかばんた さん 2005年 09月 20日 16時 15分 11秒

> https://login.passport.com
> を追加しただけでは駄目でした。

ということは、「信頼済み」のSecurity設定を変更していない限り、
IEの設定ではないですね。

とりあえず、Webbrowser Control の許可が必要なようです。
私は、Internet Zone では無効にしていますので・・
# ほんとは、Active Script も無効にしたいんですが、
# そうなるともう一つぐらいZoneがないと・・・

> .NET Passportが、Nortonに嫌われているようです。
これの Firewall 親切そうにみえて実はものすごく不親切だと思っています。
ある程度知識があると、定義されているRuleがBlackBox化しているのに
我慢がならなくなるんじゃないかな?

なんで数年前に使用を停止しました。
# 他にも、Anti-Virusのほうですが、Logoff しても Registry が
# Unload されないとか、管理者にとってはつらいことばかり・・・
# まあ、一番の理由はなんでこんなに重いの?ってことですが・・・

ちゃっぴ さん 2005年 09月 20日 22時 44分 33秒

To ねね さん 2005年 09月 16日 17時 24分 28秒

Event Log を読み違えていたようですね。

> コンピュータ:   (処理を実行した端末のホストID)
> 説明:
> サーバー:
> {8BC3F05E-D86B-11D0-A075-00C04FB68820} をアクティブに
> しようとしたときに コンピュータ (ドメイン名) でエラー
> "エラー: 一般のアクセスが拒否されました " が発生しました。

ということは、Error が発生したのは DC で
記録されたのは、Local ということですね。
ということなら、そのまま認証に失敗しているってことに
なるんじゃないかと・・・

ん〜。ほかの方法(Explorer等)では認証は成立するんですよね。
> コンピュータ (ドメイン名) でエラー
というのが気になるのですが、まさか Single-Label Domain という
わけではないですよね?

> 例えば、WMIのプロパティの設定で
> 認証レベルは「接続」でよいでしょうか。

「規定」でも「接続」でもつながりますが・・・

管理人むたぐち さん 2005年 09月 20日 18時 59分 12秒

> ?を文字列として表現する方法はどうすればいいのでしょうか。

\? とすればOKです。

管理人むたぐち さん 2005年 09月 20日 18時 57分 52秒

To: うに さん

JavaのIndexOfに相当する関数はVBSではInStr関数です。
次のようにすると「映画」を取り出せます。

strSource = "私は昨日映画を見ました。"
str1 = "昨日"
str2 = "を"
Msgbox Mid(strSource,InStr(strSource,str1) + Len(str1), _
InStr(strSource,str2) - InStr(strSource,str1) - Len(str1))


また、こんなことをする必要はないですが、RegExpのFirstIndexを
InStrの代わりに使うにはこのようにします。

strSource = "私は昨日映画を見ました。"
Set RegEx = New RegExp
RegEx.Global = False
RegEx.Pattern = "昨日"
If RegEx.Test(strSource) Then
     Set Matches = RegEx.Execute(strSource)
     MsgBox Matches(0).FirstIndex
End If

コード中、RegEx.Global = Falseとある行がポイントで、これを記述しておくと
最初の1回しか正規表現の判定をしません。よって、Matchesオブジェクトの
中身は1つのMatchオブジェクトだけとなり、Matches(0)でその中身が取り出せます。


さて、どうせ正規表現を使うのならもっと正規表現らしく
使ったほうが良いでしょう。

strSource = "私は昨日映画を見ました。"
Set RegEx = New RegExp
RegEx.Global = False
RegEx.Pattern = "昨日(.+)を"
If RegEx.Test(strSource) Then
     Set Matches = RegEx.Execute(strSource)
     MsgBox Matches(0).SubMatches(0)
End If

これはPattern文字列に「『昨日』と『映画』の間に任意の文字列が
挟まった文字列」を指定し、挟まった文字列をSubmatch文字列として
指定したものです。
最初のMatchの最初のSubMatch、つまりをMatches(0).SubMatches(0)を
取り出すと、目的の文字列になります。

うに さん (null) 2005年 09月 20日 18時 56分 31秒
URL:null

たびたび失礼します。
ループの一回目でexit forさせて何とか使えそうになりました。
しかし新たな問題が・・・
実は取り出したい文字列が”=”と”?”で囲まれているんです。
?で検索したところ、「Microsoft VBScript 実行時エラー: 文字の
繰り返しを表す正規表現演算子が不正です。」
とでてしまいました。?は使えないのですね・・・
?を文字列として表現する方法はどうすればいいのでしょうか。

うに さん (null) 2005年 09月 20日 18時 17分 18秒
URL:null

お世話になっています。

検索文字列の中で
特定の文字列に囲まれた部分を取り出したいのですが・・・
midで取り出そうと思い、javaで言うところの”indexof”の用なモノがないかとヘルプで調べてみると、”Firstindex”というものがありました。
ところがMatchオブジェクト?とかを使わなくてはいけないらしく、
更にMatchesでループしなければいけない?のでしょうか?
サンプルを眺めているのですが、このMatchというのがよくわからなくて困っています。
サンプルはどれもループさせて、文字列全体を検索するものばかりでした。
FIRSTという言葉の意味するとおりはじめにでてくるものだけで良いのですが・・・

例えば
「私は昨日映画を見ました。」
だとすると”昨日”と”を”の位置を調べて、
”映画”を取り出したいのです。取り出すのはMidで簡単にできますよね・・・
簡単に実現できないでしょうか?

ばんのしゃーによかばんた さん 2005年 09月 20日 16時 15分 11秒

>ちゃっぴ さん 2005年 09月 18日 17時 44分 52秒
>具体的にはどこのSiteになりますか?

https://login.passport.com
を追加しただけでは駄目でした。

NortonInternetSecurityの接続記録を見ると、
https://login.passport.net
https://www.passportimages.com
にもアクセスしているようです。
これらも信頼済みサイトに追加すれば、うまく行くのかも知れません。

同じく、NISのログを見ると、以下のようなレポートが沢山出てました。

詳細: 無効な接続上の TCP 非 SYN/非 ACK パケット。パケットを破棄しました
送信元 IP アドレス: login.passport.com(65.54.183.198)
TCP 送信元ポート: https(443)
TCP 送信先ポート: 3487
TCP メッセージフラグ: 0x00000014

.NET Passportが、Nortonに嫌われているようです。
これが干渉しているのかも知れません。

私も、こういう信頼を強要するサイトは出来るだけ避けているのですが、
たまに、必要があって、使おうとすると、決まってトラブルのです。


つちや さん 2005年 09月 20日 15時 50分 43秒

Dear AKA さん
新DynamicWrapper、ナイスです。個人的にPeekの追加実装がうれしいです。
そして、39-46 いちにい さんのスクリプトにちょっと手を加えただけでクリップボード操作ができるではないですか。
それと、DynamicWrapperを登録しておけば、自作のDLL(COM DLLでないもの)を使えるというのがうれしいです。(いちいち管理者権限で登録するのも面倒ですし)

ばんのしゃーによかばんた さん 2005年 09月 19日 15時 29分 11秒

「インターネットのプロパティ」の「セキュリティ」の
「レベルのカストマイズ」の「セキュリティの設定」の一覧のところを
印刷やテキストファイルに取り出す方法はないものでしょうか。
レジストリのエクスポートファイルを生でってぇのは、なしで。
レジストリを読んでいちいち変換するしかないものでしょうか。


ばんのしゃーによかばんた さん 2005年 09月 19日 15時 28分 43秒

>わん さん 2005年 09月 14日 01時 57分 10秒
>@スクリプト実行中に、ある特定の期間だけ、キーボード&マウスからの入力を無視することはできるのでしょうか?
>Aその際、ある特定のキー操作のみ入力可能なようにすることはできるのでしょうか?(Ctrl+Alt+Delete... など)

こういう要件話が多いですね。
基本的な方向性が違っているような気がしないでもないですが。。。
従来、よく言われる全画面を利用した代替策では、Alt+TabやAlt+F4が弱点でした。
そういう用途向きの、これらの弱点を克服したHTAです。
10秒経過後は、Alt+F4で停止可能です。
途中で止めるのは非常に難しいです。Alt+TabやAlt+F4も利きません。
だって、それが要件なんだもの。
Ctrl+Alt+Delでmshta.exeを繰り返し終了させると、
運がよければ窮地から脱出できるかも知れません。

<html>
<head>
<script>
moveTo(0,0);
resizeTo(screen.width,screen.height);
setTimeout("window.onblur=null",10000);
function window.onblur(){
 new ActiveXObject("WScript.Shell").Run('"'+unescape(location.pathname)+'"');
}
</script>
<hta:application
applicationname="single instance"
singleinstance="yes"
border="none"
innerborder="no"
contextmenu="no"
showintaskbar="no"
scroll="no"
/>
</head>
<body bgColor="teal">
</body>
</html>


ねね さん 2005年 09月 18日 21時 37分 04秒

>ちゃっぴさん

お返事ありがとうございます。
(*確かにSELECT文をコピーするのが不完全だったそうです。)

DCOMの構成はチェックしています。
WMIのプロパティの設定等、何ら問題が無いように思えます。
(同じ設定をしたほかの端末では(同一ドメインの)リモートコンピュータへの処理が実行できます。)
ドメインの異なるリモートコンピュータへ処理を実行する場合は、WMIのプロパティの設定はどのような設定にするべきなのか、ご存知ないでしょうか。

例えば、WMIのプロパティの設定で
認証レベルは「接続」でよいでしょうか。

ちゃっぴ さん 2005年 09月 18日 17時 44分 52秒

> そうしようとしたのですが、「信頼済みサイト」に入れた接続先以外に、
> 中から.NET Passportのサイトにアクセスするようで、うまく行きません。
> .NET Passport関連のサイトを特定して「信頼済みサイト」に追加すれば
> よいのでしょうが、いろいろあるみたいで。どうしてます?

特定して入れていますが・・・というより.Net Passportに依存した
Siteをそれほど利用しないというのが本音かも・・・

具体的にはどこのSiteになりますか?

一つの例として、Hotmailの場合、
http://*.msn.co.jp
https://*.Passport.com
を信頼済みに登録してやれば、使用可能ですが・・・
# あくまでも私の環境の場合というお話で・・・

ばんのしゃーによかばんた さん 2005年 09月 18日 16時 52分 15秒

>ちゃっぴ さん 2005年 02月 13日 19時 07分 19秒
>ばんのしゃーによかばんた さん 2005年 02月 13日 16時 37分 57秒
>> インターネットゾーンのセキュリティレベルを一時的に下げて、
>> 戻すのを忘れると、とっても危険です。
>ただ、ZoneのSecurity設定を下げるよりも、必要なものは
>「信頼済みサイト」とか「イントラネット」に加えてやるほうを
>お勧めしますがね。

そうしようとしたのですが、「信頼済みサイト」に入れた接続先以外に、
中から.NET Passportのサイトにアクセスするようで、うまく行きません。
.NET Passport関連のサイトを特定して「信頼済みサイト」に追加すれば
よいのでしょうが、いろいろあるみたいで。どうしてます?

結局、試行錯誤(サイト追加/Passport無効/password再設定)に疲れて、
インターネットゾーンのセキュリティレベルを一時的に下げてしまいました。

※「信頼済みサイト」はTrusted Siteの誤訳ではないでしょうか。
日本語としては「信頼するサイト」のほうがよいように思います。


ばんのしゃーによかばんた さん 2005年 09月 18日 16時 51分 49秒

Windows Scriptとは直接は関係ないのですが、

>ばんのしゃーによかばんた さん 2005年 07月 22日 20時 22分 56秒
>ファイルをドロップしたときの作業フォルダ や
>困ったことに「不定」です。きっと「仕様」なのでしょう。
>この「仕様」は是非とも、改善して欲しいものです。
>ドラッグ元のファイル群のフォルダは複数有り得るので駄目ですが、

Vistaでは、ファイルを直にEXEファイルにドロップすると、
カレントディレクトリがドロップしたファイルのフォルダになる、
そうです。ショートカットでも同じかなぁ。

そうするってぇと、
検索結果から異なるフォルダのファイルを複数ドロップすると、
どのフォルダになるのでしょう?

XPで試しに、複数をドロップしたときの、引数の順序を調べてみると、
ドラッグを開始したときに、マウスの当たっているファイルが先頭で、
以下、表示順に下方向へ行って、ラップラウンドするみたいです。
選択したときの順序は関係なし。

で、上の答えはきっと、先頭の引数で渡ってきたファイルのフォルダ
なのでしょう。

そこで、アプリやスクリプトもそれを先取りして、
先頭の引数で渡ってきたファイルのフォルダをカレントディレクトリに
設定すれば、全バージョンで共通の振る舞いになってハッピーかも。


管理人むたぐち さん 2005年 09月 17日 12時 07分 59秒

To: AKA さん

ありがとうございます。
ついに構造体アクセスができるようになりましたか!

ファイルの置き場所に関してですが、良かったらWikiのアップローダーを
お使いいただけないでしょうか?
現在は誰でもファイルを消去できる問題もクリアしましたし、
Wikiに上げておいていただければ、リンクページからも
リンクを張らせていただきますので。
以上、よろしくご検討ください。

AKA さん 2005年 09月 17日 05時 16分 07秒

AKAです。
DynamicWrapperの不具合を改善し、新たなメソッドを追加しました。

この改良によって、従来困難だった構造体へのアクセスが問題なくできるようになり、Win32APIのかなりの機能が使えるようになると思います。

以下の場所に置きましたので、お試し下さい。
http://gamdev.org/up/img/3302.lzh

原作者等に許可はとっていませんが、私としては転載してもらってもかまわないです。しかし著作権者に怒られたら即座に取り下げてください。

感想をお待ちしています。

ちゃっぴ さん 2005年 09月 17日 04時 12分 29秒

訂正、APPID {8BC3F05E-D86B-11D0-A075-00C04FB68820} は存在しますね。
Windows XP Professinal SP2

Source自体は、SELECTがちょん切れている点を除き
問題ありませんよ。

やはり、DCOM の Security が一番くさいような・・・
Event Log の情報が正しいとすると、接続自体は正常にできているようなので・・・

ちゃっぴ さん 2005年 09月 17日 03時 32分 26秒

この手の処理はいろいろやってますが、
そういうErrorは出ていないものでして・・・

WMI で Remote Computer への接続を行うときには、
多分ご存知だとは思いますが、RPCを使って相手のServerの
DCOM に接続します。

考えられる要因としては、DCOMの構成を変更していませんか?
「コンポーネント サービス」で確認できます。
あとは、User権利の割り当てを変更しているとか・・・

ところで、私の環境では、{8BC3F05E-D86B-11D0-A075-00C04FB68820}
というGUID は存在しないのですが・・・
とおもったら、Server 2003にはありますね。

「Windows Management and Instrumentation」なので、
その構成を正常に実行できるものと見比べてみるとよいかと

ねね さん 2005年 09月 16日 17時 24分 28秒

お世話になります、よろしくお願いします。

下記のコードでリモートコンピュータの機器情報を取得しようとしているのですが、エラーコード80070005で「アクセスが拒否されました」とエラーになります。

'ネットワークに接続し、処理対象端末にタスクが存在するか確認します。
Set objWMILocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objWMILocator.ConnectServer((ホスト名称),"\root\CIMV2" ,(ドメイン名)\(ユーザ名), strPassWord )
objWMILocator.Security_.ImpersonationLevel = 3
Set colItems = objWMIService.ExecQuery( _
      CT * FROM Win32_Process Where Name='" & strTask & "'")

イベントログには、このようなエラーが記録されています。
イベントの種類:     エラー
イベント ソース:     DCOM
イベント カテゴリ:     なし
イベント ID:     10006
日付:          2005/09/**
時刻:          11:46:26
ユーザー:          (ドメイン名)\(ユーザ名)
コンピュータ:     (処理を実行した端末のホストID)
説明:
サーバー:
{8BC3F05E-D86B-11D0-A075-00C04FB68820} をアクティブにしようとしたときに コンピュータ (ドメイン名) でエラー "エラー: 一般のアクセスが拒否されました " が発生しました。


リモートコンピュータはホストIDで名前解決を行うことができます。
(Pingは通ります。)
指定したユーザはAdministrator権限を持っています。
パスワードは空白ではありません。
ホストIDにIPアドレスを指定しても、エラーは変わりません。

http://www.eventid.net/display.asp?eventid=10006&eventno=272&source=DCOM&phase=1
↑このページは参考にしたのですが、どうも該当するものが無いようです。
どなたか何か対策をご存知でしたら教えてください。

管理人むたぐち さん 2005年 09月 14日 23時 25分 46秒

To: わん さん

Right関数は、文字列の右から指定分の文字数の文字を切り出す関数です。
9月の場合、左に0をつけると "09"となり、右から2文字取り出すとそのまま"09"ですね。
10月の場合、"010"となるので、右から2文字取り出すと"10"となって、
どんな月でも正しく2文字の月数を返すことができます。

Right関数の詳細については、上のリンクからヘルプファイルをダウンロードしてご覧ください。

わん さん 2005年 09月 14日 23時 08分 26秒

管理人むたぐちさんへ。
実は、以下のようにして、無理やり逃げました。。。(汗
ありがとうございました。
質問の@、Aは出来ないですね。残念です。

ちなみに、『Right』の意味を教えて頂けませんか?

     Dim yy, mm, dd
     yy = Year(Date) - 2000
     mm = Month(Date)
     dd = Day(Date)
    
     yy = 0 & yy

     if dd > 9 then
          dd = dd
     else
          dd = 0 & dd
     end if

     if mm > 9 then
          mm = mm
     else
          mm = 0 & mm
     end if

     msgbox yy & mm & dd

管理人むたぐち さん 2005年 09月 14日 17時 40分 24秒

To: わん さん

1.と2.に関しては分かりませんが(おそらく無理ですしスクリプトのやる
仕事ではないでしょう)、3.に関しては以下のような定石があります。

dDate=Date
msgbox Right(Year(dDate),2) & Right("0"& Month(dDate),2) & Right("0" & Day(dDate),2)

わん さん 2005年 09月 14日 01時 57分 12秒

@スクリプト実行中に、ある特定の期間だけ、キーボード&マウスからの入力を無視することはできるのでしょうか?

Aその際、ある特定のキー操作のみ入力可能なようにすることはできるのでしょうか?(Ctrl+Alt+Delete... など)

B日付を取得する際、年を05、月を09、日付を12(→2桁、09、08、07など)
という風に、2桁づつ取得することはできるのでしょうか?

教えてくんで申し訳ないのですが、ご教授宜しくお願いします。

わん さん 2005年 09月 14日 01時 57分 10秒

@スクリプト実行中に、ある特定の期間だけ、キーボード&マウスからの入力を無視することはできるのでしょうか?

Aその際、ある特定のキー操作のみ入力可能なようにすることはできるのでしょうか?(Ctrl+Alt+Delete... など)

B日付を取得する際、年を05、月を09、日付を12(→2桁、09、08、07など)
という風に、2桁づつ取得することはできるのでしょうか?

教えてくんで申し訳ないのですが、ご教授宜しくお願いします。

わん さん 2005年 09月 12日 00時 22分 16秒

>メーリングリスト
ありがとうございました。

管理人むたぐち さん 2005年 09月 11日 22時 04分 58秒

To: わん さん

USERS GROUP : WSH メーリングリスト
http://www.users.gr.jp/ml/wsh.aspx

# もう一つWSHのメーリングリストがあったんですが、
# 先日、閉鎖されました。

わん さん 2005年 09月 11日 21時 38分 55秒

WSHのメーリングリストなどはないのでしょうか?

ばんのしゃーによかばんた さん 2005年 09月 11日 14時 13分 40秒

WScript.Timeoutは、スクリプトからセットしても効かないものと、
思っていましたが、試してみると効きますね。

無限ループやウェイトの危険のあるスクリプトでは、
積極的に使ったほうがいいですね。
自分で時間監視するより、遥かに簡単だし。

思い出した。
むたぐちさんのページに書いてあったんだ。
TimeOut
 [WSH2.0以上] 実行中のスクリプトのタイムアウト(実行停止するまでの時間)を秒数で返します。ここで返されるのは、WSHファイル、//Tオプション、wscript.exeの設定で指定した秒数です。実際にはタイムアウトの指定がされていない場合でも、デフォルトの秒数(10)を返します。読みとり専用プロパティではありませんが、値を変更しても意味がありません。

知らぬ間に変わってたようですね。

class x
sub class_terminate()
msgbox timer-start
msgbox err
end sub
end class
set xx=new x
WScript.Timeout=5
wscript.sleep 4000
WScript.Timeout=5
start=timer
msgbox 2

これをCScript.EXEで実行すると、いろいろ分かります。
CScript.EXEのときだけ、メッセージが出る。
スクリプト "timeout.vbs" の実行時間が制限時間を超えました。
スクリプトの実行は中止されました。
class_teriminateはその後で動く。
WScript.Timeoutを再設定すると、そのときからカウントする。
終了コードは0。(Echo %ErrorLevel%)
Errは設定されない。

応用としては、wShell.Popup()の代替とか。


ばんのしゃーによかばんた さん 2005年 09月 11日 14時 12分 59秒

>ケタモラ さん 2005年 09月 08日 21時 49分 55秒
>私もPerlを使ってまだ一ヶ月も経っていないのですが、お客さんの要望でUNIX MAGAZINE8月号を参考にドラッグ&ドロップから起動するプログラムを作成しています。

普通、お客さんは、フリーウェア/シェアウェアを入れるのを嫌うものですが、
そういうお客さんも居るんですね。よっぽど、Perlが好きなんでしょうか。
でも、好きなだけで、OS標準装備のVBScriptやJScriptを使わずに、
業務システムにわざわざ、3rdPartyソフトをインストールしてまで使うというのも
不思議だなぁ。linuxの影響などで、それだけ垣根が低くなったのでしょうか。

そう言えば、最近、

>ばんのしゃーによかばんた さん 2005年 01月 28日 19時 59分 05秒
>スクリプトからZIPファイルを自由自在に操作するサンプルアプリケーションです。

これを業務システムに使いたいという問合せが幾つか来てます。
意外に大手システム会社からも。そうそう、いりやさんの会社からも。
みなさん、OS標準装備のZIPインターフェースがなくて、お困りなんですね。
まさか、PKZIPの商用ライセンスが高くて買えないなんてことはないでしょうから、
大手ほどMS純正志向が強いのでしょうか。


ばんのしゃーによかばんた さん 2005年 09月 10日 22時 02分 16秒

>ケタモラ さん 2005年 09月 08日 09時 15分 07秒
>>>管理人むたぐち さん
>代用の意味がわかりました。プログラムの中で保存の処理をしてしまえばいいということでうすね。ありがとうございました。

なんか、誤解されているような気がするのですが、違います?

IE.execWBのSaveAsなどは、特別で、メソッドの中で保存処理をしますが、
コモンダイアログなどでは、メソッドはファイルパス名を返すだけで、
もともと、プログラムの中で保存の処理をする必要がありますよね?
何を保存するのか、メソッドは分かりませんからね。

代用という意味は、「ファイルを開く」も「名前を付けて保存」も
単にファイルパス名を返すだけなので、タイトルの違いさえ無視すれば、
同じように使えるという意味ですよん。

>>>ばんのしゃーによかばんたさん
>>こっちはどうでしょう。ちょっと癖があるようですが。

と、こっちは、申し上げた通りなんですけど。。。

普通、まず、サンプルをそのまま確認する。
それがうまく行った場合に、変更して使う。
変更後、もし、うまく行かない場合は、1パラメタずつ変更しては、確認し、
問題の境界を特定する。というのが、常道です。
こういう但し書きがある場合は、特にそうです。

魔界の仮面弁士 さんと、管理人むたぐち さんが、うまく動いて、
ケタモラ さんが、動かないのは、その辺の違いだと思います。

>>Set fs=CreateObject("SAFRCFileDlg.FileSave")
>>fs.FileName="c:\vbs\*.txt"
>>fs.FileType="テキストファイル(*.txt)"
>>rc=fs.OpenFileSaveDlg()

は、動くと思いますが、

Set fs=CreateObject("SAFRCFileDlg.FileSave")
rc=fs.OpenFileSaveDlg()

は、何故か、動きません。
あまり「障害」を言うと、MVPに再認定して貰えないかも、
と思って、触れずにいたのですが(なんちゃって)。
触れたからには、性分で、言わざるを得ません。これは「障害」です。



なっちゃん さん 2005年 09月 09日 13時 47分 26秒

>Nomuさん

お返事ありがとうございます。
ちょっと思わぬ事故がありお返事することができませんでした。
今、教えていただいたURLなどを参考に思考錯誤しています。
「案外簡単に?出来る」という言葉を頼りに取り組んでます。また結果をご報告させていただきます。

ありがとうございました・

ケタモラ さん 2005年 09月 08日 21時 49分 55秒

≫魔界の仮面弁士 さん

私はActivePerl5.8.7を使っています。

私もPerlを使ってまだ一ヶ月も経っていないのですが、お客さんの要望でUNIX MAGAZINE8月号を参考にドラッグ&ドロップから起動するプログラムを作成しています。
そこでレジストリを編集し、拡張子.wperlを使えるようにしたのですが、拡張子.plで「保存」ダイアログを開けるということはこのあたりの設定が関係してそうですね…。
もう少し調べてみます。ありがとうございました。

管理人むたぐち さん 2005年 09月 08日 19時 29分 56秒

To: 魔界の仮面弁士 さん

> -------- wsfによる実行 --------

> --- *.plファイルに書いて、直接実行 ---
どちらも正常に実行できました。
(実行環境:ActivePerl 5.8)

魔界の仮面弁士 さん 2005年 09月 08日 10時 38分 31秒

》ケタモラ さん 2005年 09月 08日 09時 15分 07秒
> 「名前をつけて保存」ダイアログは開くことができませんでした。

あれ? とりあえず JPerl とかいうのを落としてきて、
サンプルを元に、見よう見まねで書いてみたのですが、
問題なく表示できているようなのですが……。

ただ、私自身は、今までPerlを全然使った事が無かったので、
外しているかも知れません。勘違いだったら無視してくださいませ。m(_ _)m

# "use Win32::OLE qw(in with);" とかの意味も分かってないし<私
## というか、JPerlってのが、perlとは別物の事だったらどうしよう……(滝汗


-------- wsfによる実行 --------
<?xml version="1.0" encoding="UTF-8"?>
<package><job id="Sample"><?job error="true" debug="true"?>
<script language="PerlScript"><![CDATA[
$WshShell = Win32::OLE->new("WScript.Shell");

$dialog1 = Win32::OLE->new("SAFRCFileDlg.FileOpen");
$dialog1->OpenFileOpenDlg();
$OpenName = $dialog1->{FileName};
$WshShell->Popup($OpenName);

$dialog2 = Win32::OLE->new("SAFRCFileDlg.FileSave");
$dialog2->LetProperty("FileName", "c:\\*.txt");
$dialog2->LetProperty("FileType", "テキストファイル(*.txt)");
$dialog2->OpenFileSaveDlg();
$CloseName = $dialog2->{FileName};
$WshShell->Popup($CloseName);
;
#]]></script>
</job></package>
----------------


--- *.plファイルに書いて、直接実行 ---
use strict;
use Win32::OLE qw(in with);
my $dialog = Win32::OLE->new("SAFRCFileDlg.FileSave");
$dialog->LetProperty("FileName", "c:\\*.txt");
$dialog->LetProperty("FileType", "テキストファイル(*.txt)");
$dialog->OpenFileSaveDlg();
print($dialog->{FileName});
---------------


--- VB6 に Microsoft Script Control を貼り付けて実行 ---
ScriptControl1.Language = "PerlScript"
ScriptControl1.ExecuteStatement _
  "use Win32::OLE qw(in with);" & vbCrLf & _
  "my $dialog = Win32::OLE->new(""SAFRCFileDlg.FileSave"");" & vbCrLf & _
  "$dialog->{FileName} = ""C:\\Original.txt"";" & vbCrLf & _
  "$dialog->OpenFileSaveDlg();"
If ScriptControl1.Error.Number <> 0 Then
  MsgBox ScriptControl1.Error.Description
End If
---------------

ケタモラ さん 2005年 09月 08日 09時 15分 07秒

>>管理人むたぐち さん

代用の意味がわかりました。プログラムの中で保存の処理をしてしまえばいいということでうすね。ありがとうございました。

>>ばんのしゃーによかばんたさん

>こっちはどうでしょう。ちょっと癖があるようですが。

>Set fs=CreateObject("SAFRCFileDlg.FileSave")
>fs.FileName="c:\vbs\*.txt"
>fs.FileType="テキストファイル(*.txt)"
>rc=fs.OpenFileSaveDlg()
>WScript.Echo VarType(rc)   '19
>WScript.Echo rc        '1 OK / 0 Cancel
>WScript.Echo fs.FileName

Perlで記述した場合、

$dialog = Win32::OLE->new("SAFRCFileDlg.FileOpen");
$dialog->OpenFileOpenDlg();

として「ファイルを開く」ダイアログは開くことができるのですが、同様に

$dialog = Win32::OLE->new("SAFRCFileDlg.FileSave");
$dialog->OpenFileSaveDlg();

としても「名前をつけて保存」ダイアログは開くことができませんでした。
safrcdlg.dll のファイルを調べて見ましたが、File Open & Save Controllとなっているのに「保存」ダイアログが開けません…。
Perlだと何か制限があるのでしょうか…。

魔界の仮面弁士 さん 2005年 09月 07日 20時 34分 43秒

》ばんのしゃーによかばんた さん 2005年 09月 07日 19時 27分 21秒
> オブジェクトブラウザで、DExplore.exeを参照設定しようとしたのですが、
DExplore.exeは、ActiveXコンポーネントではありませんしね。
参照設定するなら、vshelp.tlb の方です。

旧バージョンの方(vshelp.dll)については、以前VB/Mag.誌で、
かおくさんが解説されていましたね。
http://www.galliver.co.jp/writing/susume_vb/tre910/index.html

魔界の仮面弁士 さん 2005年 09月 07日 20時 08分 41秒

》ばんのしゃーによかばんた さん 2005年 09月 07日 19時 26分 14秒
>> Send To Clipboard は、シェル拡張(Shell Extension)を利用しています。
> VB6やVB.NETのサンプルソースはないでしょうか。
いいのかな。ここって確か、
『★Windows Scriptとは直接は関係ない雑談等は、WSHchでどうぞ。』
だったような。(^^;

それは兎も角、その手の参考書としては、こちらがお奨めです。
洋書ですが、Webページからは VB6 のサンプルも入手できますよ。

ISBN:1-56592-670-6
http://www.oreilly.com/catalog/vbshell/

# 書籍を読まずにサンプルだけ見ても、あまり分からないかも
# 知れませんが、理解の為の足掛かりにはなるでしょう。


> なにやら真言密教の呪文のようで、ソースが全然想像できません。
先に挙げたインターフェイスを、Classモジュールに「実装」したあと、
DLL を HKEY_CLASSES_ROOT\ほげ\shellex\DropHandler 等に登録しましょう。

VB6のソースでいうなら、クラスの先頭に「Implements IDropTarget」を宣言して、
Sub IDropTarget_Drop(〜) メソッド等を実装する事になります。
# このあたりは、イベント処理をイメージしてもらえれば良いかも。

うに さん (null) 2005年 09月 07日 20時 00分 34秒
URL:null

>143-04 魔界の仮面弁士 さん 2005/09/07 11:29

御丁寧にありがとうございました。
例外処理をなにも考えていませんでしたが、そちらも参考になりそうです。

またよろしくお願いします。

ばんのしゃーによかばんた さん 2005年 09月 07日 19時 27分 21秒

ドキュメントエクスプローラのCOMコンポーネントについて

レジストリでProgIDを見掛けたので、試しに、
Set DE=CreateObject("DExplore.AppObj")
MsgBox TypeName(DE) 'Help
MsgBox DE.Filter
としてみると、
DExplore.exe -Embedding
が立ち上がっているのが観測できました。
TypeNameは、Helpでした。
FilterというStringのプロパティを持っているようです。空でした。

しかし、これが、何者かが、分かりません。
オブジェクトブラウザで、DExplore.exeを参照設定しようとしたのですが、
断られました。


ばんのしゃーによかばんた さん 2005年 09月 07日 19時 27分 02秒

>魔界の仮面弁士 さん 2005年 09月 06日 09時 55分 39秒
>》ばんのしゃーによかばんた さん 2005年 09月 05日 16時 51分 48秒
>> "Shell.Application"でブリーフケースのFolderItemを取得して、
>> InvokeVerbで「すべて更新」をキックすると、ダイアログが出ます。
>UI操作を伴ったりするので、タスク実行は難しいでしょうね。

□ ログオンしている場合にのみ実行する
や、
at /interactive
では、どうなんでしょう? 

ログオフ中に、同期を取る必然性はない訳で、
これで動くなら、現実的なアプローチかも知れません。

ダイアログを開くだけなら、

SynchBriefCase.VBS
――――――――――――――――――――――――――――――――――――――
Path="C:\up\1\SynchBriefCase\新規ブリーフケース"
Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(Path)
Set FolderItem=Folder.Self
FolderItem.InvokeVerb("すべて更新(&U)")
――――――――――――――――――――――――――――――――――――――

単純なケースは自動応答。難しいときはダイアログを開きっ放し。

SynchBriefCase.WSF
――――――――――――――――――――――――――――――――――――――
<package>
<job>
<script language=VBScript>
Option Explicit
Dim wShell
Dim oExec
Dim Number
Dim Description

Set wShell=CreateObject("WScript.Shell")
wShell.Run""""&WScript.ScriptFullName&""" //Job:Run "
Do
 If wShell.AppActivate("更新 - ") Then
  wShell.SendKeys("{Enter}")
  Exit Do
 ElseIf wShell.AppActivate("ブリーフケースの更新") Then
  wShell.SendKeys("{Enter}")
  Exit Do
 End If
 WScript.Sleep 100
Loop
</script>
</job>
<job id=Run>
<script language=VBScript>
Option Explicit
Dim Path
Path="C:\up\1\SynchBriefCase\新規ブリーフケース"
CreateObject("Shell.Application").NameSpace(Path).Self.InvokeVerb("すべて更新(&U)")
</script>
</job>
</package>
――――――――――――――――――――――――――――――――――――――
Synchと言えば、病院の検査で肺シンチとかいうのをやったことがあります。
放射性同位元素を使うので、同位のことかと思ったら、これはisotopeですね。
なら、シンチはなんでしょう? シンクロトロンで作るから?
病院用語や医者言葉には、分からない言葉が多いですね。
眼科で、硝子体剥離を検査をしてもらったら、トラクションが掛かってないから
大丈夫でしょう、だって。トラクションなんて言葉が分かる患者が、何%いると
思っているのでしょうか。私はたまたま、Star Trekで、トラクタービームを
聞き慣れていたので分かりましたが。。。


ばんのしゃーによかばんた さん 2005年 09月 07日 19時 26分 37秒

telnet、ftpと言えば、telnet:、ftp:というプロトコルがありますね。
これを真似ると、任意のプロトコルが作れますね。

file:プロトコルでは、htm以外は、Argumentsが渡せません。
そこで、filerun:プロトコルを作ってみました。

filerun:コマンド?引数1+引数2+引数3...

[HKEY_CLASSES_ROOT\filerun]
"URL Protocol"=""
@="URL:filerun Protocol"
[HKEY_CLASSES_ROOT\filerun\shell\open\command]
@="C:\\Windows\\System32\\WScript.EXE \"C:\\hoge hoge\\FileRunProtocol.VBS\" \"%1\""

FileRunProtocol.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim Args:Args=Array()
Dim wShell
Dim CommandLine
Dim Protocol
Dim Position
Dim k

Set wShell=CreateObject("WScript.Shell")
CommandLine=WScript.Arguments.Item(0)
Protocol=Left(CommandLine,8)
If LCase(Protocol)<>"filerun:" Then
 WScript.Echo "Invalid Protocol:",Protocol
 WScript.Quit
End If
CommandLine=Mid(CommandLine,9)
Position=InStr(CommandLine,"?")
If Position=0 Then Position=Len(CommandLine)+1
ReDim Preserve Args(UBound(Args)+1)
Args(UBound(Args))=Left(CommandLine,Position-1)
CommandLine=Mid(CommandLine,Position+1)
Do While Len(CommandLine)
 Position=InStr(CommandLine,"+")
 If Position=0 Then Position=Len(CommandLine)+1
 ReDim Preserve Args(UBound(Args)+1)
 Args(UBound(Args))=Left(CommandLine,Position-1)
 CommandLine=Mid(CommandLine,Position+1)
Loop
For k=0 To UBound(Args)
 Args(k)=UnEscape(Args(k))
 If InStr(Args(k)," ") And Left(Args(k),1)<>"""" Then Args(k)=""""&Args(k)&""""
Next
CommandLine=Join(Args)
If MsgBox(CommandLine,vbOkCancel+vbExclamation+vbDefaultButton2,WScript.ScriptName)=vbOk Then
 wShell.Run CommandLine
End If
――――――――――――――――――――――――――――――――――――――
セキィリティが脆弱になりそうなので、確認ダイアログを出すようにしてます。
ところで、インターネットゾーンのhtmlから、
<a href=telnet:
は無効なのに、
<a href=filerun:
は有効です。
この辺の制御はどうやってるのでしょう?
telnetプロトコルのレジストリを見ても、変わったところがありません。


ばんのしゃーによかばんた さん 2005年 09月 07日 19時 26分 14秒

>ばんのしゃーによかばんた さん 2005年 05月 11日 18時 14分 47秒
>あと、ファイルの比較は、Windiff.exeに2ファイルをドロップ、が便利ですね。
>しかし、フォルダが異なると、2ファイルをドラッグできないのがなんとも不便。
>1フォルダに2ファイルのリンクを作ってドラッグドロップしてみましたが、
>リンクファイルを比較しやんの。まったく。:-<

アプリのショートカットを作成し、リンク先を、「アプリ」から
WScript.EXE フルパス\RunWithLinkArg.VBS 「アプリ」
に変えます。

異なるフォルダの各ファイルのショートカットをひとつのフォルダに作り、
まとめてアプリのショートカットにドロップします。

RunWithLinkArg.VBSは引数にショートカットが指定されたら、
リンク先に置き換えて、アプリを起動します。

RunWithLinkArg.VBS command {args|files|links}...
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim fso
Dim wShell
Dim args:args=Array()
Dim arg
Dim Link
Dim k

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")

For Each arg In WScript.Arguments
 If fso.FileExists(arg) Then
  If LCase(fso.GetExtensionName(arg))="lnk" Then
   Set Link=wShell.CreateShortCut(arg)
   arg=Link.TargetPath
  End If
 End If
 ReDim Preserve args(UBound(args)+1)
 args(UBound(args))=arg
Next

For k=0 To UBound(args)
 If Left(args(k),1)="""" Then
 ElseIf InStr(args(k)," ") Then
  args(k)="""" & args(k) & """"
 End If
Next

args=Join(args)

'MsgBox "'" & args & "'"

wShell.Run args
――――――――――――――――――――――――――――――――――――――
ドロップハンドラが、shiftキーを押しながらアプリにドロップしたら、
引数のショートカットをリンク先に置き換えてアプリを起動する、
くらいのことをしてくれればよいのに。。。

>魔界の仮面弁士 さん 2004年 11月 09日 11時 02分 18秒
>Send To Clipboard は、シェル拡張(Shell Extension)を利用しています。
>COMの実装が必要なので、スクリプト系では実装できませんが、
>VB6やVB.NETなどがあれば、独自実装も可能です。

VB6やVB.NETのサンプルソースはないでしょうか。

>大雑把に言えば、IDropTargetインターフェイス、および、
>IPersistFileインターフェイスを実装したDLLをレジストリに
>登録しておくことで、各インターフェイスのメソッドが
>呼び出されようになるので、そこに処理を書いておく事になります。
>ドロップされてきたファイルの一覧は、IDropTarget::Dropの
>引数として渡されますが、これは文字列ではなく、
>IDataObjectインターフェイスによって渡されますので、
>コマンドラインの文字列長制限を受けることもありません。

なにやら真言密教の呪文のようで、ソースが全然想像できません。


ばんのしゃーによかばんた さん 2005年 09月 07日 19時 25分 48秒

>ケタモラ さん 2005年 09月 05日 23時 55分 57秒
>Perlからダイアログボックスを開きたいのですが、
>$dialog = Win32::OLE->new("UserAccounts.CommonDialog");
>$dialog->ShowSave();
>として」「名前をつけて保存」ダイアログを開くことができません。

こっちはどうでしょう。ちょっと癖があるようですが。

Set fs=CreateObject("SAFRCFileDlg.FileSave")
fs.FileName="c:\vbs\*.txt"
fs.FileType="テキストファイル(*.txt)"
rc=fs.OpenFileSaveDlg()
WScript.Echo VarType(rc)     '19
WScript.Echo rc               '1 OK / 0 Cancel
WScript.Echo fs.FileName


ばんのしゃーによかばんた さん 2005年 09月 07日 19時 25分 29秒

>ばんのしゃーによかばんた さん 2005年 09月 03日 17時 18分 21秒
>ms-its:C:\WINDOWS\Help\ntcmds.chm::/ntcmds.htm
>エラーになってちゃんと表示されません。※
>hh.exe ms-its:C:\WINDOWS\Help\ntcmds.chm::/ntcmds.htm
>とすれば、よいようです。

これは、
C:\WINDOWS\PCHealth\HelpCtr\Binaries\helpctr.exe /URL ms-its:ntcmds.chm::/ntcmds.htm
とすれば、「ヘルプとサポートセンタ」でちゃんと表示されます。

同様に、
「ヘルプとサポートセンタ」からリンクをデスクトップなどに
ドラッグ&ドロップして、インターネットショートカット(.url)を作っても、
そのままでは、ちゃんと表示されません。

そこで、これを以下のurl2lnk.VBSにドロップすると、
同じ名前のショートカット(.lnk)が同じ場所に作成されます。
このショートカット(.lnk)を起動すると、「ヘルプとサポートセンタ」で、
ちゃんと表示されます。

――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim fso
Dim wShell
Dim Path
Dim Link
Dim URL

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")

Path=WScript.Arguments.Item(0)
If LCase(fso.GetExtensionName(Path))<>"url" Then
 WScript.Echo "File extension name is not url."
 WScript.Quit
End If
Set Link=wShell.CreateShortCut(Path)
URL=Link.TargetPath

Path=fso.GetParentFolderName(Path)&"\"&fso.GetBaseName(Path)&".LNK"
Set Link=wShell.CreateShortCut(Path)
Link.TargetPath="C:\WINDOWS\PCHealth\HelpCtr\Binaries\helpctr.exe"
Link.Arguments="/URL "&URL
Link.Save
――――――――――――――――――――――――――――――――――――――
しかし、こんなことしないと、ちゃんと見れないなんて、疑問。
ms-its:プロトコルで、helpctr.exeを立ち上げるようには出来ないのかな?
でも、そうすると、helpctr.exe自身の引数に、ms-its:プロトコルが現れて、
リカージョンを起こしますね。きっと。



魔界の仮面弁士 さん 2005年 09月 07日 11時 29分 08秒

》魔界の仮面弁士 さん 2005年 09月 07日 09時 50分 14秒

訂正版。m(_ _)m

Function ToCIMString(dt)
 If VarType(dt) <> vbDate Then
  On Error Resume Next
  dt = CDate(dt)
  If Err.Number <> 0 Then
   ToCIMString = Empty
   Exit Function
  End If
  On Error GoTo 0
 End If
 Dim iDt, iTm, sDt
 iDt = (10000 + Year(dt)) * 10000 + Month(dt) * 100 + Day(dt)
 iTm = (100 + Hour(dt)) * 10000 + Minute(dt) * 100 + Second(dt)
 sDt = Right(CStr(iDt), 8) & Right(CStr(iTm), 6)
 ToCIMString = sDt & ".000000+540"
End Function

管理人むたぐち さん 2005年 09月 07日 10時 07分 10秒

To: wsh使ってますかスレ967 さん

> アップロードするとWikiのタイトルが「アップローダー へはアップロード・削除はできません」となりzipファイルのアップができませんでした。

間違えてアップローダのページを凍結してしまっていました。
凍結を解除しましたので、アップロードできるようになったと思います。
ご迷惑をおかけしました。


To: ケタモラ さん

> ShowOpen()で代用というのは具体的にはどのように記述すればよいのでしょうか?

use Win32::OLE;

$dialog = Win32::OLE->new("UserAccounts.CommonDialog");
$dialog->{'Filter'} = "Text Files|*.txt";
$dialog->{'InitialDir'} = "C:\\";
$dialog->{'FileName'} = "test.txt";

$r = $dialog->ShowOpen();

if( $r = 0) {
}else{
  print ($dialog->{'FileName'});
}

このような感じでShowOpenするまえにFileNameプロパティを設定しておくことは
できるので、多少は「ファイルを保存ダイアログ」に近い使い方ができるわけです。

魔界の仮面弁士 さん 2005年 09月 07日 09時 50分 14秒

》うに さん (null) 2005年 09月 07日 09時 23分 55秒
> やった!とばかりにサーバー(2000server)で試すと・・・
http://msdn.microsoft.com/library/en-us/wmisdk/wmi/swbemdatetime.asp
の最後の[Requirements]を見ると……残念。2000は対象外です。

となると、地道に文字列操作となりますかね。

----------------------
MsgBox ToCIMString( Now() )

Function ToCIMString(dt)
 If VarType(dt) <> vbDate Then
  On Error Resume Next
  dt = CDate(dt)
  If Err.Number <> 0 Then
   ToCIMString = Empty
   Exit Function
  End If
  On Error GoTo 0
 Else
  Dim iDt, iTm, sDt
  iDt = (10000 + Year(dt)) * 10000 + Month(dt) * 100 + Day(dt)
  iTm = (100 + Hour(dt)) * 10000 + Minute(dt) * 100 + Second(dt)
  sDt = Right(CStr(iDt), 8) & Right(CStr(iTm), 6)
  ToCIMString = sDt & ".000000+540"
 End If
End Function

うに さん (null) 2005年 09月 07日 09時 23分 55秒
URL:null

>魔界の仮面弁士 さん 2005年 09月 06日 15時 30分 30秒
>》うに さん (null) 2005年 09月 06日 14時 51分 58秒
>> nowかdateで時間をとって、それ以降のログを

>ログの出力をどのように書いているのか、にもよりますが、
>さしあたり、SWbemDateTime.SetVarDateメソッドで対処できませんか?

早速ググって見ました。
WMIの日時データはCIMDATETIMEという特殊な型で苦労されている方が結構いるみたいですね
'*****************
'*CIM_DateTime取得
'*****************
Function ivTime(iTime)
     Dim swDateTime
     Set swDateTime = CreateObject("WbemScripting.SWbemDateTime")
     Call swDateTime.SetVarDate(iTime, True)
     ivTime = swDateTime.Value
     Set swDateTime = Nothing
end Function

早速例に倣ってこのようにやってみたところクライアントで成功(xphome)
やった!とばかりにサーバー(2000server)で試すと・・・
「Microsoft VBScript 実行時エラー: ActiveX
コンポーネントはオブジェクトを作成できません。: 'WbemScripting.SWbemDateTime'」

だそうです・・・


>> 仮面弁士様の

>微妙……。(^-^;
>http://yaplog.jp/orator/archive/20

申し訳ありません。
今後気をつけます。

Return