管理人むたぐち さん 2005年 05月 27日 13時 39分 00秒

こんなのを書きました。
二つのフォルダに一つずつしかないファイルを消すスクリプト
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/src/del_synch.zip
xcopyの/uオプションの逆です。

フォルダの同期などに、結構使えるんじゃないでしょうか。

ばんのしゃーによかばんた さん 2005年 05月 26日 18時 13分 42秒

>ばんのしゃーによかばんた さん 2005年 05月 25日 14時 50分 03秒
>逆(ShortPathName->LongPathName)はないもんでしょうか。なんか難しそう。

CreateObject("Shell.Application").NameSpace(Left(ShortPathName,InStrRev(ShortPathName,"\"))).ParseName(Mid(ShortPathName,InStrRev(ShortPathName,"\")+1)).Path

ですね。

vbs初心者 さん 2005年 05月 26日 10時 07分 21秒

魔界の仮面弁士さん
ご教示ありがとうございました。

下記のようにコーディングしてみました。
何か問題があればご教示お願いします。
*******************************************************
  Dim Cn
  Dim Stm
  Dim UdlFilePath
  Dim DataLnk
  UdlFilePath = "C:\Documents and Settings\muser\デスクトップ\OraCon.udl"
  Set Cn = CreateObject("ADODB.Connection")
  Set DataLnk = CreateObject("DataLinks")
  Set Stm = CreateObject("ADODB.Stream")  
  Stm.Open
  Stm.LoadFromFile UdlFilePath
  Stm.Position = 128
  Cn.ConnectionString = Stm.ReadText(adReadLine)
  DataLnk.PromptEdit(Cn)
  MsgBox Cn.ConnectionString
  Stm.Close
  Set Stm = Nothing
  Set DataLnk = Nothing
  Set Cn = Nothing

ちゃっぴ さん 2005年 05月 25日 20時 09分 55秒

To bia さん 2005年 05月 25日 19時 18分 08秒

> 結局、接続しにいくときのアカウントとパスワードの記述方式
> を変えたところ、処理を通りました。

どういう風に変更したかを書いていただけると
同様の問題で悩んでいる人の助けになると思います。
# 個人的にも興味がありますので・・・

bia さん 2005年 05月 25日 19時 18分 08秒

Toちゃっぴ さん
To管理人 さん


遅くなりましたが2005年 05月 20日 10時 12分 37秒の書込み
についてですが解決しました。

結局、接続しにいくときのアカウントとパスワードの記述方式
を変えたところ、処理を通りました。

どうもありがとうございました。

ばんのしゃーによかばんた さん 2005年 05月 25日 14時 50分 30秒

>ばんのしゃーによかばんた さん 2005年 05月 23日 17時 30分 10秒
>HTAやjavascript:には、いろいろ癖(undocumented specification)があるようで、
>なかなか通して貰えません。やっと上で許して貰いました

いろいろ試行錯誤して、結局、過去記事を忘れていただけでした。

>管理人むたぐち さん 2005年 03月 08日 23時 20分 14秒
>MSHTAにあまり長いオプションをつけるとダメってことなのかもしれません。

やはり、無駄に労力と時間を消耗したくなかったら、
|ばんのしゃーによかばんた さん 2005年 05月 21日 15時 19分 25
|過去記事を検索せよ。過去記事を見よ。
ですね。

正確には、両端の引用符を含めて、511バイトの制限があって、
それを超えるとダンマリになるようです。
511はPATH_MAXとかの数字でしょうか。
2のべき乗の512からNull Terminateを引いた数。

しかし、ダンマリはやめて欲しいです。>MS

で、こういう書き方も出来ます。
――――――――――――――――――――――――――――――――――――――
MSHTA.EXE "javascript:'<head><title>Enter Password</title><script>resizeTo(220,80);moveTo((screen.availWidth-220)/2,(screen.availHeight-80)/2);function Enter(){new ActiveXObject(\'Scripting.FileSystemObject\').GetStandardStream(1).Write(PW.value);close();}function KeyPress(){if(event.keyCode==13)Enter();}</script></head><body bgColor=menu scroll=no onload=PW.focus()><input type=password id=PW onkeypress=KeyPress()>&nbsp;<input type=button id=OK value=&nbsp;OK&nbsp; onclick=Enter()></body>'" | more
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 05月 25日 14時 50分 03秒

>シーズー大好き さん 2005年 05月 24日 08時 39分 00秒
>私もブランクを含むフルパスを指定する方法が判らなかったので、思いついたのが、
>例えばC:\Program Files\Adobe\Reader以下を共有ディレクトリにして、自分の共有ディレクトリを自
>分でマウントするような形でアクセスすることが可能になります。
>WshShell.Run "\\192.168.1.100\Reader\AcroRd32.exe"

こういうのもあります。LongPathName->ShortPathName変換。

CreateObject("Scripting.FileSystemObject").GetFile(LongPathName).ShortPath

逆(ShortPathName->LongPathName)はないもんでしょうか。なんか難しそう。

ところで、文字列内での引用符の書き方について、どこに書いてあるのか
探してみると、そんじょそこらのヘルプには見つかりません。そんなぁ。:-<
やっと、VBで以下を見つけましたが。これは問題です。>MS
――――――――――――――――――――――――――――――――――――――
文字列型 (String) の変数にリテラルを代入する場合は、二重引用符 ("") で囲む必要があります。よって、リテラル自体に二重引用符が含まれる場合は、問題を生じることもあります。たとえば、次のコードはコンパイラ エラーになります。

Dim myString As String
myString = "He said, "Look at this example!"" ' This causes an error.
このコードがコンパイラ エラーになるのは、2 番目の二重引用符で文字列が終了していると見なされ、残りの文字列が処理されないためです。リテラル文字列の中で二重引用符を使用する場合は、二重引用符を 2 つ続けて使います。次の例は、文字列に二重引用符を含める正しい方法を示しています。

Dim myString As String
' The value of myString is: He said, "Look at this example!"
myString = "He said, ""Look at this example!"""
上の例の "Look" という単語の前の 2 つの二重引用符は、実際の文字列では 1 つの二重引用符です。行末の 3 つの二重引用符は、文字列内の 1 つの二重引用符と文字列の終了文字を表しています。
――――――――――――――――――――――――――――――――――――――


魔界の仮面弁士 さん 2005年 05月 25日 10時 57分 27秒

》vbs初心者 さん 2005年 05月 25日 10時 49分 06秒
> DataLnk.PromptEdit(Cn)
これは、Connectionオブジェクトの編集を行うものであって、
UDLファイルの編集を行うものではありませんよ。

> 直接OraCon.udlを直すしかないのでしょうか?
それでも良いですが、とりあえずは、
 UdlFilePath = "C:\〜〜\OraCon.udl"
 CreateObject("WScript.Shell").Run """" & UdlFilePath & """", 1, True
でも十分だと思いますよ。


もしも直接編集が必要なら、下記が参考になるかも知れません。
VBのコードですが、VBSにも応用できるでしょう。

http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200505/05050105.txt
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200505/05050089.txt
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200505/05050074.txt

vbs初心者 さん 2005年 05月 25日 10時 49分 06秒

こんにちは。vbs初心者と申します。
質問ですが、vbsから呼び出したData LinkのPropertiesの修正を保存する仕方がわかりません。

デスクトップにOraCon.udlのudlファイルがあり、vbsで起動させて
呼出して、設定内容を変更します。
再度vbsでデスクトップにOraCon.udlを呼び出しますが、
先ほど編集した内容が反映されていません。
直接OraCon.udlを直すしかないのでしょうか?
ご教示宜しくお願いします。

******************* Code ***************************
Dim Cn
Dim Stm
Dim UdlFilePath
Set Stm = CreateObject("ADODB.Stream")
Stm.Open
UdlFilePath = "C:\Documents and Settings\muser\デスクトップ\OraCon.udl"
Stm.LoadFromFile UdlFilePath
Stm.Position = 128
Set Cn = CreateObject("ADODB.Connection")
Cn.ConnectionString = Stm.ReadText(adReadLine)
Dim DataLnk
Set DataLnk = CreateObject("DataLinks")
DataLnk.PromptEdit(Cn)
↑ここでData Link Properties設定画面が表示されますが、人がProviderや
Connectionを修正してOKで確定します。
Stm.Close
Set Stm = Nothing
MsgBox Cn.ConnectionString
Set DataLnk = Nothing
Set Cn = Nothing

ばんのしゃーによかばんた さん 2005年 05月 24日 16時 04分 40秒

>ばんのしゃーによかばんた さん 2005年 05月 18日 16時 10分 59秒
>>KEN さん 2005年 05月 11日 09時 59分 03秒
>>Set Win = CreateObject("Shell.Application")
>>Win.namespace(10).items.item.invokeverb "ごみ箱を空にする(&B)"
>>ただし、これですと削除確認のダイアログが出てしまいます
>こういう方法もあります。
>Set wShell=CreateObject("WScript.Shell")
>wShell.Run "MSHTA.EXE vbscript:Execute(""CreateObject(""""Shell.Application"""").NameSpace(10).Items.Item.InvokeVerb """"ごみ箱を空にする(&B)"""":close()"")"
>Do While Not wShell.AppActivate("の削除の確認")
> WScript.Sleep 100
>Loop
>wShell.SendKeys "y"

これは、MSHTA側で、Shell.Applicationを動かして、
WSH側で、WScript.Shell.SendKeysする、マルチプロセス制御ですが、
逆のパターンも同様に出来ます。

さて、次は、MSHTAではなく、IEを使ったマルチプロセス制御です。
――――――――――――――――――――――――――――――――――――――
Set wShell=CreateObject("WScript.Shell")
Set ie=CreateObject("InternetExplorer.Application")
ie.Visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 100
Loop
Set ie.Document.body.onload=wShell
ie.Document.parentWindow.execScript "Sub XXX():If document.body.onload.AppActivate(""の削除の確認"") Then:document.body.onload.SendKeys ""y"":Else:setTimeout ""XXX"",100:End If:End Sub:setTimeout ""XXX"",100:","vbscript"
CreateObject("Shell.Application").NameSpace(10).Items.Item.InvokeVerb "ごみ箱を空にする(&B)"
ie.Quit
――――――――――――――――――――――――――――――――――――――
IE側では、CreateObjectがインターネットのセキュリティレベルの設定で、
出来ないので、WSH側でCreateObjectを行って、便宜的にevent属性に設定して、
IE側に渡します。インターネットのセキュリティレベルでスクリプトを
禁止していても、WSH側から駆動する分には、スクリプトも動きます。

これは、WSH側でShell.Applicationを動かし、IE側でSendKeysしています。
逆のパターンはどうもうまく行きません。

MSHTAだと、出来ることは広いですが、制御が突き放しになります。
IEだと、出来ることは制限されますが、WSHから細かく制御できます。

なんか、スクリプトでマルチスレッド処理をしているような感じでしょう?
IEを使って、マルチスレッド擬が出来るかも。


ばんのしゃーによかばんた さん 2005年 05月 24日 16時 04分 16秒

>ちゃっぴ さん 2005年 05月 23日 01時 51分 28秒
>こちらでも発生しました。(__)
>Win32_PrintJobのInstanceが2以上ないと取得できないって・・・

あれ、そうなんですか?
こちらでは、再現しなくなりました。
なので、勘違いだったのかも。ダブルクリックが利かったのかも。
と思い始めているところです。


ばんのしゃーによかばんた さん 2005年 05月 24日 16時 03分 54秒

>いつも想定外 さん 2005年 05月 23日 11時 58分 15秒
>いろいろ検討しましたが、Passwd等だけでなくプログラム自体を
>あまり見られたくなかったので、今回はVBで作成し、exeファイルに
>することにいたします。

うーん、何か変。
ちょこっと不快感を表明してよろしかったでしょうか?
聞く耳/気がないなら聞くな。と言いたくなります。
こちら不快感のほうになります。

戯言は扨措き、話をちゃんと理解した上で、「いろいろ検討しました」と
言ってるのか、甚だ疑問。

例えば、3案とも、プログラムまで、エンコードしてます。

それに「VBで作成し、exeファイルに」しても、文字列はそのままunicodeで
入るだけなので、素人でも「メモ帳」で開く(Notepad.exe /w exeファイル)だけで
簡単に見えちゃいます。第1案のほうがまだまし。それに簡単だし。

エンコードした文字列を埋め込んで、実行時にデコードするようにしないと
丸見えです。

VBでのエンコード/デコード方法は知りませんので、VBの専門家の
魔界の仮面弁士 さんに聞いてください。
それとも、暗号の専門家のつちや さんかな。

私が思い付くのは、第2案がやっているように、
第1案のスクリプトエンコーダでスクリプトをエンコードして、
VBソースに埋め込み、実行時にScriptControlに投げる、
くらいですね。


管理人により削除 さん (管理人により削除) 2005年 05月 24日 14時 56分 30秒
URL:管理人により削除

管理人により削除

管理人むたぐち さん 2005年 05月 24日 11時 31分 07秒
URL:http://www.microsoft.com/downloads/details.aspx?FamilyID=d187c9d7-ffa8-49cd-bb33-363db8fa481e&displaylang=en

某所で見つけたのですが、Script Centerにあるスクリプトファイルを、そのままローカルにダウンロードするツールが公開されました。
http://www.microsoft.com/downloads/details.aspx?FamilyID=d187c9d7-ffa8-49cd-bb33-363db8fa481e&displaylang=en

こちらに詳細が日本語で紹介されています。
http://diary.jp.aol.com/zmenpt/370.html

vagabond さん 2005年 05月 24日 11時 03分 21秒

To シーズー大好きさん

なるほど。共有すれば確かに、ロングファイルネームじゃなくせますね。
ただこちらはセキュリティの観点から共有サービスを無効にしていますので、その「苦肉の策」が取れませんが・・・

そして、あまり時間もかけてられないので、検知部分とロック解除部分をそれぞれVBSとCMDに分け、問題回避しました。
本件はこれで解決とさせて頂きます。

皆様、ありがとうございました。


シーズー大好き さん 2005年 05月 24日 08時 39分 00秒

To:vagabondさん

根本的な解決にはなりませんが、ここの部分だけ苦肉の策がございます。
>WshShell.Runの引数は""で括る必要があるはずですが、実行したいコマンド文に、既に
>「"」とか「\」が含まれていて、どのように記述すれば正しく動くのか、よく分かりません。
>単にロングファイルネームのパスを実行したい時は、
>WshShell.Run """C:\\Program Files\\Adobe\\Reader\\AcroRd32.exe"""

私もブランクを含むフルパスを指定する方法が判らなかったので、思いついたのが、
例えばC:\Program Files\Adobe\Reader以下を共有ディレクトリにして、自分の共有ディレクトリを自分でマウントするような形でアクセスすることが可能になります。
WshShell.Run "\\192.168.1.100\Reader\AcroRd32.exe"
(自ホストに静的アドレスを設定していることが必要ですが)

以上、横槍入れました。

XP さん 2005年 05月 23日 22時 16分 03秒

webのPassword解析プログラムが欲しいので、作ってもらえませんか? お願いします。

管理人により削除 さん (管理人により削除) 2005年 05月 23日 21時 40分 16秒
URL:管理人により削除

管理人により削除

ばんのしゃーによかばんた さん 2005年 05月 23日 17時 30分 10秒

バッチファイルで(ちょっと長い)1行インラインスクリプトでパスワードプロンプト。
――――――――――――――――――――――――――――――――――――――
MSHTA.EXE "javascript:var W=220;var H=80;resizeTo(W,H);moveTo((screen.availWidth-W)/2,(screen.availHeight-H)/2);function Enter(){new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(PW.value);close();}function KeyPress(){if(event.keyCode==13)Enter();}function window.onload(){document.body.bgColor='menu';document.body.scroll='no';document.title='Enter Password';PW.focus();}'<input type=password id=PW onkeypress=\'KeyPress()\'>&nbsp;<input type=button id=OK value=\' OK \' onclick=\'Enter()\'>'" | more
――――――――――――――――――――――――――――――――――――――
HTAやjavascript:には、いろいろ癖(undocumented specification)があるようで、
なかなか通して貰えません。やっと上で許して貰いました。

MS FormsのTextBoxを使ったパスワードプロンプト。
――――――――――――――――――――――――――――――――――――――
<html>
<body onload='TextBox.PasswordChar="*"'>
<object id="TextBox" CLASSID="CLSID:8BD21D10-EC42-11CE-9E0D-00AA006002F3">
</object>
<BUTTON onclick="VBScript:MsgBox TextBox.Value">OK</BUTTON>
</body></html>
――――――――――――――――――――――――――――――――――――――
PasswordCharを
<PARAM NAME="PasswordChar" VALUE="*">
と指定すると、TextBoxが表示されなかったり、異常終了したり、変です。


ばんのしゃーによかばんた さん 2005年 05月 23日 17時 29分 48秒

WSHでは、異常終了しても、ExitCodeは、正常終了と同じ、0です。

それでは、ちょっと困ることもあるので、以下のparadigmを考えてみました。

a.vbs
――――――――――――――――――――――――――――――――――――――
class x
sub class_terminate()
wscript.quit err.number
end sub
end class
set xx=new x

hogehoge '例えばここでエラー13発生
――――――――――――――――――――――――――――――――――――――
コマンドプロンプトで、
cscript a.vbs
echo %errorlevel%

ここで、echo %errorlevel% を一々入力するのは面倒なので、

!.CMD
――――――――――――――――――――――――――――――――――――――
@%*
@echo リターンコード (ERRORLEVEL) : %ErrorLevel%
――――――――――――――――――――――――――――――――――――――
を作っておくと、

! cscript a.vbs

または、

cscript a.vbs
!

で済みます。


vagabond さん 2005年 05月 23日 15時 32分 22秒

To ちゃっぴさん

早速のお返事ありがとうございます。
検知部分のソースを参考にし、条件が合えば"WshShell.Run"でドメインアカウントのロックアウトを解除するスクリプトを作ってみました。
しかし最後のツメの部分が分からず・・・再度ご教示下さい。

WshShell.Runで実行したいコマンドは、以下の行です。
runas /user:ドメイン名\管理ユーザー名 "net user %1 /active /domain"

WshShell.Runの引数は""で括る必要があるはずですが、実行したいコマンド文に、既に「"」とか「\」が含まれていて、どのように記述すれば正しく動くのか、よく分かりません。
単にロングファイルネームのパスを実行したい時は、
WshShell.Run """C:\\Program Files\\Adobe\\Reader\\AcroRd32.exe"""

こんな記述で良いのは知ってるんですが・・・
ご助言下さい。宜しくお願いします。



シーズー大好き さん 2005年 05月 23日 15時 08分 34秒

むたぐち様

お調べいただきありがとうございます。
やはりバグだったんですね。
その後上司と相談し、結局Windows2000で動かすことにいたしました。
ありがとうございました。

ちゃっぴ さん 2005年 05月 23日 12時 17分 37秒

To vagabond さん 2005年 05月 23日 10時 50分 04秒

とりあえず、Lockoutの検知部分だけ・・・

Const ADs_UF_LOCKOUT = &H10

Dim objUser   ' As ActiveDS.IADsUser
Dim strDomain  ' As String
Dim strUser   ' As String
Dim strADsPath ' As String

strADsPath = "WinNT://" & strDomain & "/" & strUser & ",user"
Set objUser = GetObject(strADsPath)

If objUser.Get("UserFlags") AND ADs_UF_LOCKOUT Then
  WScript.Echo "Lockout"
Else
  WScript.Echo "No Lockout"
End If
Set objUser = Nothing

Password Never Expires (WinNT Provider)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/winnt_password_never_expires.asp

ADS_USER_FLAG_ENUM
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/ads_user_flag_enum.asp

検証してないのであしからず・・・

いつも想定外 さん 2005年 05月 23日 11時 58分 15秒

みなさま
ご返答有難うございます。

今回vbsファイルを使用するユーザが、あまりコンピュータに
詳しくない方のため、出来るだけ簡単(vbsファイルをダブルクリック)
な方法で使用させたいと思っておりました。
いろいろ検討しましたが、Passwd等だけでなくプログラム自体を
あまり見られたくなかったので、今回はVBで作成し、exeファイルに
することにいたします。

いろいろと有難うございました。また宜しくお願いたします。

vagabond さん 2005年 05月 23日 10時 50分 04秒


こんにちは。

板違いのような気がしますが、質問させてください。
「ドメインアカウントのロックアウトを、管理者が簡単に解除出来るスクリプト」を作ろうと思ってます。
ただし、ロックアウト解除のオペレーションは、ドメインコントローラ上で行なうのではなく、ドメイン参加しているPCからコマンドを使って操作するイメージで考えています。
ちなみに、ドメコンはWindows2000AdvancedServer、操作PCはWindows2000です。
最初に思いついた方法は、

runas /user:ドメイン名\管理ユーザー名 "net user %1 /active /domain"

こんな感じのバッチファイルを作っておき、手順としては、
1. cmd.exeを起動しておく。
2. 作ったバッチファイルをコマンドプロンプトウィンドウにドラッグ&ドロップ
3. 半角スペース+ロックアウトされたドメインアカウント名と入力し、Enter
(最終的には、"バッチファイルのフルパス ロックアウトアカウント名"という形の実行文になる)
4. 管理ユーザーのパスワードを入力 → ロックアウト解除

大まかにはこんな流れで考えていたのですが、ちょっと問題がありまして。
ドメインアカウントには[有効][無効][ロック]の3つの状態がありますが、"net user %1 /Active /domain"だと、どの状態でも強制的に[有効]にしてしまうのです。
3.の手順で、確実に正しいドメインアカウント名を入力すれば良いのですが、実際には多数のユーザーを管理していますので、アカウントは数字を中心に構成されており、時には間違えるかもしれません。
もし入力間違いをしてしまい、たまたまそのユーザーが管理的な理由で[無効]にされていたら・・・
強制的に[有効]にしてしまうので、管理側としてこれはちょっとまずく、このような事態は避けねばなりません。
なんとか、ユーザーアカウントが[ロック]の時だけロックアウト解除が働くような仕掛けに出来ないものかな?と考えました。
Win2Kリソースキットで"cusrmgr.exe"という、ロックアウト解除用のオプションを持つコマンドを見つけたのですが、ドメインに対応していないのか、うまく動きません。
Win2Kやリソースキットのコマンド、VBS、WSH、方法は何でもかまわないのですが、Win2Kの端末上から直接実行出来て、かつアカウントが[ロック]の時だけ動作するような方法は無いものでしょうか?

最後に、今回作ったバッチファイル全文を載せます。
ちなみに"choice.exe"は、Win2Kリソースキットに付属している、Win98時代の同コマンドと同様に使えるものです。
======================================================================

Echo off
rem === アカウントロック解除スクリプト ===

:menu
If "%1" == "" (
Echo ユーザー名を入力して下さい。
pause
goto answer3
)

cls
Echo -------------------------------------
Echo 1. [%1] のアカウント状態確認
Echo 2. [%1] のアカウントロック解除
Echo 3. 何もせずに終了
Echo -------------------------------------
choice いずれかを選択して下さい。 /C:123
goto answer%ERRORLEVEL%
goto menu

:answer1
net user %1 /domain
pause
goto menu

:answer2
runas /user:ドメイン名\管理ユーザー名 "net user %1 /active /domain"
Echo アカウントロックが解除されました。
pause
goto menu

:answer3

======================================================================

ちゃっぴ さん 2005年 05月 23日 01時 51分 28秒

To ばんのしゃーによかばんた さん 2005年 05月 22日 16時 37分 03秒

> やってみましたが、
> シングルで監視すると、捕捉出来ず。
> 2重起動すると、両方で捕捉する。
> ような感じ。

こちらでも発生しました。(__)
Win32_PrintJobのInstanceが2以上ないと取得できないって・・・
昔、書いたSourceを覗いたら、ボーリングで
Win32_PrintJobのInstance数監視するなんて
馬鹿なことやってました・・・(ーー;)

> のファイルの所有者を別Userにして、
>アクセス制限しないといけませんが、
> それでも、
>> 危なくてしかたありません。

です。Passwordを記述するということは、
何かの拍子に覗かれることもありますし・・・

> Windowsでは、Taskを別マシンの別User権限で実行したり、
> ファイルの所有者を別マシンの別Userにして、
> アクセス制限を掛けたりとか、出来るんでしょうか?

WorkGroup環境の話ですか?
WorkGroupの場合、User AccountはそのComputerに
限り有効ですのでもちろんできません。
ただ、双方のAccountとPasswordを完全に一致させれば、
認証はSkipできますのでそれを利用してやることも有効でしょう。

Domainを構成している環境ならDomain Userは当然扱えます。

シュン さん 2005年 05月 22日 21時 47分 47秒

To 管理人さん
わかりました、出直して来ます。

管理人むたぐち さん 2005年 05月 22日 21時 40分 17秒

To: シュン さん

ここはWindows Scriptをテーマとした掲示板ですので、ここで基本的なことを一から十まで解説することは避けたいと思います。
なのである程度、ご自分で勉強なさってから、再度分からない点を質問していただきたいと思います。

シュン さん 2005年 05月 22日 20時 51分 43秒

To 管理人さん
>「とりあえず、msgboxをWScript.Echoに置換して、cscript.exe(コマンドライン)で実行させれば」って、僕はまったくわからないのでやり方を教えてください・・・。
 

ばんのしゃーによかばんた さん 2005年 05月 22日 19時 04分 38秒

>ちゃっぴ さん 2005年 05月 21日 15時 46分 14秒
>WMI使ってこういう方法も・・・
>速度が遅いのがちょっと・・・

確かに遅いですね。

>管理人むたぐち さん 2005年 05月 20日 15時 50分 47秒
>> ところで、デフォルトプリンタ名を知る方法ってなかったでしょうか?
>HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windowsキーの
>Deviceという名前の値を読めば良さそうです。(WinXP)
>余計な文字列がついているので、適当にomitしてください。

こんな感じ。これが一番軽いかな。

MsgBox Split(CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"),",")(0)

他に、
MsgBox Split(CreateObject("Excel.Application").ActivePrinter," on ")(0)

MsgBox Split(CreateObject("Word.Application").ActivePrinter," on ")(0)
も。でも、ちょっと重い。

うーん、どれも、汎用性に問題ありそうですね。

98/ME/(2000は同じ?)のレジストリ位置さえ分かれば、
やっぱりレジストリが一番かな。


ばんのしゃーによかばんた さん 2005年 05月 22日 19時 03分 44秒

>いつも想定外 さん 2005年 05月 22日 02時 33分 23秒
>vbsファイルの中にサーバへ接続するIDとPasswdが埋め込まれていて
>可能な限りvbsファイルの中身を見せたくないのですが。。。。

スクリプトレベルでよければ、

>ばんのしゃーによかばんた さん 2005年 04月 13日 15時 52分 24秒
>スクリプトエンコーダのサンプルです。
>過去に"SCRENC.EXE"を使った例がありましたが、
>"Scripting.Encoder"を使ったものがなかったので。
>.VBSファイルをドロップします。
>VBS2VBE.VBS

バイナリ風がよいなら、

>ばんのしゃーによかばんた さん 2005年 04月 13日 15時 52分 08秒
>"Scripting.Encoder"でエンコードして、Escapeして、埋め込み、
>実行時はunescapeして、SC.Language='VBScript.Encode'で
>スクリプトコントロールに投げます。
>' vbs2jse.VBS converts VBScript to JScript.NET with VBE.

どちらも暗号化ではないので、暗号化がお望みなら、

>つちや さん 2005年 04月 11日 14時 56分 46秒
>唐突ですが、スクリプトエンコーダ作ってみました。スクリプトをD&Dすると実行ファイルを一つ作ります。スクリプトは実は暗号化されて実行ファイルにくっついているだけです。
>ファイル -> http://kajika.tk/fio/?%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9
>コメント -> http://d.hatena.ne.jp/Fio/20050411

――――――――――――――――――――――――――――――――――――――
>いつも想定外 さん 2005年 05月 22日 02時 33分 23秒
>vbsに読み取りと実行権がないとvbs自体を実行できません。
>しかし、そうするとvbsファイルの中身を見られてしまいます。

unixのsuidビットですね。

それに相当するのが、Windowsでは、
>ちゃっぴ さん 2005年 05月 22日 02時 58分 25秒
>Taskに登録して、別User権限で実行
ですが、

もし、
>その実行を行うUserが認証なしで
>Serverに接続できればなお良
でないと、
>Passwordを平文で埋め込むなんてことは、
のファイルの所有者を別Userにして、アクセス制限しないといけませんが、
それでも、
>危なくてしかたありません。
ということでしょうか? >ちゃっぴ さん

また、unixのsuidの場合、そのマシンに別Userがアカウントを持たないと
出来ませんが、Windowsでは、Taskを別マシンの別User権限で実行したり、
ファイルの所有者を別マシンの別Userにして、アクセス制限を掛けたり、
とか、出来るんでしょうか?


管理人むたぐち さん 2005年 05月 22日 17時 41分 40秒

うわ、何をやってるんだ私はw
↓は私です。

To: ばんのしゃーによかばんた さん さん 2005年 05月 22日 17時 41分 04秒

ちゃっぴさんのスクリプト、うちの環境では普通に動作しましたよ。(XP Pro)
念のためにXP HomeのPCでも試しましたが、やはりちゃんと動作しました。
たしかに少しもたつきますが…。

ばんのしゃーによかばんた さん 2005年 05月 22日 16時 37分 03秒

>ちゃっぴ さん 2005年 05月 20日 00時 34分 40秒
>WMIでPrinterJob StatusのEventを取得するってのはどうでしょう?

やってみましたが、
シングルで監視すると、捕捉出来ず。
2重起動すると、両方で捕捉する。
ような感じ。

WMIの監視って、期待通りに動かないような、何か変じゃありません?


ばんのしゃーによかばんた さん 2005年 05月 22日 16時 36分 42秒

>ばんのしゃーによかばんた さん 2005年 04月 11日 15時 18分 13秒
>一方、Nullは曲者ですね。
> x=Null
> If x="" Then
> If x<>"" Then
>はどちらもElseになります。知らないと苦労します。(しました。:-<)

例えば、
Join(Array(a,b,c,...))
なんてやるときに、中にNullが混じってると、Join()がエラーになります。

Join(Array(CStr(a),CStr(b),CStr(c),...))
なんてやって回避しようにも、CStr()がエラーになります。

JScriptなら、a?a:'' なんて書けますが、VBScriptでは。。。
If IsNull(a) Then aa="" Else aa=a
If IsNull(b) Then bb="" Else bb=b
繰り返し...
Join(Array(aa,bb,cc,...))
なんてやりたくありません。

そこでnullを無効化(nullify)します。?

例えば、
Function CNull(a)
If Not IsNull(a) Then CNull=a
End Function
を作って、
Join(Array(CNull(a),CNull(b),CNull(c),...))
とか、すればよいわけです。

しかし、もっと簡単に出来ました。

Join(Array(""&a,""&b,""&c,...))

――――――――――――――――――――――――――――――――――――――
& 演算子
解説
式 expression が文字列でない場合は、常に内部処理形式が文字列型 (String) に変換されます。両方の式が Null 値のときは、演算結果 result も Null 値になります。ただし、一方の式だけが Null 値のときは、長さ 0 の文字列 ("") として他方の式と連結されます。Empty 値を持つ式も、長さ 0 の文字列として扱われます。
――――――――――――――――――――――――――――――――――――――
だそうです。

なので、最初の例も、
x=Null
If ""&x="" Then
If ""&x<>"" Then
でそれぞれThen/Elseに流れます。


ばんのしゃーによかばんた さん 2005年 05月 22日 16時 36分 20秒

>ばんのしゃーによかばんた さん 2005年 05月 11日 18時 14分 47秒
>新規ワークブックにファイルをインポートしてMSCOMCTL.OCXを参照設定すれば動きます。

このオープンダイアログには、左にプレースバーがない!
あってもそれ程便利と思わなかったけれど、ないとなるととても不便です。
こういうときのために、初期フォルダ(マイドキュメント)に
プレースバーにあるものへのリンクを作っておくとよい哉。

――――――――――――――――――――――――――――――――――――――
話変わって、

VBAからだと、
ChDir "c:\vbs"
MsgBox Application.GetOpenFilename()
で初期フォルダを変更できますが、

WSHからだと、
Set Application=CreateObject("Excel.Application")
なんとか ChDir "c:\vbs"
MsgBox Application.GetOpenFilename()
というのは無理でしょうか?

Application.ExecuteExcel4Macro(String)でなんとかならんかと
思いましたが駄目みたいです。

――――――――――――――――――――――――――――――――――――――
また、話変わって、
Logoffスクリプトの代替で、Sub Auto_Close()を使う方法がありましたが、
試してみると、なんか出来なくなっているみたいです。
終了フェーズでは、WSHやCMD.EXEの新たな初期化が禁止されるようになった?
XPから? 代替方法は全滅かも。
VB FormのQueryUnload()を使うオーソドックスな方法も駄目です。
がっくり。

Logoffスクリプトがあるので、必要あるまいと、終了処理方式を変えた
のでしょうが、Home Editionには、Logoffスクリプトがないんだよ。>>MS

なんとか、レジストリをいじってLogoffスクリプトを動かすか、
他の代替方法を見つけねば。鬱。

終了処理を一旦キャンセルして、スクリプトを実行して、その後、同じ
終了モード(それが分かるだろうか?)を指定して再度、終了処理をキックする、
とか。


管理人むたぐち さん 2005年 05月 22日 10時 26分 47秒

To: シュン さん

> すいませんが、これを使えるようにしてもらえませんか?

英数小文字で表現できるすべての文字列を列挙するスクリプトのように
見えますが、これを「使えるように」とはどういう意味でしょうか?

とりあえず、msgboxをWScript.Echoに置換して、cscript.exe(コマンドライン)で
実行させれば、ものすごい勢いで文字列が表示されますが、
これって使えるようになったと言えるのかな?
あるいはFileSystemObjectのTextStreamを使ってファイルに書き出すとか…。
巨大なファイルになると思いますけど。

もしかしてパスワードクラッキングの素体かなんかでしょうかね。


To: ちゃっぴ さん

> Passwordを平文で埋め込むなんてことは、
> 危なくてしかたありません。

http://whereswalden.com/tech/internet/javacrypt/

ここにあるJAVACRYPTなどを使うといいかもしれません。
少なくとも平文ではない暗号化された文字列を埋め込むことができます。
もちろんクラックの可能性は皆無ではありませんが…。

ちゃっぴ さん 2005年 05月 22日 02時 58分 25秒

To いつも想定外 さん 2005年 05月 22日 02時 33分 23秒

Taskに登録して、別User権限で実行
その実行を行うUserが認証なしで
Serverに接続できればなお良

Passwordを平文で埋め込むなんてことは、
危なくてしかたありません。

いつも想定外 さん 2005年 05月 22日 02時 33分 23秒

非常に無知というか、無謀な質問なのですが、
vbsファイルのアクセス権をコントロールしたいのですが。。

vbsに読み取りと実行権がないとvbs自体を実行できません。
しかし、そうするとvbsファイルの中身を見られてしまいます。
vbsファイルの中にサーバへ接続するIDとPasswdが埋め込まれていて
可能な限りvbsファイルの中身を見せたくないのですが。。。。
何か良い方法はありますでしょうか。

やはり、

シュン さん 2005年 05月 21日 18時 56分 24秒

すいませんが、これを使えるようにしてもらえませんか?
'変数の宣言
Dim Cnt
Dim CntLEN
Dim CntWD
Dim PW_NUM(8)
Dim Num
Dim PW_LEN
Dim WORD()
Dim OUTFLAG
PW_LEN=8


PASSWORD=" 0123456789abcdefghijklmnopqrstuvwxyz"
ReDim WORD(Len(PASSWORD))
'PASSWORDの分離
For Cnt=1 to len(PASSWORD)
WORD(Cnt)=MID(PASSWORD,Cnt,1)
Next

'文字の初期化
For CntLEN=1 to PW_LEN
PW_NUM(CntLEN)=0
Next

'メイン処理
Do
For CntWD = 1 to Ubound(WORD)
PW_NUM(PW_LEN) = CntWD
PW=""
For Cnt=1 to PW_LEN
Num=PW_NUM(Cnt)
PW=PW & WORD(Num)
Next
msgbox(PW)
Next 'CntWD

'ケタ上がり
CntLEN=PW_LEN
Do
PW_NUM(CntLEN)=1
PW_NUM(CntLEN-1) = PW_NUM(CntLEN-1) + 1
If PW_NUM(CntLEN-1)>Ubound(WORD) then
CntLEN=CntLEN-1
If CntLEN=<1 Then
OUTFLAG=1
Exit Do
End If
Else
Exit Do
End If
Loop
Loop While (OUTFLAG<>1)

msgbox("END")

ちゃっぴ さん 2005年 05月 21日 15時 46分 14秒

To ばんのしゃーによかばんた さん 2005年 05月 21日 15時 19分 52秒

> ないのなら、作ってみようGetDefaultPrinter()関数。ただし、2000/XPのみ。

WMI使ってこういう方法も・・・

Function GetDefaultPrinterWMI()
  Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
  Set colItems = objWMIService.ExecQuery( _
    "SELECT Name FROM Win32_Printer WHERE Default = True", _
    "WQL", 48)
  For Each objItem In colItems
    GetDefaultPrinterWMI = objItem.Name
  Next
End Function

速度が遅いのがちょっと・・・

ばんのしゃーによかばんた さん 2005年 05月 21日 15時 20分 19秒

デフォルトプリンタのプリントキューのドキュメント数が2回変動したら、
印刷完了と見做す。

MSHTA.EXE printHTML.HTA htmlfile     (注)フルパスで指定。

printHTML.HTA
――――――――――――――――――――――――――――――――――――――
<html><head><hta:application id=hta><script language="VBScript">
Set Folder=CreateObject("Shell.Application").NameSpace(4)
Set FolderItem=GetDefaultPrinter(Folder)
Dim Jobs,Events

Sub window_onload()
argv=split(hta.commandline,"""")
If UBound(argv)>2 Then src=argv(3) Else src=Trim(argv(2))
dhtmled.loadDocument src
End Sub

Sub dhtmled_DocumentComplete()
Jobs=GetJobs(Folder,FolderItem)
dhtmled.printDocument
setTimeout "printComplete",100
End Sub

Sub printComplete()
Dim k
k=GetJobs(Folder,FolderItem)
If k=Jobs Then
 setTimeout "printComplete",100
Else
 Events=Events+1
 If Events=1 Then
  Jobs=k
  setTimeout "printComplete",100
 Else
  close
 End If
End If
End Sub

Function GetJobs(Folder,FolderItem)
GetJobs=Folder.GetDeTailsOf(FolderItem,1)
End Function

Function GetDefaultPrinter(Folder)
Dim k,Verb
For k=1 To Folder.Items.Count-1
 Set FolderItem=Folder.Items.Item(k)
 For Each Verb In FolderItem.Verbs
  If Verb.Name="通常使うプリンタに設定(&F)" Then Exit For
 Next
 If IsEmpty(Verb) Then Exit For
Next
Set GetDefaultPrinter=FolderItem
End Function
</script></head><body>
<object id="dhtmled" classid="clsid:2D360200-FFF5-11D1-8D03-00A0C959BC0A">
</object></body></html>
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 05月 21日 15時 19分 52秒

ないのなら、作ってみようGetDefaultPrinter()関数。ただし、2000/XPのみ。
――――――――――――――――――――――――――――――――――――――
Option Explicit

WScript.Echo GetDefaultPrinter()

Function GetDefaultPrinter()
Dim Shell,Folder,FolderItem,n,Verb
Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(4)
For n=1 To Folder.Items.Count-1
 Set FolderItem=Folder.Items.Item(n)
 For Each Verb In FolderItem.Verbs
  If Verb.Name="通常使うプリンタに設定(&F)" Then Exit For
 Next
 If IsEmpty(Verb) Then Exit For
Next
GetDefaultPrinter=FolderItem.Name
End Function
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 05月 21日 15時 19分 25秒

>endless さん 2005年 05月 19日 22時 46分 20秒
>RunasとSendKeysを使用してPowerUserでローカルのアドミン権限を使用し
>プログラムを実行したいのですが以下の記述では安定稼動しません
>5回に1回くらいしか正しくパスワードが入力されません
>と言うかSendKeysのEnter処理の前にDOS窓が閉じてしまいます
>DOS窓にメッセージが表示されているようですが速くて読み取れません

過去記事を検索せよ。過去記事を見よ。

――――――――――――――――――――――――――――――――――――――
>endless さん 2005年 05月 20日 00時 44分 41秒
>Taskに登録ですか?勉強不足で具体的にイメージできませんが
>いろいろ調べてみます。
>Sample等、ご教授いただければ幸いですが...
>宜しくお願いします。

過去記事を検索せよ。過去記事を見よ。


ちゃっぴ さん 2005年 05月 21日 12時 02分 29秒

To bia さん 2005年 05月 20日 10時 12分 37秒

> LDAPで接続はするのですが、どうしてもSetPasswordにてエラーが発生してしまいます。

IADsOpenDSO Object使って、通常と異なる資格情報で接続されていませんか?

IADsUser::SetPassword
http://msdn.microsoft.com/library/en-us/adsi/adsi/iadsuser_setpassword.asp?frame=true

これのRemarksに説明が書いてありますね。

1. 128bit SSL で LDAP接続を試みる
2. 1.がダメな場合、Kerberos認証(cross-forest認証)を試みる
  (ただし、cross-forest認証はWin2000では対応していない)
3. 2.がこけた場合、NetUserSetInfo API を用いて設定変更を試みる
  (ただし、DefaultのUser Contextで行われるため失敗する?)

英語力にさほど自信が無いので間違っていたら(__)

対処方法としては、Server 2003側にDCOM(Server Application)として
実装しておいて、それを呼び出すという風にするとか・・・

管理人むたぐち さん 2005年 05月 21日 08時 31分 15秒

Windows XPの「コンピュータのロック」や、リモートデスクトップで他の端末から操作されている状態で、パスワードを入力して通常の画面に戻したいのですが、これをスクリプトから行うことは可能でしょうか?

SendKeysではパスワードを入力するウィンドウにフォーカスが当たらないので無理なようです。何か代替案はありますでしょうか。

管理人むたぐち さん 2005年 05月 20日 17時 50分 18秒

To: mat516 さん

> スタートアップに、WebサーバへPOSTメソッドでデータを送るWSHを仕込み、WindowsXPへログインしたときにWebサーバへPOSTメソッドでデータを送ろうと試みておりますが、うまくいきません。

すぐ下の書き込みは、以下のようなスクリプトで行いました。
Msxml2.XMLHTTPを使って、WebサーバーにPOSTメソッドを送ります。

msgbox Post("管理人むたぐち","","","テストです。")

Function Post(name,email,url,comment)
     sURL = "http://www.roy.hi-ho.ne.jp/cgi-bin/user/mutaguchi/board.pl"
     Set xh = WScript.CreateObject("Msxml2.XMLHTTP")
     xh.Open "POST",sURL ,False
     xh.setRequestHeader "Referer",sURL
     xh.Send "submit=%8F%91%82%AB%8D%9E%82%DE&name=" & UrlEncode(name) & _
     "&email=" & UrlEncode(email) & "&comment=" & UrlEncode(comment) & "&dir=bbs"
End Function

なお、UrlEncode関数は、Windows Script Wikiの「テクニック集」にあります。これは日本語を含む文字列を送るときに必要になります。

管理人むたぐち さん 2005年 05月 20日 17時 46分 06秒

テストです。

mat516 さん 2005年 05月 20日 15時 57分 34秒

スタートアップに、WebサーバへPOSTメソッドでデータを送るWSHを仕込み、WindowsXPへログインしたときにWebサーバへPOSTメソッドでデータを送ろうと試みておりますが、うまくいきません。

どなたか同様のことを実現された方はおりませんでしょうか。
お知恵を貸していただけますようお願いいたします。

管理人むたぐち さん 2005年 05月 20日 15時 50分 47秒

To: ばんのしゃーによかばんた さん 2005年 05月 20日 15時 21分 26秒

> ところで、デフォルトプリンタ名を知る方法ってなかったでしょうか?
> SetDefaultPrinterがあるのに、GetDefaultPrinterがありません。なんで?
> それが分かればもう少し精度が上がるのですが。。。

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windowsキーの
Deviceという名前の値を読めば良さそうです。(WinXP)
余計な文字列がついているので、適当にomitしてください。

Return