SQLの窓

2017年09月01日


VBScript を『管理者として実行する』には、Shell の runas ( 右クリックメニューの実行と同等 ) で実現します

UAC によるセキュリティの影響で VBScript を使う場合、管理者権限で実行しないとレジストリの一部には書き込めるのに重要なフォルダには書き込めないというような OS が決めたルールがあります。

それに対する対処方法は、もっとも簡単な記述では以下のようになります
' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if



Shell.ShellExecute method

これは、VBScript から利用可能な Shell の機能を使って、右クリックメニューにある『管理者として実行』を実行する方法です。ここでは日本語では無く runas と言う文字列を使って管理者として実行させています。

但し、注意するのは引数なしで実行された場合に、引数をダミーで一つセットして( この場合一つめの runas がそうです )自分自身を再度呼び出して、引数がなかった場合の処理としては処理終了します。

つまり、二度目の実行が管理者としての実行になります。

この場合は、スクリプトに引数を渡す事ができません。もし渡したいしたい場合は、違ったトリックを使う必要があるのに注意して下さい。(その場合は、外部ファイルから入力するのがもっとも簡単で確実だと思います)




posted by lightbox at 2017-09-01 13:10 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

管理者権限でコマンドプロンプトを開く VBScript

第一引数にフォルダのパスを指定するようにしています。指定しなければ、カレントフォルダで開きます。

管理者で実行するのは、ShellExecute に、"runas" を渡して実行しているからです。これは、右クリックで表示されるメニューにある『管理者として実行』に相当します
acmd.vbs
Set obj = CreateObject("Shell.Application")
Set WshShell = CreateObject( "WScript.Shell" )
if WScript.Arguments.Count <> 0 then
	obj.ShellExecute "cmd.exe", "/s /k pushd """ & WScript.Arguments(0) & """", "", "runas", 1
else
	obj.ShellExecute "cmd.exe", "/s /k pushd """ & WshShell.CurrentDirectory & """", "", "runas", 1
end if





このスクリプトを Windows の system32 フォルダへコピーして、以下のようにレジストリ登録すると、フォルダを右クリックしてその場所で実行可能になります
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\acmd]
@="管理者コマンドプロンプト"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\Directory\shell\acmd\command]
@="wscript.exe acmd.vbs \"%V\""


※ system32 フォルダへコピーしたスクリプトを編集するには、エディタの実行時に『管理者として実行』する必要があります。

Windows 7 では、単に管理者としてコマンドプロンプトを開きたい場合は、スタートメニューの『プログラムとファイルの検索』内に cmd と入力して CTRL + SHIFT + ENTER すればいいでしょう




関連する外部の記事

windows - How to run vbs as administrator from vbs? - Stack Overflow




posted by lightbox at 2017-09-01 13:03 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2016年12月18日


シャットダウンダイアログを表示する / ログオフ・リブート・シャットダウン / VBScript

※ Windows10 でも動作確認しました



Set objShell = CreateObject("Shell.Application")
objShell.ShutdownWindows()


▼ 右クリックから保存して下さい。
ブラウザでダウンロード
※ クリックすると、新しいウインドウで『プレーンテキスト(text/plain)』として開きます
ログオフ
シャットダウン
リブート
パワーオフ(こちらの環境では未確認)

logoff.vbs
Set colOperatingSystems = _
GetObject("winmgmts:{(Shutdown)}").ExecQuery( _
"Select * from Win32_OperatingSystem") 
For Each objOperatingSystem in colOperatingSystems 
	ObjOperatingSystem.Win32Shutdown(0) 
Next


関連するスクリプト

ログオフ・リブート・シャットダウン



posted by lightbox at 2016-12-18 17:04 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2014年08月30日


Windows のファイルの『更新日付』のみ VBScript + Shell.Application で変更

更新日付のみです。作成日とアクセス日付は変更できません。

FolderItem.ModifyDate property
Dim objShell

Set objShell = CreateObject("Shell.Application")

Set objFolder = objShell.NameSpace("C:\Users\lightbox\Documents")
if (not objFolder is nothing) then

	Dim objFolderItem
				
	Set objFolderItem = objFolder.ParseName("test.zip")
	if (not objFolderItem is nothing) then
		objFolderItem.ModifyDate = "01/01/2010 0:00:00 AM"
	end if
end if



タグ:VBScript
posted by lightbox at 2014-08-30 14:56 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2014年06月14日


VBScript : プロパティダイアログを表示する

プロパティを表示する為には、呼び出し元が終了していない必要があるので、スクリプトを終了させない方法を二通り用意しています( .HTA からであれば必要ありません。)

※ スクリプトは prop.vbs としています

MsgBox を使う方法
Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set objShell = CreateObject("Shell.Application")
strTarget = Wscript.Arguments(0)
strPath = Fso.GetParentFolderName(strTarget)
strFile = Fso.GetFileName(strTarget)

Set objFolder = objShell.NameSpace(strPath)
Set objFile = objFolder.ParseName(strFile)
objFile.InvokeVerb("properties")

MsgBox("プロパティダイアログを表示する為にプロセスを維持します")



WMI を使う方法
' このセクションは、cscript.exe で処理を強制させるものです
str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	str = WScript.ScriptFullName
	Set WshShell = CreateObject( "WScript.Shell" )
	Call WshShell.Run( "cmd.exe /c cscript.exe """ & str & """ """ & Wscript.Arguments(0) & """", 3 )
	WScript.Quit
end if

strTarget = Wscript.Arguments(0)
Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set objShell = CreateObject("Shell.Application")
strPath = Fso.GetParentFolderName(strTarget)
strFile = Fso.GetFileName(strTarget)

Set objFolder = objShell.NameSpace(strPath)
Set objFile = objFolder.ParseName(strFile)
objFile.InvokeVerb("properties")

' WMI の処理の為のオブジェクトを取得
' スクリプトを終了しないようにしています
Set obj = GetObject("winmgmts:\\.\root\cimv2")
' イベントの定義
Set objMonitor = obj.ExecNotificationQuery( _
	"select * from __InstanceModificationEvent " & _
	"where TargetInstance isa 'Win32_LocalTime' " & _
	" and TargetInstance.Year = 0" _
)

Wscript.Echo "プロパティ表示後は、このコマンドプロンプトは閉じて下さい"
Set objLatestEvent = objMonitor.NextEvent 

コマンドラインで以下のように実行します
>prop.vbs "対象ファイルのフルパス"

関連する記事

VBScript : ファイルやフォルダを右クリックすると表示されるコマンド文字列の一覧を取得して、それを使ってコマンドを実行する


タグ:SHELL VBScript WMI
posted by lightbox at 2014-06-14 17:02 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2014年03月12日


VBScript : キーストロークをウインドウに送信して、キー操作をした事にする( 例:リモート デスクトップ接続ダイアログ )



リモート デスクトップ接続は開いた後、詳細画面が表示されないので、ALT+O を送り、その後 SHIFT+TAB でタブを選択して、右矢印で次のタブに移動させます。

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run( "mstsc.exe" )

WScript.Sleep(500)
WshShell.AppActivate("リモート デスクトップ接続")
WScript.Sleep(500)

' キーストロークを送信
WshShell.SendKeys ("%O")
WScript.Sleep(500)
WshShell.SendKeys ("+{TAB}")
WScript.Sleep(500)
WshShell.SendKeys ("{RIGHT}")

※ キーストロークの送信は環境や状況によっては、うまく動作しないかもしれません。その場合は適宜変更して下さい(キーストローク詳細)

環境変数ダイアログは 『rundll32.exe sysdm.cpl,EditEnvironmentVariables』で実行できます


タグ:VBScript
posted by lightbox at 2014-03-12 17:56 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

VBScript : ファイルやフォルダを右クリックすると表示されるコマンド文字列の一覧を取得して、それを使ってコマンドを実行する


Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set objShell = CreateObject("Shell.Application")
strTarget = Wscript.Arguments(0)
strPath = Fso.GetParentFolderName(strTarget)
strFile = Fso.GetFileName(strTarget)

Set objFolder = objShell.NameSpace(strPath)
Set objFile = objFolder.ParseName(strFile)

Set obj = objFile.Verbs
For i = 0 To obj.Count - 1
	Wscript.Echo obj.item(i).Name
Next

※ 何故か空白のエントリも表示されます。

開く(&O)
編集(&E)
コマンド プロンプトで開く(&W)
印刷(&P)


ウイルススキャン...





切り取り(&T)
コピー(&C)
ショートカットの作成(&S)
削除(&D)
名前の変更(&M)
プロパティ(&R)
Wscript.Echo で出力しているので、コマンドラインでは以下のようにします >cscript ListVerb.vbs "対象ファイルのフルパス" 以下は実行用のスクリプトで以下のようにして実行します InvokeVerb.vbs "対象ファイルのフルパス" "開く(&O)" ※ プロパティの表示は、以下を参照して下さい VBScript : プロパティダイアログを表示する
Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set objShell = CreateObject("Shell.Application")
strTarget = Wscript.Arguments(0)
strPath = Fso.GetParentFolderName(strTarget)
strFile = Fso.GetFileName(strTarget)

Set objFolder = objShell.NameSpace(strPath)
Set objFile = objFolder.ParseName(strFile)

For Each objItem In objFile.Verbs

	if objItem.Name = Wscript.Arguments(1) then
		objItem.DoIt()
		Exit For
	end if

Next

objFile.InvokeVerb( "コマンド名" ) は現在動作しないようです



タグ:SHELL
posted by lightbox at 2014-03-12 09:29 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2014年03月11日


VBScript : Shell.Application で開くWindows ツール



なんでもかんでも実行できるわけではありませんが、使えるものもたくさんあります。ソースを一つで表現する為に、HTA で記述していますが、それぞれ単独で使うほうが現実的だとは思います。

コントロールパネル内は全て実行可能なはずです。デスクトップは、objShell.NameSpace(0) で取得されており、そこからフォルダオブジェクトや、フォルダアイテムオブジェクトを取得して使用しています。

▼ shell_space.hta
<SCRIPT language="VBScript">
Dim objShell : Set objShell = CreateObject("Shell.Application")
Dim objFolder : Set objFolder = objShell.NameSpace(0)
</SCRIPT>
<html>
<head>
<title>Shell で開く Windows ツール</title>
<meta http-equiv="content-type" content="text/html; charset=SHIFT_JIS">
<HTA:APPLICATION ID="Sqlwin"
	BORDERSTYLE="sunken"
	INNERBORDER="yes"
	SCROLL="no"
	ICON="http://winofsql.jp/WinOfSql.ico"
>

<style type="text/css">
* {
	font-size:26px;
	font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif;
}
</style>

<SCRIPT language=VBScript>
Function OpenDesktopFile( strTarget )

	Dim objFile

	Set objFile = objFolder.ParseName(strTarget)
	Call objFile.InvokeVerb()

End Function
Function OpenProp( strTarget )

	Dim objFile

	Set objFile = objFolder.ParseName(strTarget)
	objFile.InvokeVerb("properties")

End Function
Function ControlItemb( strName, strTarget )

	Dim ControlPanel,objFolder,objFolderItems

	ControlPanel = "::{26EE0668-A00A-44D7-9371-BEB064C98683}"
	Set objFolder = objShell.NameSpace(ControlPanel)

	Set objFolderItems = objFolder.Items
	For I = 0 to objFolderItems.Count - 1
		if objFolderItems.item(I).Name = strName then
			For J = 0 to objFolderItems.item(I).GetFolder.Items.Count - 1
				if objFolderItems.item(I).GetFolder.Items.item(J).Name = strTarget then
					objFolderItems.item(I).GetFolder.Items.item(J).InvokeVerb()
					Exit For
				end if
			Next
		end if
	Next

End Function
</SCRIPT>

</head>
<body>

<input type=button value="コンピュータ" onClick='Call OpenDesktopFile("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")'>
<input type=button value="コンピュータのプロパティ" onClick='Call OpenProp("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")'>
<br>

<input type=button value="ネットワーク" onClick='Call OpenDesktopFile("::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}")'>
<input type=button value="ネットワークのプロパティ" onClick='Call OpenProp("::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}")'>
<br>

<input type=button value="ごみ箱" onClick='Call OpenDesktopFile("::{645FF040-5081-101B-9F08-00AA002F954E}")'>
<input type=button value="ごみ箱のプロパティ" onClick='Call OpenProp("::{645FF040-5081-101B-9F08-00AA002F954E}")'>
<br>

<input type=button value="コントロールパネル" onClick='Call OpenDesktopFile("::{26EE0668-A00A-44D7-9371-BEB064C98683}")'>
<input type=button value="日付と時刻" onClick='Call ControlItemb("時計、言語、および地域", "日付と時刻")'>
<input type=button value="個人設定" onClick='Call ControlItemb("デスクトップのカスタマイズ", "個人設定")'>

</BODY>
</html>




posted by lightbox at 2014-03-11 23:37 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2013年02月05日


Windows7 : VBScriptで、コントロールパネル内のエントリの実行

Windows7 で実行して確認しました。Windows XP 以前では少し違っていたのですが、当時のコードを Windows7 で実行すると動かなかったので再度テストしました。
' Windows7 での実行サンプル

Set objShell = CreateObject("Shell.Application")

' All Control Panel Items
ControlPanel = "::{21EC2020-3AEA-1069-A2DD-08002B30309D}"

' コントロールパネルをあらわすフォルダ
Set objFolder = objShell.NameSpace(ControlPanel)

' オブジェクトが正常に取得できた場合
if not objFolder is nothing then
	' フォルダの中のアイテムコレクションを取得
	Set objFolderItems = objFolder.Items
	For I = 0 to objFolderItems.Count - 1
		' 一覧の中から特定のエントリを対象とする
		if objFolderItems.item(I).Name = "日付と時刻" then
			' 実行は以下で確認しています
			objFolderItems.item(I).InvokeVerb()
			Exit For
		end if
	Next
end if


'電源オプション
'通知領域アイコン
'NVIDIA コントロール パネル
'タスク バーと [スタート] メニュー
'資格情報マネージャー
'既定のプログラム
'RemoteApp とデスクトップ接続
'Windows Update
'デスクトップ ガジェット
'Windows ファイアウォール
'電話とモデム
'Java
'音声認識
'ユーザー アカウント
'地域と言語
'ホームグループ
'マウス
'フォルダー オプション
'キーボード
'デバイス マネージャー
'Windows CardSpace
'パフォーマンスの情報とツール
'プログラムと機能
'インデックスのオプション
'ネットワークと共有センター
'保護者による制限
'自動再生
'同期センター
'回復
'インターネット オプション
'デバイスとプリンター
'色の管理
'バックアップと復元
'システム
'アクション センター
'フォント
'Windows Anytime Upgrade
'ディスプレイ
'トラブルシューティング
'はじめに
'管理ツール
'コンピューターの簡単操作センター
'Windows Defender
'日付と時刻
'位置センサーとその他のセンサー
'個人設定
'サウンド
'Realtek HD オーディオマネージャ
'DirectX
'メール
'Adobe Gamma
'Flash Player

Shell Objects for Scripting and Microsoft Visual Basic (Windows)


タグ:VBScript SHELL
posted by lightbox at 2013-02-05 14:54 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

2010年08月12日


シャットダウンダイアログを開くスクリプトと、シャットダウンするスクリプト

シャットダウンダイアログを開くスクリプトが二つ、シャットダウンするスクリプトが二つです。

スクリプトと言っても、それぞれひとつづつはコマンドラインで実行するアプリケーションです。 shutdown は、リモートデスクトップで接続している PC をシャットダウンする場合に使用可能です。
これはもともとシャットダウンダイアログを開く為のメソッドを実行しているものです。この後、実際にシャットダウンするには、キーストロークを送る事によって可能です。
Set Shell = Wscript.CreateObject( "Shell.Application" )
Shell.ShutdownWindows()


タスクの強制終了のはずなのですが、エクスプローラは終了する前に確認ダイアログを表示する仕様になっているようで、結果的にひとつ前のコードと同じ動作をしてしまいました。エクスプローラの再起動は こちらのスクリプト で可能ですが、Windows が再起動するのでは無く、エクスプローラのみ再起動します
Set WshShell = Wscript.CreateObject( "WScript.Shell" )
Call WshShell.Run("taskkill /im explorer.exe", 0 )


コマンドプロンプトから実行可能なシャットダウン方法です
Set WshShell = Wscript.CreateObject( "WScript.Shell" )
Call WshShell.Run("shutdown -s -t 0", 0 )


スクリプトを用いた最も汎用的なサンプルです。他の定数を使用して、ログオフやリプートも可能です
Const LOGOFF = 0
Const SHUTDOWN = 1
Const REBOOT = 2
Const FORCED_LOGOFF = 4
Const FORCED_SHUTDOWN = 5
Const FORCED_REBOOT = 6
Const POWEROFF = 8
Const FORCED_POWEROFF = 12

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & _
	"{impersonationLevel=impersonate,(Shutdown)}!\\" & _
	strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
	ObjOperatingSystem.Win32Shutdown(SHUTDOWN)
Next



posted by lightbox at 2010-08-12 17:51 | VBS + Shell | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します


Windows
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり