ぶっつ さん 2006年 05月 17日 16時 27分 54秒

はじめまして、ぶっつです。

WSHを使って、ユーザーの登録、フォルダのアクセス権設定を行いたいのですが、どうしたらよいか教えてもらえませんか?
よろしくお願いします。

手軽にお小遣い稼ぎ!! さん 2006年 05月 15日 01時 30分 16秒

★『ハッピーメール』★

電話もできる出会い系!!

お友達紹介で、なんと1000円!!高額アフィリエイト♪

紹介すればするほど、稼げます!1ヶ月10万以上も!!

あなたも登録して稼ぎませんか?→http://www.happymail.co.jp/?af1858810

※このサイトに登録するのは、紹介用URLを取得するためだけであって、
 出会い系のシステムを使うわけではないので、当然『無料』でできます。

※迷惑電話や迷惑メール、架空請求といったことは『絶対』に無い優良サイトです。

※認証時に『携帯電話認証』がありますが、機械が『確認しました』というだけで登録できます。

AKA さん 2006年 05月 13日 06時 18分 09秒

タイプライブラリをダンプするコマンドラインツールです。

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=TLBD001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

タイプライブラリを生の形でそのままダンプするのですべての情報が表示されます。したがって出力が大きくなりがちですが・・・
例えばMSHTMLは、タイプライブラリが巨大なのでOLEVIEWとかでもしばらくフリーズ状態になるわけですが、本プログラムでテキストにリダイレクトしたデータも、メモ帳やワードパッド等一度にすべてのテキストを読みこむタイプのエディタでは、しばらくフリーズになります(^^;)
インデントが深いので、データを見るのにはインデントでジャンプできるエディタが必須かも・・・

同様のものをご存じの方、お教え下さい。

管理人むたぐち さん 2006年 05月 11日 18時 31分 16秒

MSN MessengerをWSHから制御するコード。
v7.5で動作を確認しました。
http://blog.joycode.com/mvm/archive/2006/03/01/72137.aspx

STATUS_OFFLINE = 1
STATUS_ONLINE = 2

Set obj = CreateObject("Messenger.UIAutomation")
Select Case obj.MyStatus
     Case STATUS_OFFLINE :MsgBox "オフラインです"
     Case STATUS_ONLINE :MsgBox "オンラインです"
End Select

こんな感じでオンライン状態の取得ができます。

(管理人により削除) さん 2006年 05月 10日 20時 20分 14秒

(管理人により削除)

管理人むたぐち さん 2006年 05月 07日 20時 12分 05秒

http://winscript.s41.xrea.com/upload/up.html

アップローダを設置しました。
動作確認よろしくお願いします。私がちょっと使った感じでは問題ないようですが…。
今度は削除もご自分でできますので…。

AKA さん 2006年 05月 07日 16時 40分 53秒

非バリアントの配列を操作できるオブジェクトです。

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=AUT001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

非バリアントの配列を扱うには、バリアントの配列に変換する機能を提供すれば十分とも思えますが、

1. 全部コピーするのは時間もサイズもムダではないか?
2. 例えばバイト配列の場合バリアントに変換するとサイズが16倍になる。

との観点から、非バリアントの配列をオブジェクトにラップするという方法をとってみました。


>>メッシ さん 2006年 04月 05日 13時 45分 18秒
>>タカ さん 2006年 04月 08日 06時 03分 44秒

同じ人?

こんな感じで取得できないですかね? まさかIE5.0xを使ってるとか。

'Const TargetURL = "http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/"
Const SaveFolder = "C:\TMP\"

Set Shell = CreateObject("Shell.Application")
For Each ie In Shell.Windows()
     Set doc = ie.Document
     If TypeName(doc) = "HTMLDocument" Then
          If InStr(doc.URL, "mutaguchi") > 0 Then
               SaveDoc doc, doc.title
          End If
     End If
Next
WScript.Quit

Sub SaveDoc(doc, title)
     SaveTextToFile doc.body.parentElement.outerHTML, SaveFolder & title & ".htm"
     Dim frames
     Set frames = doc.frames
     Dim i
     For i = 0 To frames.length - 1
          Dim docx
          Set docx = frames(i).document
          Save docx, title & "_" & i
     Next
End Sub

Sub SaveTextToFile(text, path)
     Dim fs
     Set fs = CreateObject("Scripting.FileSystemObject")
     Dim stream
     Set stream = fs.CreateTextFile(path)
     stream.Write text
     stream.Close
End Sub


>>管理人さん
またまた後で気付いたのですが、WikiのアップローダでZIPファイルの最後が欠けるのはこれは多分0だからですね。最後に0があった場合に文字列エンド扱いにされて消されるのではないでしょうか。何かテキストデータ扱いにされている感じが。先頭に'\n'が入る、というのも何か文字列と文字列がくっつくことを避けるためではないかと。


[おまけ?]
list153に、パラメータに値を返すオブジェクトがあって、これがJScriptで使えない、という話題がありましたが、JScriptでやる理由は何でしょうか?

もし、VBScriptに慣れていないから、というだけであれば、とりあえず呼び出しに最低限の部分だけをVBScriptで作り、WSFで使うというのはどうでしょうか。

<job>
<script language=VBScript>
Function vbprxyFunc(obj, p1, p2, p3)
     Dim p0
     p0 = obj.Func(p1, p2, p3)
     Dim a(3)
     a(0) = p0
     a(1) = p1
     a(2) = p2
     a(3) = p3
     vbprxyFunc = a
End Function
</script>
<script language=JScript>
...
res = new VBArray(vbprxyFunc(obj, 1, 2, 3));
for (i = 0; i <= 3; i ++)
{
     WScript.Echo(res.getItem(i));
}
...
</script>
</job>

(管理人により削除) さん 2006年 05月 07日 16時 12分 08秒

(管理人により削除)

管理人むたぐち さん 2006年 05月 01日 21時 47分 25秒

To: AKA さん

zipファイルがアップロードできない件、了解しました。
XREAとPukiWikiの組み合わせで起こってしまう現象のようで、
私もいろいろ調べて試したんですが駄目だったのです。
もうアップローダーとして使うのは諦め、別途用意したほうが
いいかもしれないですね。
少しお待ちください。

管理人むたぐち さん 2006年 05月 01日 21時 42分 18秒

Monad、MSHと呼ばれていたWindowsの時期スクリプト環境の名前が
Windows PowerShell(PS)となり、RC1がリリースされました。

Download details: Windows PowerShell RC1 (for .NET Framework 2.0 RTM) x86
http://go.microsoft.com/fwlink/?linkid=64772&clcid=0x409
Download details: Windows PowerShell RC1 (for .NET Framework 2.0 RTM) x64
http://go.microsoft.com/fwlink/?linkid=64773&clcid=0x409
Download details: Windows PowerShell RC1 Documentation Pack
http://go.microsoft.com/fwlink/?linkid=64774&clcid=0x409

@ITにも記事が出てますね。

次世代WindowsシェルMSH(コード名:Monad)を試す(前編) − @IT
http://www.atmarkit.co.jp/fdotnet/special/monad01/monad01_01.html

サイトも更新しなきゃですね、ちょっといろいろあって手付かずですが、
RCのうちに私なりの紹介記事を書いてみようと思います。

AKA さん 2006年 04月 29日 07時 19分 27秒

>>いしかわ さん 2006年 04月 28日 17時 20分 03秒

過去ログにあります。

質問:
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list106.shtml
>SUNY さん (uno@qq.emis.or.jp) 2004年 06月 01日 13時 30分 32秒

回答:
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list107.shtml
>管理人むたぐち さん 2004年 06月 03日 19時 33分 47秒

初心者が気になる疑問は結構この掲示板の過去ログにありますよ。この掲示板の下の方に全部の過去ログがリンクしてあるので、ダウンローダとかで一気に落としておくと便利です。

AKA さん 2006年 04月 29日 06時 06分 53秒

SCCRUNの9x用修正パッチ バージョンアップ

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=FIXSCR2.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

Win98付属版でコレクションのCountが0になるバグの修正パッチを追加しました。


タイプライブラリから定数を読み込むオブジェクトTLBReferrer バージョンアップ

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=TLBR002.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

ファイル名を指定して読み込むメソッドを追加しました。


>>管理人さん
Wikiのアップローダなのですが、LZHの場合、先頭に0Ahが付くだけなのですが、ZIPの場合0Ahが付くだけでなく、最後の1バイトが欠けます。

LZHの解凍ツールの多くは先頭の0Ahを許容するようですが、ZIPのツールではこれを許容せず、ZIPファイルと認識しないようです。

そして、ZIPの場合、先頭の0Ahをバイナリエディタ等で取り除いても最後の1バイトがありません。

そのため、PKUNZIP他ではファイル一覧を表示することさえできなかったりします。(ZIPの構造上、最後の1バイトは0であることが多いので、0を足せばたいてい大丈夫ですが、絶対ではありません)

したがってZIPファイルのアップロードは事実上できません。

というか、LZHも警告が出たりするのでやはり直して欲しいのですが・・・

私自身でも何かできることはあるでしょうか?

いしかわ さん 2006年 04月 28日 17時 20分 03秒

はじめまして。VBS初心者のものですが、
VBSでうまくワイルドカードがヒットしません…。
どなたか教えて頂ければ幸いです。
宜しくお願いします。

Dim Fs,WSHShell,source,target,msg
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")

If Fs.FileExists("C:\test1\test*.txt")=True Then
     MsgBox "ファイルはあります"
Else
     MsgBox "ファイルが存在しません。"
End If




ちゃっぴ さん 2006年 04月 27日 01時 50分 04秒

> ちゃっぴ さん 2006年 03月 18日 02時 18分 55秒

で書いた内容に重大な誤りがあったので訂正いたします。

WMI での接続の問題に関して・・・

> でもこれだけでは不十分で、MSRPC を利用するには双方で
> 名前解決できていないとなりません。

これは誤りです。WMI の接続において、名前解決は必須ではありません。
# 同じ RPC を利用する MSDTC の場合は必須ですが…

ということで訂正させてください。

ちゃっぴ さん 2006年 04月 27日 01時 44分 19秒

最近、偽装に関する質問が多いようなので…

とりあえず偽装が必要な場合、私は お手軽な方法として、task scheduler を推奨していますが、注意が必要な点があるので書いておきます。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=30076&forum=8

上記でも書いたんですが、SCHTASKS を利用する場合には、ちょいと厄介です。
ようは、接続先と接続元で account, password が完全に一致しているものでlogon して実行する分には全く問題がないんですが、たぶん知らない人がほとんどでしょうからあえて書き込ませていただきます。


ちゃっぴ さん 2006年 04月 26日 01時 59分 28秒

> 管理者ユーザのパスワードを入力させるプロンプトを利用されて
> injection 系の攻撃を食らう可能性があるという事ですよね。

いえいえ、ちがいます。例えば、user を追加するのをお手軽にやろうとして、内部で NET USER Command を実行したとします。

んで、username, password とかを当然 parameter で渡しますよね。

NET USER %1 %2 /ADD

batch だとこんな感じかな。

ここで、%1 に "hoge /add & del * & NET USER hoge" なんてのが与えれれらどうなるでしょう。こういうのが injection 系の攻撃です。

この手の脆弱性が発生するのは、parameter と command が明示的に
区別されていないで一緒に渡される場合ですね。

Msgbox strMsg

上記の場合、strMsg は文字列としてしか解釈されないので、
injection などできません。

> COM の偽装というのがよく分からないので、ちょっと調べてみます。

自分で COM を作成して、server application として登録すれば、偽装 user を指定できます。ただし、WSH ではできませんので、ほかの言語を習得することが必要です。

どちらにしても、WSH ではまともにできないので、別の方法を模索されたほうがいいかと・・・

しの さん 2006年 04月 26日 00時 23分 31秒

To ちゃっぴ さん。

回答ありがとうございます。

>ということですと、parameter を与える必要があるでしょうから、
>それこそ細心の注意を払わないと injection 系の攻撃を食らうことになります。
管理者ユーザのパスワードを入力させるプロンプトを利用されてinjection 系の攻撃を食らう可能性があるという事ですよね。

COM の偽装というのがよく分からないので、ちょっと調べてみます。
まだまだ勉強不足ですね・・・

ちゃっぴ さん 2006年 04月 23日 21時 23分 56秒

To ヘムヘム さん 2006年 04月 23日 14時 41分 48秒

> リモート接続したPCのレジストリを変更したい。

WMI の StdRegProv Class をつかうことになりますね。

StdRegProv class [WMI]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/stdregprov.asp

その前の remote computer の WMI 名前空間への接続は

SWbemLocator.ConnectServer (9 Parameters) method [WMI]
http://msdn.microsoft.com/library/en-us/wmisdk/wmi/swbemlocator_connectserver.asp?frame=true

ちゃっぴ さん 2006年 04月 23日 21時 19分 48秒

To しの さん 2006年 04月 23日 10時 52分 33秒

> 管理者権限がない普通の一般ユーザでログインしている状態で、
> 管理者権限があるユーザでしか実行できないようなコマンドを
> 含んだスクリプト(ユーザ追加など)を実行する方法はありますでしょうか?

単に偽装したいというなら、RUNAS.EXE。ただし、その User が
管理者権限のある account の password を知っていることが前提です。

管理者権限を全く与えないで、実行できるようにするというなら
偽装して動かすような Application を作ることになります。

偽装を行わせる機能としては、task scheduler とか、
COM の偽装とかあります。しかし、

> ユーザ追加など

ということですと、parameter を与える必要があるでしょうから、
それこそ細心の注意を払わないと injection 系の攻撃を食らうことになります。

ここで、書いてあることがすぐにわからないようでは、
やめておいたほうがいいとおもいますねぇ。

ヘムヘム さん 2006年 04月 23日 14時 41分 48秒

リモート接続したPCのレジストリを変更したい。

自端末のレジストリは
Set WSHShell=Wscript.CreateObject("Wscript.Shell")
WSHShell.RegWrite "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\FLG" , 1,"REG_SZ"
で値を0→1に変更できます。

test_1という端末名が付いている端末に接続し、
上記レジストリの値を変更したいとき、どういう記述にすればいいのでしょうか?

しの さん 2006年 04月 23日 10時 52分 33秒

こんにちは。

管理者権限がない普通の一般ユーザでログインしている状態で、管理者権限があるユーザでしか
実行できないようなコマンドを含んだスクリプト(ユーザ追加など)を実行する方法はありますでしょうか?

宜しくお願いします。

AKA さん 2006年 04月 22日 06時 18分 19秒

regsvr32で登録していないコンポーネントからオブジェクトを生成できるオブジェクトです。

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=UCO002.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

WSCを登録なしに使用できるSCROBJのマネをしてGetObject()とモニカをサポートしてみました。

管理人むたぐち さん 2006年 04月 21日 19時 21分 21秒

To: ロビー さん

重大な理由がない限り、基本的にログは消さないことにしています、
というのも、投稿された内容は、他の方の参考になるリソース(資源)と
なるからです。ここの掲示板もそうですが、多くの掲示板は助け合いの
精神で成り立っています。そのことをよくご理解いただきたいと思います。

ロビー さん 2006年 04月 20日 23時 38分 20秒

ありがとうございます。
すいません。それとこのソースを消すことはできませんか?

管理人むたぐち さん 2006年 04月 20日 16時 22分 51秒

To: ロビー さん

最終行、end if ではなくnextを使います。
For...Nextと覚えてください。

ロビー さん 2006年 04月 20日 00時 40分 20秒

こんにちは。

下記のプログラムを作ってみたのですが、if文のところでうまく起動しません。
アドバイスお願い致します。

if文のところで
もともと「ディレクトリ1\ディレクトリ2」というフォルダ構成があるものに対して
「ディレクトリ1\ディレクトリ2\ディレクトリ3」というフォルダ構成を作ろうとしています。
その際に、ディレクトリ3を作る処理を何度も繰り返し行いたいので
既に「ディレクトリ1\ディレクトリ2\ディレクトリ3」という構成になっている場合には、「ディレクトリ3」を作成する処理をスキップし、「ディレクトリ1\ディレクトリ2」の場合には「ディレクトリ3」を作る処理を行いたいのですが、うまく処理が動きません。
どうしたらよいのでしょうか?

--------------------------------------------------
'コピー元フォルダは下のフォルダ(フルパス)
FOLDERFROM = "C:\Documents and Settings\tatara\デスクトップ\新しいフォルダ"
'コピー先のパス(フルパス)
FOLDERTO = "C:\Documents and Settings\tatara\デスクトップ\新しいフォルダ (2)"

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(FOLDERFROM)

for i=1 to 8
    
     Folder = FOLDERTO & "\" & "CC0" & i
    
     'フォルダの存在有無
     bolExist = objFS.FolderExists(Folder)
     if (bolExist = "False") then
          objFS.CreateFolder(Folder)
          Folder111 = FOLDERFROM & "\" & "Cam0" & i
          Set objaaa = objFS.GetFolder(Folder111)
     end if

     '西暦フォルダを作成
     MkFolder = Folder & "\" & Year(Now)    
    
     'フォルダの存在有無
     bolExist2 = objFS.FolderExists(MkFolder)
     if bolExist2 = "False" then
          objFS.CreateFolder(MkFolder)
     end if
end if

管理人むたぐち さん 2006年 04月 19日 16時 25分 29秒

本屋さんに行ったら、新しいVBScriptの本が出てたので買ってきました。
基礎から応用まで網羅している模様。
これから読んでみます。

Amazon.co.jp:最速攻略 VBScriptサンプル大全集最速攻略: 本
http://www.amazon.co.jp/exec/obidos/ASIN/4774127108/250-6892813-3081016

domingo さん 2006年 04月 16日 22時 18分 12秒

WshShell.Execちょっと解って来ました。
今度の週末にいろいろ試してみたいと思います。

ありがとうございます。

管理人むたぐち さん 2006年 04月 16日 19時 26分 05秒

Set WshShell=CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("cmd.exe")
oExec.StdIn.WriteLine "dir C:\"
oExec.StdIn.WriteLine "exit"
MsgBox oExec.StdOut.ReadAll

こういう使い方で正しいのだろうか。むむむ。

管理人むたぐち さん 2006年 04月 16日 19時 20分 51秒

To: domingo さん

Set Ie = WScript.CreateObject("InternetExplorer.Application")
Ie.Navigate "about:blank"
Do While Ie.Busy
     Wscript.Sleep 10
Loop
'クリップボードの文字列を取得。
sClipBoard = Ie.Document.parentWindow.clipboardData.getData("text") 
Ie.Quit

Set WshShell=CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("cmd.exe")

oExec.StdIn.WriteLine sClipBoard
'MsgBox oExec.StdOut.ReadAll

こんな感じでいけると思ったんですが、結果がウィンドウに表示されないですね。
oExec.StdOut.ReadAllを読むと、クリップボードの中身を標準入力に
書き込んで、それがコマンドなら実行されてることが分かるのですが…。

# 標準入出力の取り扱いを何か大きく勘違いしてるっぽい?

AKA さん 2006年 04月 15日 06時 01分 47秒

DW7.05
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=DW95705.ZIP&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

今回はそれほどの機能追加はありません。

WIN32API.VBS for DW7.05
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=WAPI003.ZIP&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

サンプルのNotepad.vbsではメモ帳と同じようなものを作ってみました。
最も基本的なGUIアプリの技術が一通り使われているので、Win32APIがどんなものか知りたい、とか、GUIアプリの内部構造に興味がある方は見てみるとよいかと思います。

さて、

「タスクスケジューラ API」

これは非オートメーションのCOMオブジェクトです。

これをDW + WIN32API.VBSで使い、スケジュールドタスクを操作してみました。「スクリプトでCOM」シリーズです。

以下のスクリプトはWIN32API.VBSに含まれています。そしてタスクスケジューラのインクルードファイルMSTASK.VBSもそこに入っています。


' スクリプトでCOM

' タスクスケジューラAPI

' 「次の日の現在と同じ時間にNotepad起動」を登録

Option Explicit

Dim g_dw
Set g_dw = CreateObject("DynamicWrapper")
ExecuteGlobal g_dw.fc("C:\UTL\WIN32API.VBS") '自分のフォルダに直してください
ExecuteGlobal g_dw.fc("MSTASK.VBS")

Main
WScript.Quit


Sub Main()
     Dim hr
     Dim pTaskScheduler
     Set pTaskScheduler = g_dw.LPVOID

     'g_dw.CoInitialize C_NULL

     hr = g_dw.CoCreateInstance(CLSID_CTaskScheduler.AddressOf, C_NULL, CLSCTX_INPROC_SERVER, IID_ITaskScheduler.AddressOf, pTaskScheduler.AddressOf)
     If hr < S_OK Then
          WScript.Echo "CoCreateInstance() Error"
          WScript.Quit
     End If

     Dim TaskSchedulerMethods
     Set TaskSchedulerMethods = RegisterITaskSchedulerMethods(pTaskScheduler)

     Dim pwszTaskName
     pwszTaskName = "Test Task"
     Dim pTask
     Set pTask = g_dw.LPVOID
     hr = TaskSchedulerMethods.NewWorkItem(pTaskScheduler, pwszTaskName, CLSID_CTask.AddressOf, IID_ITask.AddressOf, pTask.AddressOf)
     TaskSchedulerMethods.Release pTaskScheduler
     If hr < S_OK Then
          WScript.Echo "ITaskScheduler::NewWorkItem() Error : " & Hex(hr)
          WScript.Quit
     End If

     Dim TaskMethods
     Set TaskMethods = RegisterITaskMethods(pTask)

     Dim ApplicationName
     ApplicationName = "D:\WINNT\SYSTEM32\NOTEPAD.EXE"
     hr = TaskMethods.SetApplicationName(pTask, ApplicationName)
     If hr < S_OK Then
          TaskMethods.Release pTask
          WScript.Echo "ITask::SetApplicationName() Error : " & Hex(hr)
          WScript.Quit
     End If

     Dim wNewTrigger
     Set wNewTrigger = g_dw.WORD
     Dim pTaskTrigger
     Set pTaskTrigger = g_dw.LPVOID
     hr = TaskMethods.CreateTrigger(pTask, wNewTrigger.AddressOf, pTaskTrigger.AddressOf)
     If hr < S_OK Then
          TaskMethods.Release pTask
          WScript.Echo "ITask::CreateTrigger() Error : " & Hex(hr)
          WScript.Quit
     End If

     Dim TaskTriggerMethods
     Set TaskTriggerMethods = RegisterITaskTriggerMethods(pTaskTrigger)

     Dim tt
     Set tt = g_dw.TASK_TRIGGER
     ZeroMemory tt.AddressOf, tt.SizeOf
     Dim TargetTime
     TargetTime = Now + 1
     tt.cbTriggerSize = tt.SizeOf
     tt.wBeginYear = Year(TargetTime)
     tt.wBeginMonth = Month(TargetTime)
     tt.wBeginDay = Day(TargetTime)
     tt.wStartHour = Hour(TargetTime)
     tt.wStartMinute = Minute(TargetTime)
     tt.TriggerType = TASK_TIME_TRIGGER_ONCE
     hr = TaskTriggerMethods.SetTrigger(pTaskTrigger, tt.AddressOf)
     TaskTriggerMethods.Release pTaskTrigger
     If hr < S_OK Then
          TaskMethods.Release pTask
          WScript.Echo "ITaskTrigger::SetTrigger() Error : " & Hex(hr)
          WScript.Quit
     End If

     Dim pPersistFile
     Set pPersistFile = g_dw.LPVOID
     hr = TaskMethods.QueryInterface(pTask, IID_IPersistFile.AddressOf, pPersistFile.AddressOf)
     TaskMethods.Release pTask
     If hr < S_OK Then
          WScript.Echo "ITask::QueryInterface() Error : " & Hex(hr)
          WScript.Quit
     End If

     Dim PersistFileMethods
     Set PersistFileMethods = RegisterIPersistFileMethods(pPersistFile)

     hr = PersistFileMethods.Save(pPersistFile, vbNullString, C_TRUE)
     PersistFileMethods.Release pPersistFile
     If hr < S_OK Then
          WScript.Echo "IPersistFile::Save() Error : " & Hex(hr)
          WScript.Quit
     End If

     WScript.Echo "Completed"
End Sub


Sub ZeroMemory(Start, Length)
     Dim I
     For I = Start To Start + Length - 1
          g_dw.PokeByte I, 0
     Next
End Sub


domingo さん 2006年 04月 15日 00時 48分 22秒

管理人様、回答ありがとうございます。

標準入力・・WshExecオブジェクト・・
まだ、勉強不足のようですね・・・

ただ、先にcmd.exeのウィンドを開いてから貼り付けないと
うまくいかないようなのでsendkeysを使おうとしていました。


管理人むたぐち さん 2006年 04月 14日 18時 43分 35秒

To: H2 さん

> フリーの見積りソフトを使用していましたが、「AxtiveXコンポーネントはオブジェクトを作成できません。データベースを確認してください。ファイルが無いか、壊れています。」と出てきます。

とだけ書かれても、私にもわかりません^^;
そのソフトのマニュアルをよく読んでみる、必要なファイルが
揃っているか確認する、再インストールしてみる、など
一般的な対処法を書くにとどめておきます。


To: domingo さん
"% "でいけると思ったんですが、cmd.exeは無理みたいですね。
IEのコンポーネントを使うことでクリップボードの中身は
取り出せますので(Wiki参照)、あとは標準入力を介して
渡してやればいかがでしょうか。WshExecオブジェクト利用です。

domingo さん 2006年 04月 11日 22時 18分 06秒

はじめまして、sendkeysについて質問です。

WinXPのcmd.exeにsendkeyでALT+スペースを送って
ウィンドメニュー(呼び方が違うかもしれませんが)を
表示させてその中の編集(E)>貼り付け(P)を実行したいのですが
ALT+スペースが送れません、何か方法はないものでしょうか?

要は、cmd.exeのウィンドにクリップボードの内容を
貼り付けしたいのですが・・・・

タカ さん 2006年 04月 09日 08時 19分 40秒

AKAさん

>> わからないですが、Body.InnerHTMLをBody.ParentElement.OuterHTMLに変えたらどうでしょうか?

回答、大変ありがとうございました。しかし。
やってみましたが、結果は前と同様のものとなりました(一部のみ取得)。
初心者ですから、よく分かりませんが、Frameを使ったりしている場合、
できないかもしれませんね。またセキュリティー対策の為、べつの
ソフトウエアや、別のIEを開いて、先に開いたIEのHTMLを取得するのは
ページによっては無理かもしれません。(どこかの掲示板の書き込みに、
その旨、記述がありました。真偽はわかりませんが。)WHS Lab.のホーム
ページでさえ、取得できないとは、残念です。
 それから、二重投稿の件、失礼しました。

H2 さん 2006年 04月 08日 19時 18分 51秒

フリーの見積りソフトを使用していましたが、「AxtiveXコンポーネントはオブジェクトを作成できません。データベースを確認してください。ファイルが無いか、壊れています。」と出てきます。
パソコン暦が浅いもので、全く分かりません。アップデートしてからのような気がするのですが。

AKA さん 2006年 04月 08日 07時 58分 03秒

>>タカ さん 2006年 04月 08日 06時 03分 44秒
わからないですが、Body.InnerHTMLをBody.ParentElement.OuterHTMLに変えたらどうでしょうか?

AKA さん 2006年 04月 08日 07時 07分 07秒

コレクションですが、本体オブジェクトのみならず、さらに列挙オブジェクトもスクリプトからカスタムで作成できるようにしてみました。

http://gamdev.org/up/img/5225.lzh

#またWikiが動かない。なぜ??

ガベージと大量コピーの問題をふまえて列挙オブジェクトを設計すれば、そもそもなぜFor Eachがあるのか、そしてなぜFileSystemObjectのコレクションにItem()で数値インデックスを受け付けないものがあるのかわかるかもしれませんね。

なお、わかりにくいかもしれないので、README内で意味がわからない箇所がある、等がありましたら、質問してください。

タカ さん 2006年 04月 08日 06時 03分 44秒

IEで表示中のHTMLを取得し、画面に出力したいのですが、
以下のスクリプトでは、一部しか取得できないページがあります。
 (たとえば、WSH Labのホームページとか)
どのように修正・変更したら良いか、分かる方はいらっしゃいますか?

'get html script
For Each window In WScript.CreateObject("Shell.Application").Windows
Set document=window.document
 WScript.Echo document.location.href
 WScript.Echo document.title
 WScript.Echo document.Body.InnerHtml
Next

タカ さん 2006年 04月 08日 06時 03分 17秒

IEで表示中のHTMLを取得し、画面に出力したいのですが、
以下のスクリプトでは、一部しか取得できないページがあります。
 (たとえば、WSH Labのホームページとか)
どのように修正・変更したら良いか、分かる方はいらっしゃいますか?

'get html script
For Each window In WScript.CreateObject("Shell.Application").Windows
Set document=window.document
 WScript.Echo document.location.href
 WScript.Echo document.title
 WScript.Echo document.Body.InnerHtml
Next

いりや さん 2006年 04月 06日 22時 04分 18秒

> tk さん

こちらの Googleサイト内検索に "document.write" を入れてみると沢山の例を参照できるので参考になると思います。仕様についてもこちらの掲示板に掲載されているサンプルを改修して、どうしてもそこが分からないと進まない、と思ったときに、グーグルでキーワード検索して調べてみてはいかがでしょうか。たっくさん解説情報がありますから!

ウインドウのライフサイクルについてはそのような流れでよいと思います。


tk さん 2006年 04月 06日 20時 16分 15秒

いりやさん、
ありがとうございます。この方向でできそうですね。
vbsで作りたいと思っているのですが、同じことができると考えてよいですよね?

すみませんが、内容について確認させてください。
考え方としては、空白のインスタンスを生成して、その中にHTMLタグでオブジェクトをおいて表示させている、と言う感じの理解でよいのでしょうか?
そしてそれが閉じられるまでの間(?)表示し、終わったらcloseする、と言うことなのでしょうか?(ここがいまいちわかっていません)

busy、readyStateなど、InternetExplorer.Applicationオブジェクトの取り扱い方を理解しないといけなそうですが、その仕様とか、一覧情報があるところってできれば教えていただけませんでしょうか?
サンプルを示していただいた上に恐縮ですが、どうぞよろしくお願いします。

いりや さん 2006年 04月 06日 19時 27分 17秒

> tk さん

最終ゴールには沢山のステップがあると思いますが、入力 HTML ファイルを用意することなく画面を作り出すスクリプトを JScript で書いてみました。拡張子 .js で保存して起動してみてください。

var e = WScript.createObject('InternetExplorer.Application');
e.navigate('about:blank');
while (e.busy || e.readyState != 4)
    WScript.sleep(100);
e.document.write(new Array(
    '<html>',
    '<head></head>',
    '<body>',
    '<table>',
        '<tr><td>ユーザー名</td>',
        '<td><input type=textbox name=UserID></td></tr>',
        '<tr><td>パスワード</td>',
        '<td><form id=form1><input type=password name=Password></form></td></tr>',
    '</table>',
    '<br><br>',
    '<input type=button value=" OK " class=ok>',
    '<input type=button value="CANCEL" class=cancel>',
    '</body>',
    '</html>').join(''));
e.document.close();

while (e.busy || e.readyState != 4)
    WScript.sleep(100);
var w = e.document.parentWindow;
w.moveTo(0, 0);
w.resizeTo(300, 200);
w.document.title = 'テスト';
w.document.body.scroll='no';
w.document.bgcolor='MENU';

e.toolbar = false;
e.statusbar = false;
e.menubar = false;
e.resizable = false;
e.visible = true;

tk さん 2006年 04月 06日 13時 19分 10秒

いりや さん
さっそくのコメントありがとうございます。助かります!

まだはっきりとは決まっていないのですが、イメージとしては、
 TESTscript.vbs id=0001,name=taro,adr=東京都港区xxxxxx
と(日本語入り)パラメータを指定してスクリプトを実行すると、
idやnameはINPUTタグ、adrはTEXTAREAタグで、与えられた内容をvalueに指定してあげる。と言うものです。

そして、mail送信ボタンを付与してあげて、ボタン押下によりmailを送信する、と言う感じで考えています。

Dynamic HTML Object Modelを理解できていないので、そこからの学習となってしまうと思いますが、参考となる情報、ヒントございましたら、どうぞよろしくお願いします!

いりや さん 2006年 04月 06日 11時 59分 40秒

> tk さん

できます。Dynamic HTML Object Model のプログラミングをすることになります。どんな構造の HTML になるのでしょうか、輪郭だけ紹介いただくことは可能でしょうか。

tk さん 2006年 04月 06日 11時 20分 29秒

すみません、初心者です。一通り読んだつもりなのですが、方向性が見えず、質問させていただきます。
wshで、受け取った引数によってwebページを自動生成し、表示する、と言うスクリプトを作りたいと思っています。
単純にはhtmlファイルを生成し、htmlタグを書き出し、それを起動してあげる、と言う方法が考えられるのですが、できれば、ファイルを生成せずに表示できる方法がないか探しています。
webサーバのかたちではなく、PCstandaloneでファイルを新規生成することなく、webページを表示したい、と言うことになります。
ここ見ろ!と言うことでも結構ですので、どうぞよろしくお願いします!

魔界の仮面弁士 さん 2006年 04月 05日 13時 51分 58秒

》メッシ さん 2006年 04月 05日 13時 45分 18秒

WScript.Echo document.documentElement.outerHTML
WScript.Echo document.frames.length
WScript.Echo document.frames(0).document.documentElement.outerHTML

フレームが入れ子になっている場合は、さらに frames を呼んでみてください。

# ただし、フレームの表示先が異なるサイト上のページになっている場合は、
# セキュリティ上の都合上、VBScriptからアクセスできない場合があります。

メッシ さん 2006年 04月 05日 13時 45分 18秒

IEに表示されているHTMLを取得したいのですが、
以下のscriptでは、フレームを使用したページでは
上手く取得できません。どなたか、方法を
ご存知の方いらっしゃいましたら、お教えください。
(尚、WScript.Echo document.Body.frame2.InnerHtmlは
試してみましたが、無理でした。)

For Each window In WScript.CreateObject("Shell.Application").Windows
Set document=window.document
WScript.Echo document.location.href
WScript.Echo document.title
WScript.Echo document.Body.InnerHtml
Next

新米MCP さん 2006年 04月 04日 21時 22分 29秒

>ひろす さん 2006年 04月 03日 16時 42分 11秒

「私の側に」ではなく「私の側から」と書くべきでした。
まずはお詫びを。

実行するユーザーにパスワードを知らせないということは、
即ちどこかにパスワードを保存しておかなくてはいけないということを意味しますよね。

しかもそのパスワードは実行時に使えなくてはいけない。
要するに、解読する手段が存在することは確実なわけです。
あとは第三者による解読の難易度の差でしかありません。

解読の難易度を考えてみれば、ちゃっぴさんの仰るとおり、
スクリプトよりはタスクスケジュールの方がよさそうです。
タスクスケジュールは、通常は即時動かすものではありませんが、
右クリックで「タスクの実行」を選択すれば、即時実行することができますね。

AD環境があるのであれば、方法はありそうです。

・スタートアップスクリプトを使用して、各PCにタスクスケジュールを作成または配布
・タスクスケジュールの内容は、邪魔な時間にいきなり動かないようなものにしておく
・スクリプトを使用して、スケジュールの右クリックから「タスクの実行」をかける

という手順でどうでしょう。

また、ADにてデフラグ実行専用のアカウントを用意しておけば、さらに安全でしょう。

・グループポリシーを使用し、デフラグ以外は何もできないようなアカウントにする
・スタートアップスクリプトを使用し、ローカルのAdministrator権限を与える

以上のようにしておけば、万一タスクスケジュールからパスワードが読み取られても
被害を最小に抑えることができるでしょう。

タスクスケジュールの作成については、ここの掲示板のログにあります。
アカウントの設定については以下の記事が参考になると思います。
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/oct04/hey1008.mspx
右クリックメニューの使用については、まさにこのサイトに方法が解説されていますね。

いかがでしょう?

ちゃっぴ さん 2006年 04月 04日 09時 24分 07秒

To ひろす さん 2006年 04月 03日 16時 42分 11秒

> やはり、無理なものは無理なんでしょうか。

ちゃんと代替案出していますが?

> ちゃっぴ さん 2006年 03月 31日 23時 37分 49秒

log の検索も含めてもうちょっと検討してください。

Return