ちゃっぴ さん、新米MCP さん
大変おせわになっております。
ちゃっぴさんではなく、私の方で、説明が不十分でした。
AD の環境はあるのですが、セキュリティのためユーザには、ローカル管理者権限は与えておらず、ユーザは管理者のパスワードもしりません。ユーザ数は、数百です。
スタートアップスクリプトでデフラグを実行するのは、現実的ではないと思い、ユーザ自身が好きなときに、管理者権限なしに、実行出来ればと思い、質問させて頂きました。
Windows Script Encoder を使用しようとしていたのですが、そんな間単にデコード出来るんですね。
他にも悩んでらっしゃる管理者の方もいらっしゃるとは思うのですが、
やはり、無理なものは無理なんでしょうか。
ちゃっぴ さん 2006年 04月 03日 01時 32分 13秒
>batch に埋め込む必要は全くありませんよね?
すいません、仰る通りなのですが、私の側に説明が足りませんでした。
Active Directoryなどがない環境下で、既に多数のPCがあり、
それぞれのPCに同じローカルの管理者アカウントが用意してあるけれど、
個々のユーザーは管理者アカウントのパスワードは知らない。
少人数で数千台のPCを設定して回るのはちょっと無理なので、操作はユーザーです。
設定を実行する本人にパスワードを知らせないで実行しなくてはいけないのです。
もちろん、それが正しい方法だとは思っていません。
・・・というような環境があるんですが、おそらく、ひろすさんの環境も似たようなものではないでしょうか。
だからこんな変な方法について悩んでいるんだと思います。
そこを説明なしに話をしてしまいました。申し訳ありません。
私はもう「無理なものは無理」と半分諦めていたのですが、
以前の自分と似たようなことで悩んでいる人を見て反応してしまいました。
>それに disassemble しなくても、password を平文で埋め込んでいたら、
>editor だけで覗けます。これは legacy の C/C++ で compile しても
>一緒です。はっきりいって論外です。
ある程度予想していましたが、そんなに簡単にできちゃうんですね。
残念です。orz
To 新米MCP さん 2006年 04月 03日 00時 24分 16秒
> バッチなどで作成すると、作成用のバッチにパスワードを書く
> 羽目になるものですから、それが何とかできればいいのですが。
batch に埋め込む必要は全くありませんよね?
起動するときに引数渡ししてやるとか、それだけのことです。
それにその端末に batch をおいておく必要すらないでしょうから。
全く問題にならないと思いますが?
あと、普通は一回設定すれば OK なわけで、
そんな頻繁にやる作業でもないので問題ないでしょう。
> VB.NETのアプリケーションをエディタで開くのは、
> 前にやってみたことがあります。
> あれはびっくりしました。
> やっぱり簡単に逆コンパイルできちゃうんでしょうか…。
.NET逆コンパイラとコードを難読化するDotfuscator
http://www.atmarkit.co.jp/fdotnet/tools/dotfuscator/dotfuscator_01.html
それに disassemble しなくても、password を平文で埋め込んでいたら、
editor だけで覗けます。これは legacy の C/C++ で compile しても
一緒です。はっきりいって論外です。
>ちゃっぴ さん 2006年 03月 31日 23時 37分 49秒
タスクスケジューラを使う方法があるのは理解しているのですが、
そのスケジュールを作成する方法のところでやはり困ってしまいます。
バッチなどで作成すると、作成用のバッチにパスワードを書く羽目になるものですから、
それが何とかできればいいのですが。
VB.NETのアプリケーションをエディタで開くのは、前にやってみたことがあります。
あれはびっくりしました。
やっぱり簡単に逆コンパイルできちゃうんでしょうか…。
>Crusade さん 2006年 04月 02日 15時 35分 45秒
できたんですね。よかった。
初心者向けの書籍というか、最初に読むようなものとしては、
VBScriptハッカーズプログラミングという本をお勧めします。
http://www.amazon.co.jp/exec/obidos/ASIN/4896272838/qid=1143991287/sr=1-2/ref=sr_1_10_2/503-5833495-5282329
何より読みやすいという一事において、入門書に向いていると思います。
こんばんわ。Crusadeです。
掲示板に質問したのですが、丸1日スクリプトと各関連サイトを
にらめっこした結果、何とか完成しました。
こういう事も出来るんですね!
本当に初心者なんで、出来上がった事にびっくりしていますが・・・。
良かったら初心者にも解り易いようなVBSの本をご紹介してくださると嬉しく思います。
ちょくちょく顔を出させていただきたいと思います。
よろしくお願いします!
初めまして。
プログラムもよく解らないのにWSHに興味を持ち始めて色々勉強しています。
1つ質問させて頂きたいのですが、よろしいでしょうか。
vbsにて、TXTをD&Dすると、Sendkeys操作のみで、最初の1行に『あ』と書き込んで、上書き保存、終了させるようなスクリプトを書くとします。
例)
TEST.txt--D&D--→script.vbs--処理後--→『あ』という文字が書き込まれたTEST.txtを上書き保存(処理はsendkeyのみで)
このスクリプトに対して、複数ファイルを処理させたいのですが、可能でしょうか?
例)
a01.txt,b01.txt,c03.txt--explorer上で複数選択しD&D→script.vbs--『あ』という文字が書き込まれたそれぞれのtxtを上書き保存
具体的に何をしたいのかといいますと、ファイル操作ではなく、ソフト操作を自動化させたいと思っています。
但し、コマンドラインで実行できるかどうか解らない無いので、GUIを起動しての一連の操作を行う感じです。ただ、これを1つのファイルに対してではなく、複数ファイルを次々と処理させたいのですが・・・
#1つのファイルに対しての処理をさせるのは、何となくですが完成しているのです。
#サンプルを見ては書き足したり、テストしたりしておりまして、VBS版とJS版両方出来てたりしますが・・・・
ご教授いただけますと幸いに存じます。
よろしくお願いいたします。
IEでFSOやWshShellをCreateObject()するとセキュリティ警告が出るわけですが、それ自体は安全と主張する、代理CreateObject()メソッドを搭載するオートメーションを作ってみました。
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=SAFC001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D
これを使えば通常のセキュリティ設定で任意のオブジェクトをIEから使うことが可能になるはずです。まあ「安全とマークされている」ものも禁止していれば使えないですが・・・
私はWin2000を使っているわけですが、XPでは、特にSP2以降セキュリティが変更されたようで、このコンポーネントが正常に動くかどうかわかりません。
どなたかXPにおける動作確認お願い致します。m(_ _)m
なおもちろんこのオートメーションは登録しないと使えないわけで、いわゆるセキュリティホールを突いているわけではありません。
To 新米MCP さん 2006年 03月 31日 22時 03分 40秒
To ひろす さん 2006年 03月 31日 16時 55分 04秒
追伸。task scheduler を使うとして、呼び出す program の配置されている
folder は NTFS ACL で user の利用権限を奪ってください。あたりまえですが・・・
これやらないと、いくらでも権限を昇格できる脆弱性を作ることになります。
よびだしは、「タスクの実行」でも「schtask /run」でも。
To 新米MCP さん 2006年 03月 31日 22時 03分 40秒
To ひろす さん 2006年 03月 31日 16時 55分 04秒
何度も書いていますが・・・
task schedluer 使いましょう。
CUI版の defrag.exe は Windows XP 以降についていますから、
それで事足りるでしょう。
> デコーダーが公開されている状態では、
> ちょっとのことで情報漏洩になりかねませんから…。
> 今はVB.NETで作成したアプリケーションを使用しています。
> これでもリバースエンジニアリングされちゃえば同じなんだけど、
> スクリプトよりはずっと安心ですから。
.NET の reverse enginiering はめちゃくちゃ楽です。
はっきりいって、保護していないのと同じです。意味ないです。
なにも逆 compile しなくても binary を editor で開いてみてください。
恐ろしいことがわかるでしょうから。
難解な暗号化 engine をつんだうえで、password を暗号化したうえで格納
legacy C++ あたりで CreateProcessWithLogon API あたりを使って
作成したうえで難読化かけとくとか、そのあたりが最低 level でしょう。
どちらにしても、基本的に password の埋め込みは NG です。
まずは代替手段を考慮すべきです。
>ひろす さん 2006年 03月 31日 16時 55分 04秒
私はもともとSendKeysを使って、Windows Script Encoderをかけたものを使っていました。
↓これとよく似た物です。
http://www.vector.co.jp/soft/winnt/util/se381800.html
AppActivateなどと上手に組み合わせれば、意外と高確率で成功します。
でも↓(同じ作者だ…)が公開されているのに気付いたのでやめちゃいました。
http://www.vector.co.jp/soft/win95/net/se371948.html
デコーダーが公開されている状態では、ちょっとのことで情報漏洩になりかねませんから…。
今はVB.NETで作成したアプリケーションを使用しています。
これでもリバースエンジニアリングされちゃえば同じなんだけど、
スクリプトよりはずっと安心ですから。
To: よっちゃん さん
自由にコンポーネントがインストールできない環境なら、
あとはHTAを使って自作するとかですかねー。
FileSystemObjectを駆使すれば作れないことはないと思います。
WSHから呼び出すのがちょっと難しいですが。
# ばんのしゃーによかばんたさんが色々研究されています。
手軽に使えるコンポーネントとしてはShellNameSpaceという
お気に入りの整理に使われているコントロールがあるのですが、
せいぜいファイルかフォルダを表示切り替えできるくらいです。
一応、昔つくったサンプルを。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/src/sh_ns.lzh
# XPでは動かないですね。
.NET Frameworkが入っていたらOpenFileDialogが使えますけど、
WSHから呼び出すにはこれまた結構面倒ですし…。
http://www.atmarkit.co.jp/fdotnet/csharptips/007dialog/007dialog.html
新米MCP さん
ありがとうございます。
やはりそうですよね。WMIでも、ローカルにも違うユーザではアクセス出来ませんでした。
ユーザ権限では出来ないがユーザの業務に影響する作業、例えばデフラグなどを、暗号化スクリプトにして、ユーザの都合のいいときに、実行してもらうようにしたかったのですが・・・残念です。
デフラグを、スタートアップスクリプトでするのは、影響が大きすぎて出来ないんですよね。
他の管理者のかたは、このような作業をどのように管理しているのでしょうか。
知っている方がいらっしゃいましたら、ぜひ情報お願い致します。
>ひろす さん 2006年 03月 30日 16時 04分 46秒
補足。
Microsoftとしては、ローカルのPCに管理者アカウントのパスワードを含むスクリプトなどを置くな、という立場なのだと思います。
Active Directoryでスタートアップスクリプトやシャットダウンスクリプトを使用すればシステム権限での実行は可能ですから、
そういう対応をすべきである、ということだと思われます。
>ひろす さん 2006年 03月 30日 16時 04分 46秒
それはできません。
方法が用意されていないのではなく、故意にできなくされているようです。
Runasのコマンドではパイプは一切受け付けてくれませんし、
WMIなどを使用してもローカルのPC(つまり自分自身のPCです)は操作できません。
必ず一度、手入力を経る必要があります。
SendKeysなどで回避するか、それが嫌ならフリーソフトでRUNASXやRUNASAといったソフトを使うしかありません。
しかしこれらのソフトを使っても、スクリプト内にIDとパスワードを記述することは避けられません。
有償でよければ相談に乗る会社もありますが…うちとかw
でもセキュリティ上、運用回避を強くお勧めします。
お世話になります。
ローカルに管理者権限のないユーザが、管理者権限で、WSHスクリプトのWSH.Shellのインスタンスを実行出来るのでしょうか。Exec で、デフラグを実行させたいと考えております。
RUNAS で実行しても、結局はパスワードを入力する必要があるしローカルではやはり不可能なのでしょうか。
WMIとADSIだと、パスワードもスクリプトの中に記述出来るみたいなのですが・・・
どうぞよろしくお願い致します。
むたぐちさんありがとうございます。
会社のPCなので開発用ソフトは入っていません。
アドミでログインすることもできないし・・・
そこで、WSHで。と思ったのです。
そんな環境じゃムリなのでしょうか?
To: よっちゃん さん
comdlg32.ocxをWSHから使うには開発時ライセンスが必要です。
開発時ライセンスはVB,Visual Studio製品群に付属しています。
むたぐちさん早速の回答ありがとうございます。
XPならできますよね。
PCが2000PROなのですがなにか良い方法がないものかと
色々やってるんですが・・・
他のサイトで申し訳ないのですが、
http://cgi33.plala.or.jp/biwakobo/showhtml.cgi?f=vbs01#CMNDLG
にこれだ!ってものがあったのですが、動きません。
ランタイムをインストールしてもだめです。
To: よっちゃん さん
管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 10月 30日 00時 29分 52秒
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list50.shtml
の方法でしょうか?
それならばフィルタはかけられません。
他にCommonDialogを表示させるにはXP限定になりますが、
UserAccounts.CommonDialogやSAFRCFileDlg.FileOpenを使う方法があります。
http://groups.msn.com/windowsscript/windowsxp.msnw
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx
前者は、Filterプロパティでフィルタをかけられます。
初めての投稿です。
Set Ie = CreateObject("InternetExplorer.Application")
Ie.Navigate( "about:blank" )
として、ファイル選択のダイアログを表示させたのですが、
ファイルの種類を特定したいのですが、どうすれば良いでしょうか。
フィルターって有効なのですか?
教えてください。
ちなみに文字数を数える定石を書いておきます。
sにテキスト全文を読み込ませておくと、そのvbCrの数(改行数)は、
MsgBox UBound(Split(s,vbCr))
To: AKA さん 2006年 03月 18日 19時 32分 23秒
> ここの「スクリプトの暴走を止める」という記事ですが・・・
>
> >Ctrl+Alt+Delで表示される、おなじみ強制終了ダイアログ
> >たとえば次のようなスクリプト
> > msgbox "こんにちは",,"あいさつ"
> >のような無限ループを止めるのが難しいのです。
>
> これは9xでの記述ですね。
いつもご指摘ありがとうございます。
たしかにおっしゃるとおり、この記事はかなり古いものでXP,2000以前のものです。
今回、XP,2000に関する記述もつけたしておきました。
To: たけ さん
> ところで、ADODB.StreamにはTextStreamにあるLineプロパティ
> のようなプロパティは存在しないのでしょうか?
Lineプロパティをどのような目的で使うのでしょうか?
単に行数をカウントするなら、読み込んだテキストのVBCrの数を
カウントしてやるとかでいいのではないでしょうか。
コレクションの件ですが、VB等で汎用コレクションのコンポーネントを作るのは簡単です。
しかしそれでは今一つつまらない(^^;)
そこで_NewEnumメンバだけを供給するラッピングオブジェクトを作成するコンポーネントを作ってみました。
これを使えば自分の作ったオブジェクトにFor Each列挙機能を付加することができます。
管理人さんもこれを使ってバシバシオリジナル実装のコレクションを作りまくってください。
例えばの話、Excelを持っていればヘルプでVBA汎用コレクションの仕様が見られると思いますが、これと同じものをScripting.Dictionaryの助けなしで作ってみると面白いと思います。(Add/Removeでのガベージや大量コピーに注意するとなお良)
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=CUT001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D
>魔界の仮面弁士 さん 2006年 03月 23日 02時 26分 56秒
ありがとうございます。
》fanto さん 2006年 03月 22日 21時 28分 42秒
a = InputBox("なにか入力してください")
If a = "1" Then
b = InputBox("何か入力してください")
MsgBox b
Else
MsgBox "×"
End If
かな。
質問なんですが、
windowsのメモ帳で遊んでいるんですが、
a=inputbox ("なにか入力してください")
if a="1" then b=inputbox ("何か入力してください")
msgbox b
else msgbox "×"
で実行すると
行4
文字1
エラー 構文エラーです。
と表示されてしまうのですが、
どうしたらいいのでしょうか?
また、else msgbox "×"を消した場合、
aに1以外を入力しても、bが表示されてしまいます。
a="1"のときだけbを表示したいときはどうすればいいのでしょうか?
>魔界の仮面弁士さん
試してみたところ無事うまくいきました!!
本当にありがとうございます。
ところで、ADODB.StreamにはTextStreamにあるLineプロパティ
のようなプロパティは存在しないのでしょうか?
検索してみたのですが、それらしきものが見当たらなかったため
(Positionプロパティが使えるのでしょうか?)と、とりあえずの
ところ、dxfファイルからCR+LFの別ファイルを作成し、作成した
ファイルに対し、Lineプロパティを用いています。
ここの皆様のおかげで、初心者ながらあと一歩のところまできました。
どうかあと少しご教示願います。
>魔界の仮面弁士さん
ご教示ありがとうございます。
早速、試してみたいと思います。
》たけ さん 2006年 03月 18日 23時 01分 39秒
> 改行コードを変換するには、どういった対応をとるのが一般的
FileSystemObject のかわりに、ADODB.Stream オブジェクトを
使ってみてください。CR改行/LF改行/CRLF改行の3種を選択できます。
>AKAさん
前回の記事読んでくださってありがとうございます。
dxfはバイナリ形式ではなく、テキスト形式です。
なので文字コードとしては問題ないなのですが、改行コード
がMAC(CR)になってしまいます。
改行コードを変換するには、どういった対応をとるのが一般的
なのでしょうか?
>>たけ さん 2006年 03月 18日 16時 30分 12秒
>管理人むたぐち さん 2006年 03月 11日 01時 40分 37秒
>バイナリファイルをFileSystemObjectのTextStream(ですよね?)で置換するということじたい、かなり冒険してると思うのですが…。
dxfがテキスト形式でなくバイナリ形式ならば、FileSystemObjectで扱うのは無理です。理由は文字コード変換が起こってバイナリデータが化けるからです。バイナリデータなら通常ADODB.Streamを使うしかありません。
>ちゃっぴ さん 2006年 03月 11日 14時 36分 00秒
の紹介リンク読みました?
あと、スクリプトに不明な点があるので部分ではなく全文を書いてください。
WIN32API.VBSに同梱のED_BUT.VBSですが、Xボタンで閉じるとウィンドウは閉じますが、その後VBSがハング状態に陥ります。Xボタンがあることを忘れてました(^^;)
ED_BUT.VBSをバグフィックスし、改良したWIN32API.VBSをアップしました。WIN32API.VBSにも新たな定義が追加されました。
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=WAPI002.ZIP&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D
>>管理人さん
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/technic.htm
ここの「スクリプトの暴走を止める」という記事ですが・・・
>Ctrl+Alt+Delで表示される、おなじみ強制終了ダイアログ
>たとえば次のようなスクリプト
> msgbox "こんにちは",,"あいさつ"
>のような無限ループを止めるのが難しいのです。
これは9xでの記述ですね。
NTではタスクマネージャがあるわけですが、強制終了ツールというソフトが数多く存在しています。
おそらくこれが世界一有名でしょう。単なる強制終了ツールにとどまらない高機能な物らしいですが、重そうなので落としてない・・・(^^;)
Process Explorer
http://www.sysinternals.com/ntw2k/freeware/procexp.shtml
軽いのとしてはこんなのがあるみたいです。
PExec
http://ff.pekori.to/library/others.html
VC+SDKレベルで作ってるので、ランタイム不要でパッケージはわずか18K(ナイス!)。
ただし自動更新はOFFにしないとまともに使えない・・・
さらにこんなのもありましたが・・・
ProcessTerminateSystem
http://www.h3.dion.ne.jp/~hanagex/dev/contents/soft/systemtool/ptsfp.html
>【 動作確認 】 Windows 98/Me/2000 Pro./XP Pro.
>【 必要DLL 】 Microsoft Visual Basic 6.0ランタイムライブラリ[推奨SP5]
> Microsoft Windows Common Controls 6.0 (SP4以上)
> HANAGEXは、中高生で構成される、コンピューターソフト会社(チーム)です。
Win98では無限メッセージボックススクリプトを終了させることはできませんでした。
(ちなみにWin2000ではCOMCTLが古くて(5.8)起動さえできなかったのでそれ以上確認しませんでした)
というか、VBではWin32APIが全部は使えないわけで、システム回りを作る場合の選択肢としてはどうなんでしょうか。まあでも強制終了ツールくらいだったら充分可能なはずだと思いますが・・・
なお、「スクリプトの暴走を止める」という記事は絶対消さないで下さい。加筆はいいのだけれど。この記事は、9xを使う場合、およびGUIアプリの強制終了法に関する重要な情報なので。
それで私もDWを使った強制終了ツールを作ってみました。いかがでしょうか?
' プロセス強制終了ツール
Option Explicit
Dim g_dw
Set g_dw = CreateObject("DynamicWrapper")
ExecuteGlobal g_dw.fc("C:\UTL\WIN32API.VBS") '自分のフォルダに直してください
g_dw.RegisterName "SendMessageA_sz", "USER32", "SendMessageA", "i=lllr", "r=l"
Main
WScript.Quit
Sub Main
Dim WindowStyle
WindowStyle = WS_VISIBLE Or WS_SYSMENU Or WS_VSCROLL Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX Or WS_SIZEBOX
Dim Hwnd
Hwnd = g_dw.CreateWindowExA(WS_EX_CLIENTEDGE, "ListBox", WScript.ScriptName, WindowStyle, 0, 0, 400, 300, C_NULL, C_NULL, g_dw.GetModuleHandleA(C_NULL), C_NULL)
If Hwnd = C_NULL Then
WScript.Echo "CreateWindowEx() error"
WScript.Quit
End If
Dim Procs
Set Procs = GetProcs()
Dim I
For I = 0 To Procs.Count - 1
Dim Item
Set Item = Procs.Item(I)
'WScript.Echo Item.Id & " """ & Item.Name & """"
g_dw.SendMessageA_sz Hwnd, LB_ADDSTRING, 0, Right(Space(11) & Item.Id, 12) & " """ & Item.Name & """"
Next
Dim msg
Set msg = g_dw.MSG
Do While True
Dim bRes
g_dw.GetMessage msg.AddressOf, C_NULL, 0, 0
g_dw.TranslateMessage msg.AddressOf
g_dw.DispatchMessage msg.AddressOf
If g_dw.IsWindow(Hwnd) = C_FALSE Then
Exit Do
End If
If (msg.message = WM_KEYDOWN And msg.wParam = VK_RETURN) Or msg.message = WM_LBUTTONDOWN Then
Dim Index
Index = g_dw.SendMessageA(Hwnd, LB_GETCURSEL, 0, 0)
If Index >= 0 Then
Dim Text
Text = "Id = " & Procs.Item(Index).Id & vbCrLf & "Name = """ & Procs.Item(Index).Name & """" & vbCrLf & vbCrLf & "Do you really want to kill this process?"
Dim Res
Res = MsgBox(Text, vbYesNo)
If Res = vbYes Then
Dim hTargetProcess
hTargetProcess = g_dw.OpenProcess(PROCESS_TERMINATE, C_FALSE, Procs.Item(Index).Id)
If hTargetProcess <> C_NULL Then
g_dw.TerminateProcess hTargetProcess, 0
End If
g_dw.PostMessageA Hwnd, WM_SYSCOMMAND, SC_CLOSE, 0
End If
End If
End If
Loop
End Sub
Function GetProcs()
Dim CurrentProcessId
CurrentProcessId = g_dw.GetCurrentProcessId()
Dim hSnapProcess
hSnapProcess = g_dw.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If hSnapProcess = INVALID_HANDLE_VALUE Then
WScript.Echo "CreateToolhelp32Snapshot() Error"
WScript.Quit -1
End If
Dim pe
Set pe = g_dw.PROCESSENTRY32
pe.dwSize = pe.SizeOf
If g_dw.Process32First(hSnapProcess, pe.AddressOf) = C_FALSE Then
WScript.Echo "Process32First() Error"
WScript.Echo "GetLastError() = " & g_dw.GetLastError()
WScript.Quit -1
End If
Dim Procs
Set Procs = CreateObject("Scripting.Dictionary")
Do
If pe.th32ProcessID <> CurrentProcessId Then
Dim Proc
Set Proc = New Proc
Proc.Id = pe.th32ProcessID
Proc.Name = pe.szExeFile
Procs.Add Procs.Count, Proc
End If
Loop Until g_dw.Process32Next(hSnapProcess, pe.AddressOf) = C_FALSE
Set GetProcs = Procs
End Function
Class Proc
Public Id
Public Name
End Class
>>管理人むたぐち さん 2006年 03月 04日 15時 44分 02秒
>定数を調べて自分で書く、あるいはソフトの補完機能を使って書く
そうそう。後で気付いたのですが、やはりCプログラミングとの意識の違いがあるのかも。
Cでは色々なプログラムで共通に使う定数等を個々のソースファイルに書くということは考えられないんです。そういうことをすると百害あって一利なしなので・・・
VB系ではインタープリタだったりするので巨大なヘッダファイルをインクルードすることが現実的でないのでしょうが、Cプログラマはみんなインクルードが無いと戸惑うみたいですね。
先日、dxfファイル(cadデータ)を読み込んで、読み込んだ文字列を
置換したいという質問を投稿しました、たけです。
プログラムがうまくまわらなかった問題は、dxfファイルの改行コードが「cr」だったためということが
わかったのですが、改行コードの変換がうまくいきません。
「cr」を「cr+lf」に変換したいのですが、何かうまい方法は
ないでしょうか?調べてみたところcreateTextNodeメソッドが使えそう
だったのですが、方向性としてあっているのでしょうか?
知らない事ばかりのwsh初心者ですが、どうかご教示お願いします。
Set inFile = fso.OpenTextFile(FileName)
Set outFile = fso.CreateTextFile(FileNameout)
Do Until inFile.AtEndOfStream
tempLine = inFile.ReadLine
Set newItem = document.createTextNode(Replace(templine,vbCr,vbCrLf)outFile.WriteLine newItem
Loop
んで、本題の方はこちらが参考になるでしょう。
Doctor Scripto のスクリプト ショップ 午前 2 時、プロセスの所在を把握していますか
http://www.microsoft.com/japan/technet/scriptcenter/resources/scriptshop/shop0505.mspx
Doctor Scripto のスクリプト ショップ 午前 2 時、プロセスの所在を把握していますか - 続編
http://www.microsoft.com/japan/technet/scriptcenter/resources/scriptshop/shop0605.mspx
そういや、どこかでもっと確実に検知する方法を見た覚えがあるんですが
どこだったかな?事前に SINK に登録してやることがひつようだったような
記憶が・・・
To ジャンクションターミナル さん 2006年 03月 17日 15時 45分 45秒
To 管理人むたぐち さん 2006年 03月 17日 14時 45分 46秒
> XPの問題だとすればWindowsファイアウォールくらいしか
> 思い浮かばないのですが、その設定はどうなっているでしょうか。
環境によってはいろいろ問題がありますね。
とはいえ、ほとんど Network がらみです。
まず、WMI にしたって、WSH Remote にしたって、DCOM を呼び出している
わけであって、この DCOM を呼び出すのに使用されるのが MSRPC です。
Port の要件としては、EPMAP(End Point Mapper 135) のほかに
FTP みたいに Session をはる任意の Port を使用します。
# registry を変更することによって、限定することは可能です。
でもこれだけでは不十分で、MSRPC を利用するには双方で
名前解決できていないとなりません。
# 重要です。一方向でも、IP address を直接指定しても NG
名前解決の手段は、SMB(Wins, Broadcast), DNS, hosts, lmhosts
どれでも OK です。
それから、もちろん DCOM の access 許可を適切に構成してやることも
必要です。
Windows XP SP2 の WMI に関する問題のトラブルシューティング方法
http://support.microsoft.com/kb/875605/ja#6
Windows Management Instrumentation の秘密
http://www.microsoft.com/japan/technet/scriptcenter/resources/wmifaq.mspx
管理人様、アドバイスありがとうございます。
XPへの移行時はDOS窓で"wscript -regserver"を叩いただけでした。
あれから試行錯誤し、とりあえずwscript.exeをkillさせました。
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'wscript.exe'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
それでも同期を取れないのでwscript.sleepで時間を調整しました。
XPでWSHを使うのはまだまだ難しいです。ありがとうございました。
ファイアウォールかどうかはわかりませんが、Win2000からXPの共有フォルダ(権限は777)にファイルをコピーするスクリプトを、XP側からWin2000にあるファイルを取りに行く形に変えるとうまくいきました。
To: ジャンクションターミナル さん
WshRemoteって今まで動作しなくて困っていたのですが、
DCOMの設定で、「接続」「セキュリティ」タブは既定のままでいいが、
「識別」or「ID」タブで、「このユーザー」を指定し、サーバー側の
アカウントのユーザー名とパスワードを入れる必要がある、ということが
ようやく分かり、無事リモートでスクリプトを実行させることができました。
(3年くらい抱えていた謎がようやく解けた!)
で、本題ですが、同様にXP→2000の環境を作って動作させてみたところ
正常動作しました。サーバー側(2000)にはwscript.exeのプロセスが
一つ立ち上がり、実行終了とともに消えました。
なので原因がよくわかりません。XPの問題だとすればWindowsファイアウォール
くらいしか思い浮かばないのですが、その設定はどうなっているでしょうか。
リモートオブジェクトのExecuteを使い、Windows2000proからWindowsXPproに入れ替えたらリモートスクリプトが正しく動かなくなりました。
遠隔操作を行うマシンがXP、操作されるマシンがwin2000です。
以前はともにwin2000同士で問題ありませんでしたが、XPからスクリプト開始の合図を受けた対象ホスト側で、スクリプトが正常終了しないのです。
ホスト側でスクリプトが開始されるとプロセス一覧にwscript.exeが2つ加わります。コードが最終行まで処理されるとwscript.exeのうち1つは消えるのですが、もう一つのwscript.exeがプロセス上から消えません。
終了通知が来ないのでXPマシンはタイムアウトしてしまいます。
環境は全てIE6.0sp1です。
よろしくお願いいたします。
To: yoshi さん
Fs.GetFolder("\\IPアドレス指定\share")をしたらうまくいくと
いうことは、やはりMapNetworkDrive時には何らかの事情でスクリプトから
共有がうまく見えてないことがあるのでしょうね。
ホスト名じゃなくIPアドレス指定でうまくいくというのは、
ちゃっぴさんもおっしゃるように何らかの事情で名前解決が
一時的にうまく行ってないためだと思います。
不安定な動作の根本解決には、名前解決を解決することだと思います。
ですがこれはWSHの話を超えてしまうのでここではこれくらいに
しておきます。(私も分からないですし)
strShareをConstで規定するより、strShare=Fs.GetFolder("\\IPアドレス指定\share")でだと接続成功する様になりました。
ありがとうございました。
コンピュータ名で指定した場合でもE:に手動で割り当てた後、F:にWSHでマップすると接続します。
このリモートPCは、ユーザ名、パスワードも設定しておりませんが、一方、認証が必要なリモートPCへは、L12のやり方で一度もアクセス拒否はありませんが、この辺りの影響はあるのでしょうか?
むたぐちさん、ご回答ありがとうございます。
返事が遅くなって申し訳ございません。
Netdomコマンドを調べてみます。
有益な情報ありがとうございました。
To yoshi さん 2006年 03月 14日 22時 25分 38秒
単に名前解決しくじっているだけじゃないの?
名前解決になにを利用しているか知りませんが、
DNS?, WINS?, NET BIOS(Broad Cast)?, hosts?, lmhosts?
解決できていないでしょ。
とりあえず、"nslookup" And "nbtstat" で名前解決できるかどうか
確認してください。
むたぐち さん
早速のアドバイスありがとうございます。
以下の状況で、原因不明ながら何とかなりそうな・・・
IPアドレスでの指定だと何とか動きそう。
strShare=
\\Server\Share \\IPアドレス\Share Fs.GetFolder("\\IP\share")
-------------------------------------------------------------------
手動 接続OK 接続OK ------------
割当
手動割付
切断直後 アクセス拒否 OK OK
WSH
手動割付
切断1Hr後 アクセス拒否 アクセス拒否 OK
WSH
再起動
手動割付なし アクセス拒否 アクセス拒否 OK
でWSH
再起動、手動割付なしでstrShare=Fs.GetFolder("\\IP\Share")
を明日、テスト予定です。
WNETAPIでもやってみなしたが、WSHと同じく \\IPアドレスだと切断直ぐ
ではOKでした。\\Saverは拒否
エクスプローラダイアログからだと\\SarverでもOKなんですが・・
>超初心者 さん 2006年 03月 14日 18時 59分 34秒
'---------------------------------------------------------------------------
'現在のコンピュータを指定
strComputer = "."
'WMIを使用
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
'Win32_Printerクラスからプリンタのコレクションを取得
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer")
For Each objItem In colItems
WScript.Echo "名前: " & objItem.Name
WScript.Echo "コメント: " & objItem.Comment
WScript.Echo "ポート名: " & objItem.PortName
WScript.Echo "ドライバ名: " & objItem.DriverName
Next
'---------------------------------------------------------------------------
場所の意味がよくわかりませんが、ポートが知りたいと言うことでしょうか。
モデルはドライバ名がわかればわかるでしょう。
コメントを取得できるのはWinXP以降からです。
Win2000上ではエラーになります。
はじめまして。WSH超初心者です。
実行したコンピュータ(Windows2000)に登録されているプリンタの一覧(名前、コメント、場所、モデル)をWSHで表示するには、どのようにしたら良いのでしょうか。
ご存知であればご教授下さい。
よろしくお願い申し上げます。
To: yoshi さん
仮想環境を駆使し、
WS2003, XP Pro, XP Home, 2000などを使って幾通りか相互に
割り当てをしてみたのですが、一件だけ、拡張エラーというのが出て、
ドライブにマップされていないのに共有された状態(アクセスはできない、
EnumNetworkDrivesで共有ドライブ名が空白になった状態)になり、
切断もできないという最悪状態に陥ったものがありましたが、
それ以外は通常どおりでした。
# これは別件として今後検討しなければならない問題ですが、ここではおいといて。
yoshiさんの言われるような問題は特におきないようです。
ただ、なんとなくですがMapNetworkDriveは「アヤしい」のかもしれませんね、
さっきの例もあることですし。
とにかくうちでは再現性がとれなかったので何とも言えないのですが、
もしお時間ありましたらなら次のことを試してみてください。
1-1.共有フォルダを手動でエクスプローラで開いてみる
1-2.MapNetworkDrive
もしこれが可能なら
2-1.Fs.GetFolder("\\share\sharename")
2-2.MapNetworkDrive
これが可能ならGetFolderなどを実行することで、OSに共有フォルダがあることを
示せばよいことになります。
もしこれが2-1.の段階で不可能なら、スクリプトから共有フォルダが
見えてないことになります。ほかに対策を考えなければならないでしょう。
ネットワークドライブの割り当てに関するトラブルです。
他のPCの共有フォルダにMapNetworkDriveで繋ごうとしたところ、アクセス拒否になる場合があります。
1.エクスプローラからドライブ割り当てを手動で行うと繋がる。
2.1で繋いだ後、同じく切断して、1、2分後ならWSHでマップしても
アクセス拒否にならない。
3.5分、10分後にWSHでマップしょうとするとアクセス拒否。
※WSHプログラムは、ここの講座L12に沿って記述しおります。
何故、手動で一旦繋いで切断後、直ぐの場合はマップが出来て、時間が経つと同じWSHプログラムでもアクセス拒否になるのか?対応策などお教え戴ければ助かります。
OSは、先方、当方共 WINDOWS2000です。
To: かえる さん
> Win2000のPCをドメイン参加させる事が可能なメソッドをご存知であれば、教えて頂けないでしょうか?
Netdomコマンドというのを使えば可能なのだそうです。
WshShell.Runで呼び出してやるといいでしょう。
詳しくはこちら。
w2k:ネットワーク
http://homepage2.nifty.com/winfaq/w2k/network.html#1097
To: 初心者 さん
> 第二引数のStartTimeで年月日を指定することができず困っています、、
Create Method of the Win32_ScheduledJob Class
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/create_method_in_class_win32_scheduledjob.asp
に、
StartTime
[in] Universal Time Coordinate (UTC) time to run a job. The form must be: "YYYYMMDDHHMMSS.MMMMMM(+-)OOO", where "YYYYMMDD" must be replaced by "********".
と書いてあるので日付の指定はできないんじゃないかと思います。
ATコマンドの仕様ですね、たぶん。
少し前に話題になった、schtasks.exeを使ってみるとよいかもしれません。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list153.shtml
Win32_ScheduledJobによりタスクスケジュールを登録したいのですが、
Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create("D:\test.bat", "********182000.000000+540", false ,, ,true , JobID)
第二引数のStartTimeで年月日を指定することができず困っています、、
解決方法は無いでしょうか?誰かご教授願います。
はじめまして。
Win2000のパソコンをドメイン参加させるスクリプトを作成しようと調べています。XPの場合であれば、JoinDomainOrWorkGroupを使用することによりドメイン参加が可能なことは分かりましたが、2000はJoinDomainOrWorkGroupは対応しておらず、ドメイン参加させることが可能なメソッドが見つかりませんでした。
Win2000のPCをドメイン参加させる事が可能なメソッドをご存知であれば、教えて頂けないでしょうか?