はじめまして、ぶっつです。
WSHを使って、ユーザーの登録、フォルダのアクセス権設定を行いたいのですが、どうしたらよいか教えてもらえませんか?
よろしくお願いします。
★『ハッピーメール』★
電話もできる出会い系!!
お友達紹介で、なんと1000円!!高額アフィリエイト♪
紹介すればするほど、稼げます!1ヶ月10万以上も!!
あなたも登録して稼ぎませんか?→http://www.happymail.co.jp/?af1858810
※このサイトに登録するのは、紹介用URLを取得するためだけであって、
出会い系のシステムを使うわけではないので、当然『無料』でできます。
※迷惑電話や迷惑メール、架空請求といったことは『絶対』に無い優良サイトです。
※認証時に『携帯電話認証』がありますが、機械が『確認しました』というだけで登録できます。
タイプライブラリをダンプするコマンドラインツールです。
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とかでもしばらくフリーズ状態になるわけですが、本プログラムでテキストにリダイレクトしたデータも、メモ帳やワードパッド等一度にすべてのテキストを読みこむタイプのエディタでは、しばらくフリーズになります(^^;)
インデントが深いので、データを見るのにはインデントでジャンプできるエディタが必須かも・・・
同様のものをご存じの方、お教え下さい。
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
こんな感じでオンライン状態の取得ができます。
(管理人により削除)
http://winscript.s41.xrea.com/upload/up.html
アップローダを設置しました。
動作確認よろしくお願いします。私がちょっと使った感じでは問題ないようですが…。
今度は削除もご自分でできますので…。
非バリアントの配列を操作できるオブジェクトです。
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>
(管理人により削除)
To: AKA さん
zipファイルがアップロードできない件、了解しました。
XREAとPukiWikiの組み合わせで起こってしまう現象のようで、
私もいろいろ調べて試したんですが駄目だったのです。
もうアップローダーとして使うのは諦め、別途用意したほうが
いいかもしれないですね。
少しお待ちください。
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のうちに私なりの紹介記事を書いてみようと思います。
>>いしかわ さん 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秒
初心者が気になる疑問は結構この掲示板の過去ログにありますよ。この掲示板の下の方に全部の過去ログがリンクしてあるので、ダウンローダとかで一気に落としておくと便利です。
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も警告が出たりするのでやはり直して欲しいのですが・・・
私自身でも何かできることはあるでしょうか?
はじめまして。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年 03月 18日 02時 18分 55秒
で書いた内容に重大な誤りがあったので訂正いたします。
WMI での接続の問題に関して・・・
> でもこれだけでは不十分で、MSRPC を利用するには双方で
> 名前解決できていないとなりません。
これは誤りです。WMI の接続において、名前解決は必須ではありません。
# 同じ RPC を利用する MSDTC の場合は必須ですが…
ということで訂正させてください。
最近、偽装に関する質問が多いようなので…
とりあえず偽装が必要な場合、私は お手軽な方法として、task scheduler を推奨していますが、注意が必要な点があるので書いておきます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=30076&forum=8
上記でも書いたんですが、SCHTASKS を利用する場合には、ちょいと厄介です。
ようは、接続先と接続元で account, password が完全に一致しているものでlogon して実行する分には全く問題がないんですが、たぶん知らない人がほとんどでしょうからあえて書き込ませていただきます。
> 管理者ユーザのパスワードを入力させるプロンプトを利用されて
> 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 ではまともにできないので、別の方法を模索されたほうがいいかと・・・
To ちゃっぴ さん。
回答ありがとうございます。
>ということですと、parameter を与える必要があるでしょうから、
>それこそ細心の注意を払わないと injection 系の攻撃を食らうことになります。
管理者ユーザのパスワードを入力させるプロンプトを利用されてinjection 系の攻撃を食らう可能性があるという事ですよね。
COM の偽装というのがよく分からないので、ちょっと調べてみます。
まだまだ勉強不足ですね・・・
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
To しの さん 2006年 04月 23日 10時 52分 33秒
> 管理者権限がない普通の一般ユーザでログインしている状態で、
> 管理者権限があるユーザでしか実行できないようなコマンドを
> 含んだスクリプト(ユーザ追加など)を実行する方法はありますでしょうか?
単に偽装したいというなら、RUNAS.EXE。ただし、その User が
管理者権限のある account の password を知っていることが前提です。
管理者権限を全く与えないで、実行できるようにするというなら
偽装して動かすような Application を作ることになります。
偽装を行わせる機能としては、task scheduler とか、
COM の偽装とかあります。しかし、
> ユーザ追加など
ということですと、parameter を与える必要があるでしょうから、
それこそ細心の注意を払わないと injection 系の攻撃を食らうことになります。
ここで、書いてあることがすぐにわからないようでは、
やめておいたほうがいいとおもいますねぇ。
リモート接続したPCのレジストリを変更したい。
自端末のレジストリは
Set WSHShell=Wscript.CreateObject("Wscript.Shell")
WSHShell.RegWrite "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\FLG" , 1,"REG_SZ"
で値を0→1に変更できます。
test_1という端末名が付いている端末に接続し、
上記レジストリの値を変更したいとき、どういう記述にすればいいのでしょうか?
こんにちは。
管理者権限がない普通の一般ユーザでログインしている状態で、管理者権限があるユーザでしか
実行できないようなコマンドを含んだスクリプト(ユーザ追加など)を実行する方法はありますでしょうか?
宜しくお願いします。
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()とモニカをサポートしてみました。
To: ロビー さん
重大な理由がない限り、基本的にログは消さないことにしています、
というのも、投稿された内容は、他の方の参考になるリソース(資源)と
なるからです。ここの掲示板もそうですが、多くの掲示板は助け合いの
精神で成り立っています。そのことをよくご理解いただきたいと思います。
ありがとうございます。
すいません。それとこのソースを消すことはできませんか?
To: ロビー さん
最終行、end if ではなくnextを使います。
For...Nextと覚えてください。
こんにちは。
下記のプログラムを作ってみたのですが、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
本屋さんに行ったら、新しいVBScriptの本が出てたので買ってきました。
基礎から応用まで網羅している模様。
これから読んでみます。
Amazon.co.jp:最速攻略 VBScriptサンプル大全集最速攻略: 本
http://www.amazon.co.jp/exec/obidos/ASIN/4774127108/250-6892813-3081016
WshShell.Execちょっと解って来ました。
今度の週末にいろいろ試してみたいと思います。
ありがとうございます。
Set WshShell=CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("cmd.exe")
oExec.StdIn.WriteLine "dir C:\"
oExec.StdIn.WriteLine "exit"
MsgBox oExec.StdOut.ReadAll
こういう使い方で正しいのだろうか。むむむ。
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を読むと、クリップボードの中身を標準入力に
書き込んで、それがコマンドなら実行されてることが分かるのですが…。
# 標準入出力の取り扱いを何か大きく勘違いしてるっぽい?
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
管理人様、回答ありがとうございます。
標準入力・・WshExecオブジェクト・・
まだ、勉強不足のようですね・・・
ただ、先にcmd.exeのウィンドを開いてから貼り付けないと
うまくいかないようなのでsendkeysを使おうとしていました。
To: H2 さん
> フリーの見積りソフトを使用していましたが、「AxtiveXコンポーネントはオブジェクトを作成できません。データベースを確認してください。ファイルが無いか、壊れています。」と出てきます。
とだけ書かれても、私にもわかりません^^;
そのソフトのマニュアルをよく読んでみる、必要なファイルが
揃っているか確認する、再インストールしてみる、など
一般的な対処法を書くにとどめておきます。
To: domingo さん
"% "でいけると思ったんですが、cmd.exeは無理みたいですね。
IEのコンポーネントを使うことでクリップボードの中身は
取り出せますので(Wiki参照)、あとは標準入力を介して
渡してやればいかがでしょうか。WshExecオブジェクト利用です。
はじめまして、sendkeysについて質問です。
WinXPのcmd.exeにsendkeyでALT+スペースを送って
ウィンドメニュー(呼び方が違うかもしれませんが)を
表示させてその中の編集(E)>貼り付け(P)を実行したいのですが
ALT+スペースが送れません、何か方法はないものでしょうか?
要は、cmd.exeのウィンドにクリップボードの内容を
貼り付けしたいのですが・・・・
AKAさん
>> わからないですが、Body.InnerHTMLをBody.ParentElement.OuterHTMLに変えたらどうでしょうか?
回答、大変ありがとうございました。しかし。
やってみましたが、結果は前と同様のものとなりました(一部のみ取得)。
初心者ですから、よく分かりませんが、Frameを使ったりしている場合、
できないかもしれませんね。またセキュリティー対策の為、べつの
ソフトウエアや、別のIEを開いて、先に開いたIEのHTMLを取得するのは
ページによっては無理かもしれません。(どこかの掲示板の書き込みに、
その旨、記述がありました。真偽はわかりませんが。)WHS Lab.のホーム
ページでさえ、取得できないとは、残念です。
それから、二重投稿の件、失礼しました。
フリーの見積りソフトを使用していましたが、「AxtiveXコンポーネントはオブジェクトを作成できません。データベースを確認してください。ファイルが無いか、壊れています。」と出てきます。
パソコン暦が浅いもので、全く分かりません。アップデートしてからのような気がするのですが。
>>タカ さん 2006年 04月 08日 06時 03分 44秒
わからないですが、Body.InnerHTMLをBody.ParentElement.OuterHTMLに変えたらどうでしょうか?
コレクションですが、本体オブジェクトのみならず、さらに列挙オブジェクトもスクリプトからカスタムで作成できるようにしてみました。
http://gamdev.org/up/img/5225.lzh
#またWikiが動かない。なぜ??
ガベージと大量コピーの問題をふまえて列挙オブジェクトを設計すれば、そもそもなぜFor Eachがあるのか、そしてなぜFileSystemObjectのコレクションにItem()で数値インデックスを受け付けないものがあるのかわかるかもしれませんね。
なお、わかりにくいかもしれないので、README内で意味がわからない箇所がある、等がありましたら、質問してください。
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
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
> tk さん
こちらの Googleサイト内検索に "document.write" を入れてみると沢山の例を参照できるので参考になると思います。仕様についてもこちらの掲示板に掲載されているサンプルを改修して、どうしてもそこが分からないと進まない、と思ったときに、グーグルでキーワード検索して調べてみてはいかがでしょうか。たっくさん解説情報がありますから!
ウインドウのライフサイクルについてはそのような流れでよいと思います。
いりやさん、
ありがとうございます。この方向でできそうですね。
vbsで作りたいと思っているのですが、同じことができると考えてよいですよね?
すみませんが、内容について確認させてください。
考え方としては、空白のインスタンスを生成して、その中にHTMLタグでオブジェクトをおいて表示させている、と言う感じの理解でよいのでしょうか?
そしてそれが閉じられるまでの間(?)表示し、終わったらcloseする、と言うことなのでしょうか?(ここがいまいちわかっていません)
busy、readyStateなど、InternetExplorer.Applicationオブジェクトの取り扱い方を理解しないといけなそうですが、その仕様とか、一覧情報があるところってできれば教えていただけませんでしょうか?
サンプルを示していただいた上に恐縮ですが、どうぞよろしくお願いします。
> 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;
いりや さん
さっそくのコメントありがとうございます。助かります!
まだはっきりとは決まっていないのですが、イメージとしては、
TESTscript.vbs id=0001,name=taro,adr=東京都港区xxxxxx
と(日本語入り)パラメータを指定してスクリプトを実行すると、
idやnameはINPUTタグ、adrはTEXTAREAタグで、与えられた内容をvalueに指定してあげる。と言うものです。
そして、mail送信ボタンを付与してあげて、ボタン押下によりmailを送信する、と言う感じで考えています。
Dynamic HTML Object Modelを理解できていないので、そこからの学習となってしまうと思いますが、参考となる情報、ヒントございましたら、どうぞよろしくお願いします!
> tk さん
できます。Dynamic HTML Object Model のプログラミングをすることになります。どんな構造の HTML になるのでしょうか、輪郭だけ紹介いただくことは可能でしょうか。
すみません、初心者です。一通り読んだつもりなのですが、方向性が見えず、質問させていただきます。
wshで、受け取った引数によってwebページを自動生成し、表示する、と言うスクリプトを作りたいと思っています。
単純にはhtmlファイルを生成し、htmlタグを書き出し、それを起動してあげる、と言う方法が考えられるのですが、できれば、ファイルを生成せずに表示できる方法がないか探しています。
webサーバのかたちではなく、PCstandaloneでファイルを新規生成することなく、webページを表示したい、と言うことになります。
ここ見ろ!と言うことでも結構ですので、どうぞよろしくお願いします!
》メッシ さん 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からアクセスできない場合があります。
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
>ひろす さん 2006年 04月 03日 16時 42分 11秒
「私の側に」ではなく「私の側から」と書くべきでした。
まずはお詫びを。
実行するユーザーにパスワードを知らせないということは、
即ちどこかにパスワードを保存しておかなくてはいけないということを意味しますよね。
しかもそのパスワードは実行時に使えなくてはいけない。
要するに、解読する手段が存在することは確実なわけです。
あとは第三者による解読の難易度の差でしかありません。
解読の難易度を考えてみれば、ちゃっぴさんの仰るとおり、
スクリプトよりはタスクスケジュールの方がよさそうです。
タスクスケジュールは、通常は即時動かすものではありませんが、
右クリックで「タスクの実行」を選択すれば、即時実行することができますね。
AD環境があるのであれば、方法はありそうです。
・スタートアップスクリプトを使用して、各PCにタスクスケジュールを作成または配布
・タスクスケジュールの内容は、邪魔な時間にいきなり動かないようなものにしておく
・スクリプトを使用して、スケジュールの右クリックから「タスクの実行」をかける
という手順でどうでしょう。
また、ADにてデフラグ実行専用のアカウントを用意しておけば、さらに安全でしょう。
・グループポリシーを使用し、デフラグ以外は何もできないようなアカウントにする
・スタートアップスクリプトを使用し、ローカルのAdministrator権限を与える
以上のようにしておけば、万一タスクスケジュールからパスワードが読み取られても
被害を最小に抑えることができるでしょう。
タスクスケジュールの作成については、ここの掲示板のログにあります。
アカウントの設定については以下の記事が参考になると思います。
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/oct04/hey1008.mspx
右クリックメニューの使用については、まさにこのサイトに方法が解説されていますね。
いかがでしょう?
To ひろす さん 2006年 04月 03日 16時 42分 11秒
> やはり、無理なものは無理なんでしょうか。
ちゃんと代替案出していますが?
> ちゃっぴ さん 2006年 03月 31日 23時 37分 49秒
log の検索も含めてもうちょっと検討してください。