SQLの窓

2016年12月24日


VBScript + WMI : ファイルの状態の監視

WMI の典型的なイベント監視のサンプルです。
( リンク先は、Microsoft の TechNet のスクリプト センターです )

ファイル作成の監視
1) C:\scripts フォルダを作成します。
2) 適当な場所にスクリプトを作成します(file_create.vbs)
3) そのフォルダをエクスプローラでSHIFTキーを押しながら右クリックしてコマンドブロンプトを開きます
4) cscript file_create.vbs と実行します
5) C:\scripts でファイルを作成します
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & _  
        strComputer & "\root\cimv2")  
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _  
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _  
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _  
            & "TargetInstance.GroupComponent= " _  
                & "'Win32_Directory.Name=""c:\\\\scripts""'")  
Do  
    Set objLatestEvent = colMonitoredEvents.NextEvent  
    Wscript.Echo objLatestEvent.TargetInstance.PartComponent  
Loop  

ファイル変更の監視
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & _  
        strComputer & "\root\cimv2")  
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _  
    ("SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE " _  
        & "TargetInstance ISA 'CIM_DataFile' and " _  
            & "TargetInstance.Name='c:\\scripts\\index.vbs'")  
Do  
    Set objLatestEvent = colMonitoredEvents.NextEvent  
    Wscript.Echo "File: " & objLatestEvent.TargetInstance.Name  
    Wscript.Echo "New size: " & objLatestEvent.TargetInstance.FileSize  
    Wscript.Echo "Old size: " & objLatestEvent.PreviousInstance.FileSize  
Loop  
ファイル削除の監視
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & _  
        strComputer & "\root\cimv2")  
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _  
    ("SELECT * FROM __InstanceDeletionEvent WITHIN 10 WHERE " _  
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _  
            & "TargetInstance.GroupComponent= " _  
                & "'Win32_Directory.Name=""c:\\\\scripts""'")  
Do  
    Set objLatestEvent = colMonitoredEvents.NextEvent  
    Wscript.Echo objLatestEvent.TargetInstance.PartComponent  
Loop  
利用できるディスク領域の監視
Const LOCAL_HARD_DISK = 3  
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set colMonitoredDisks = objWMIService.ExecNotificationQuery _  
    ("Select * from __instancemodificationevent within 30 where " _  
        & "TargetInstance isa 'Win32_LogicalDisk'")  

Do 
    Set objDiskChange = colMonitoredDisks.NextEvent  
    If objDiskChange.TargetInstance.DriveType = LOCAL_HARD_DISK Then  
        If objDiskChange.TargetInstance.Size < 100000000 Then  
            Wscript.Echo "Hard disk space is below 100000000 bytes."  
        End If  
    End If  
Loop  



posted by lightbox at 2016-12-24 14:34 | VBS + WMI | このブログの読者になる | 更新情報をチェックする

2016年03月08日


VBScript : WMI を使用してレジストリ情報より、shell: を使ってフォルダを開くコマンドラインの一覧を作成する

VBScript のコードは以下のようになります。一覧のテキストを作成したい場合は、コマンドプロンプトで cscript の引数として以下のコードを保存した .vbs ファイルを実行して、結果をパイプで sort に渡して最後にテキストファイルにリダイレクトします

cscript.exe //nologo test.vbs | sort > mylist.txt
Set objRegistry = GetObject("Winmgmts:root\default:StdRegProv")

strBasePath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions"

ret = objRegistry.EnumKey( &H80000002, strBasePath, aKeys )

For Each strKeyPath in aKeys
	ret = objRegistry.GetStringValue( &H80000002, strBasePath & "\" & strKeyPath, "Name", strValue )
	Wscript.Echo "Explorer /e,shell:" & strValue
Next



▼ 結果の一覧です
Explorer /e,shell:AddNewProgramsFolder
Explorer /e,shell:Administrative Tools
Explorer /e,shell:AppData
Explorer /e,shell:AppUpdatesFolder
Explorer /e,shell:Cache
Explorer /e,shell:CD Burning
Explorer /e,shell:ChangeRemoveProgramsFolder
Explorer /e,shell:Common Administrative Tools
Explorer /e,shell:Common AppData
Explorer /e,shell:Common Desktop
Explorer /e,shell:Common Documents
Explorer /e,shell:Common Programs
Explorer /e,shell:Common Start Menu
Explorer /e,shell:Common Startup
Explorer /e,shell:Common Templates
Explorer /e,shell:CommonDownloads
Explorer /e,shell:CommonMusic
Explorer /e,shell:CommonPictures
Explorer /e,shell:CommonRingtones
Explorer /e,shell:CommonVideo
Explorer /e,shell:ConflictFolder
Explorer /e,shell:ConnectionsFolder
Explorer /e,shell:Contacts
Explorer /e,shell:ControlPanelFolder
Explorer /e,shell:Cookies
Explorer /e,shell:CredentialManager
Explorer /e,shell:CryptoKeys
Explorer /e,shell:CSCFolder
Explorer /e,shell:Default Gadgets
Explorer /e,shell:Desktop
Explorer /e,shell:Device Metadata Store
Explorer /e,shell:DocumentsLibrary
Explorer /e,shell:Downloads
Explorer /e,shell:DpapiKeys
Explorer /e,shell:Favorites
Explorer /e,shell:Fonts
Explorer /e,shell:Gadgets
Explorer /e,shell:Games
Explorer /e,shell:GameTasks
Explorer /e,shell:History
Explorer /e,shell:HomeGroupFolder
Explorer /e,shell:ImplicitAppShortcuts
Explorer /e,shell:InternetFolder
Explorer /e,shell:Libraries
Explorer /e,shell:Links
Explorer /e,shell:Local AppData
Explorer /e,shell:LocalAppDataLow
Explorer /e,shell:LocalizedResourcesDir
Explorer /e,shell:MAPIFolder
Explorer /e,shell:MusicLibrary
Explorer /e,shell:My Music
Explorer /e,shell:My Pictures
Explorer /e,shell:My Video
Explorer /e,shell:MyComputerFolder
Explorer /e,shell:NetHood
Explorer /e,shell:NetworkPlacesFolder
Explorer /e,shell:OEM Links
Explorer /e,shell:Original Images
Explorer /e,shell:Personal
Explorer /e,shell:PhotoAlbums
Explorer /e,shell:PicturesLibrary
Explorer /e,shell:Playlists
Explorer /e,shell:PrintersFolder
Explorer /e,shell:PrintHood
Explorer /e,shell:Profile
Explorer /e,shell:ProgramFiles
Explorer /e,shell:ProgramFilesCommon
Explorer /e,shell:ProgramFilesCommonX86
Explorer /e,shell:ProgramFilesX86
Explorer /e,shell:Programs
Explorer /e,shell:Public
Explorer /e,shell:PublicGameTasks
Explorer /e,shell:PublicLibraries
Explorer /e,shell:Quick Launch
Explorer /e,shell:Recent
Explorer /e,shell:RecordedTVLibrary
Explorer /e,shell:RecycleBinFolder
Explorer /e,shell:ResourceDir
Explorer /e,shell:Ringtones
Explorer /e,shell:SampleMusic
Explorer /e,shell:SamplePictures
Explorer /e,shell:SamplePlaylists
Explorer /e,shell:SampleVideos
Explorer /e,shell:SavedGames
Explorer /e,shell:Searches
Explorer /e,shell:SearchHomeFolder
Explorer /e,shell:SendTo
Explorer /e,shell:Start Menu
Explorer /e,shell:Startup
Explorer /e,shell:SyncCenterFolder
Explorer /e,shell:SyncResultsFolder
Explorer /e,shell:SyncSetupFolder
Explorer /e,shell:System
Explorer /e,shell:SystemCertificates
Explorer /e,shell:SystemX86
Explorer /e,shell:Templates
Explorer /e,shell:User Pinned
Explorer /e,shell:UserProfiles
Explorer /e,shell:UserProgramFiles
Explorer /e,shell:UserProgramFilesCommon
Explorer /e,shell:UsersFilesFolder
Explorer /e,shell:UsersLibrariesFolder
Explorer /e,shell:VideosLibrary
Explorer /e,shell:Virtual Machines
Explorer /e,shell:Windows

※ これらは、ショートカットとして保存できます


posted by lightbox at 2016-03-08 17:03 | Comment(0) | VBS + WMI | このブログの読者になる | 更新情報をチェックする

2015年02月25日


VBScript : WMI と NT Provider(ADSI) をそれぞれ使用して、共有を『登録』『一覧』『削除』するサンプル

処理が失敗して共有がもし残った場合は、Windows のコンピュータの管理(%windir%\system32\compmgmt.msc /s)から『共有の停止』を実行します

サンプルでは、WMI と ADSI の両方で処理を記述していますが、WMI のほうが今では推奨されると思います。ADSI のドキュメントは解りにくい上にちゃんとしたものが無いので、これ以上の事をしようとすると苦労すると思います。但し、ローカルユーザを自動的に大量に登録する必要がある場合は、NT Provider は比較的簡単かもしれません。

関連する Microsoft のドキュメント

ADSI を使用してファイル共有を管理する方法
How Can I Share a Folder on a Remote Computer?
Win32_Share class
<JOB>
<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />
<SCRIPT language="VBScript">

Crun

' **************************************
' スクリプトが存在するディレクトリを取得
' **************************************
strScriptPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strScriptPath )
Set obj = obj.ParentFolder
strScriptPath = obj.Path

' **************************************
' 共有作成(WMI)
' **************************************
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objShare = objWMIService.Get("Win32_Share")
Call objShare.Create( strScriptPath, "ここが共有名ですA", 0 )

' **************************************
' 共有一覧(WMI)
' **************************************
Set colShares = objWMIService.ExecQuery("Select * from Win32_Share")
Wscript.Echo "【共有一覧】"
Wscript.Echo "----------------------------------------------------"
For Each Share In colShares
	Wscript.Echo RpadB(Share.Name, " ", 20) & " : " & Share.Path
Next
Wscript.Echo

' **************************************
' 共有削除(WMI)
' **************************************
Set colShares = objWMIService.ExecQuery("Select * from Win32_Share where Name = 'ここが共有名ですA'")
For Each Share In colShares
	Share.Delete
Next
Wscript.Echo

' **************************************
' 共有作成(WinNT Provider)
' **************************************
Set colShares = GetObject("WinNT://./LanmanServer")
Set objShare = colShares.Create("fileshare", "ここが共有名ですB")
objShare.Path = strScriptPath
objShare.SetInfo

' **************************************
' 共有一覧(WinNT Provider)
' **************************************
Wscript.Echo "【共有一覧】"
Wscript.Echo "----------------------------------------------------"
For Each Share In colShares
	Wscript.Echo RpadB(Share.Name, " ", 20) & " : " & Share.Path
Next
Wscript.Echo

' **************************************
' 共有削除(WinNT Provider)
' **************************************
colShares.Delete "fileshare", "ここが共有名ですB"
Wscript.Echo

' 終了確認
Wscript.Echo "処理が終了しました"

' **************************************
' Cscript.exe で実行を強制
' Cscript.exe の実行終了後 pause で一時停止
' **************************************
Function Crun( )

	Dim str

	str = WScript.FullName
	str = Right( str, 11 )
	str = Ucase( str )
	if str <> "CSCRIPT.EXE" then
		str = WScript.ScriptFullName

		strParam = " "
		For I = 0 to Wscript.Arguments.Count - 1
			if instr(Wscript.Arguments(I), " ") < 1 then
				strParam = strParam & Wscript.Arguments(I) & " "
			else
				strParam = strParam & Dd(Wscript.Arguments(I)) & " "
			end if
		Next
		Call WshShell.Run( "cmd.exe /c cscript.exe " & Dd(str) & strParam & " & pause", 3 )
		WScript.Quit
	end if

End Function
' **************************************
' 文字列を " で囲む関数
' **************************************
Function Dd( strValue )

	Dd = """" & strValue & """"

End function

' **************************************
' 文字列の右側をスペースで埋める
' **************************************
Function RpadB( strValue, str, nLen )

	Dim strWork,nLen2

	strWork = Left( strValue & String(nLen,str), nLen )
	nLen2 = nLen

	Do While ByteLen( strWork ) > nLen
		nLen2 = nLen2 - 1
		if nLen2 <= 0 then
			Exit Do
		end if
		strWork = Left( strValue & String(nLen,str), nLen2 )
	Loop
	RpadB = strWork

End function
' **************************************
' 文字列のバイト計算
' **************************************
Function ByteLen( strTarget )

	Dim i,nLen,nRet,strMoji,nAsc

	nRet = 0

	nLen = Len( strTarget )

	For i = 1 to nLen
		nRet = nRet + 2
		strMoji = Mid( strTarget, i, 1 )
		nAsc = Asc( strMoji )
		if &H0 <= nAsc and nAsc <= &H80 then
			nRet = nRet - 1
		end if
		if &HA0 <= nAsc and nAsc <= &HDF then
			nRet = nRet - 1
		end if
		if &HFD <= nAsc and nAsc <= &HFF then
			nRet = nRet - 1
		end if
	Next

	ByteLen = nRet

End Function
</SCRIPT>
</JOB>


実行結果

Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

【共有一覧】
----------------------------------------------------
ADMIN$               : C:\Windows
C$                   : C:\
D$                   : D:\
IPC$                 :
print$               : C:\Windows\system32\spool\drivers
temp                 : C:\Users\lightbox\AppData\Local\Temp
Users                : C:\Users
ここが共有名ですA    : C:\user\vbs


【共有一覧】
----------------------------------------------------
print$               : C:\Windows\system32\spool\drivers
temp                 : C:\Users\lightbox\AppData\Local\Temp
Users                : C:\Users
ここが共有名ですB    : C:\user\vbs


処理が終了しました
続行するには何かキーを押してください . . .
※ 実行終了後、共有は削除されています
posted by lightbox at 2015-02-25 16:00 | VBS + WMI | このブログの読者になる | 更新情報をチェックする

2014年08月30日


VBSCript+WMI : コンピュータ上のファイル検索と詳細情報

サンプルでは、ローカルコンピュータですが、リモートコンピュータへの接続処理を追加すれば、リモートでの検索も可能だと思います(未確認)。

WQL(SQL for WMI) で注意するのは、通常のプログラミング言語と同じで、\ を \\ で表現するところです。

CIM_DataFile class
strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colFiles = objWMIService. _ 
    ExecQuery("Select * From CIM_DataFile Where FileName = 'readme' and Extension = 'txt' and Name like 'C:\\backup%'") 

Wscript.Echo "件数 : " & colFiles.Count
if colFiles.Count <> 0 then
	For Each objFile in colFiles

		Wscript.Echo "-------------------------------------"

		Set Props = objFile.Properties_
		For Each Prop in Props
			if not isArray( Prop.Value ) then
				Wscript.Echo Prop.Name & " : " & Prop.Value
			else
				Wscript.Echo Prop.Name
			end if
		Next

	Next
end if

実行は、必ずコマンドプロンプトから行います

例) cscript ファイル検索.vbs > flles.log

以下が出力の一件分です。
-------------------------------------
AccessMask : 18809343
Archive : True
Caption : c:\backup\readme.txt
Compressed : False
CompressionMethod : 
CreationClassName : CIM_LogicalFile
CreationDate : 20140830131541.520550+540
CSCreationClassName : Win32_ComputerSystem
CSName : COMPNAME
Description : c:\backup\readme.txt
Drive : c:
EightDotThreeFileName : c:\backup\readme.txt
Encrypted : False
EncryptionMethod : 
Extension : txt
FileName : readme
FileSize : 58
FileType : Text Document
FSCreationClassName : Win32_FileSystem
FSName : NTFS
Hidden : False
InstallDate : 20140830131541.520550+540
InUseCount : 
LastAccessed : 20140830131541.520550+540
LastModified : 20140830131555.161330+540
Manufacturer : 
Name : c:\backup\readme.txt
Path : \backup\
Readable : True
Status : OK
System : False
Version : 
Writeable : True



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

2014年05月23日


VBScript(WMI)によるイベント関数を WMI に登録するタイマー処理

VBScript(WSH) の WScript.CreateObject では、作成したオブジェクトのイベントを受け付ける関数を定義する事ができます。過去、ほとんどそのようなサンプルは現実には無かったのですが、WMI では少なくともタイマー処理として利用可能です。

CreateObject メソッドで strPrefix 引数を指定すると、接続されたオブジェクトが作成されます。これは、オブジェクトのイベントを同期させる場合に便利です。オブジェクトの出力インターフェイスは、オブジェクト作成後にスクリプト ファイルに接続されます。イベント処理関数は、このプリフィックスとイベント名を組み合わせた名前になります。オブジェクト作成時に strPrefix 引数を指定しなかった場合は、ConnectObject メソッドを使ってオブジェクトのイベントを同期させることができます。オブジェクトがイベントを発行すると、WSH は strPrefix + イベント名という形式の名前を持つサブルーチンを呼び出します。たとえば、strPrefix が MYOBJ であり、オブジェクトが OnBegin というイベントを発行した場合、Windows Script Host はスクリプト内の MYOBJ_OnBegin という名前のサブルーチンを呼び出します
タイマー処理
' ********************************************************************
' このセクションは、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 & """ & pause", 3 )
	WScript.Quit
end if

' ********************************************************************
' 秒単位のログを表示するかどうかのフラグです
' ********************************************************************
Dim Disp : Disp = True	' False にすると、秒単位の表示はしなくなります

' ********************************************************************
' WMI のイベントの定義
' ********************************************************************
Set SINK = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
objWMIService.ExecNotificationQueryAsync _
 SINK, _
 "SELECT * FROM  __InstanceModificationEvent " & _
 "WHERE TargetInstance ISA 'Win32_LocalTime'"

Wscript.Echo "タイマー処理を開始します"
' ********************************************************************
' 停止する為のイベントの定義
' ********************************************************************
Set objMonitor = objWMIService.ExecNotificationQuery( _
	"select * from __InstanceModificationEvent " & _
	"where TargetInstance isa 'Win32_LocalTime' " & _
	" and TargetInstance.Year = 0" _
)

' Wscript.Echo "TargetInstance.Year は 0 にならないので、次の行より後の処理は実行されません"
Set objLatestEvent = objMonitor.NextEvent 
Wscript.Echo "ここは実行されません"

' ********************************************************************
' この処理は、WbemScripting.SWbemSink から呼び出されます
' ********************************************************************
Sub SINK_OnObjectReady(objLatestEvent, objAsyncContext)

	' 10秒毎の処理
	if objLatestEvent.TargetInstance.Second MOD 10 = 0 then
		' ここが 10秒毎に呼び出されます
		Wscript.Echo "秒の余りが 0 の場合にここが実行されます"
		Wscript.Echo "分や時間を使用すると、長いスパンの定期処理に使えます"
	end if

	if Disp then
		' 秒単位に呼び出されるこのルーチンで毎回表示
		Wscript.Echo "Time: " & _
			objLatestEvent.TargetInstance.Hour & ":" & _
			objLatestEvent.TargetInstance.Minute & ":" & _
			objLatestEvent.TargetInstance.Second
	end if
End Sub






posted by lightbox at 2014-05-23 14:34 | VBS + WMI | このブログの読者になる | 更新情報をチェックする

2014年05月22日


VBScript : スクリプトを終了しないようにする

目的としてはいろいろ考えられますが、ここではよく使われる Sleep の代わりになり、ずっと待ち状態になる方法を紹介します。実際は、時分秒を指定して指定した時刻にのみ処理を開始する事もできます(そのほうが現実的です)。
Do
	WScript.Sleep 10000
Loop

関連する記事

VBScript : 30秒後のイベント処理
VBScript : 10秒毎に処理を実行する( 時刻指定も可能 )
Cron の代替え : VBScript で非同期別スレッドタイマー処理
' このセクションは、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 & """ & pause", 3 )
	WScript.Quit
end if

' 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 "TargetInstance.Year は 0 にならないので、次の行より後の処理は実行されません"
Set objLatestEvent = objMonitor.NextEvent 
Wscript.Echo "ここは実行されません"

プロバティとしては以下が使用できます
class Win32_LocalTime : Win32_CurrentTime
{
  uint32 Day;
  uint32 DayOfWeek;
  uint32 Hour;
  uint32 Milliseconds;
  uint32 Minute;
  uint32 Month;
  uint32 Quarter;
  uint32 Second;
  uint32 WeekInMonth;
  uint32 Year;
};


▼ 実際に select * from Win32_LocalTime で取得したサンプルです
DayDayOfWeekHourMillisecondsMinuteMonthQuarterSecondWeekInMonthYear
2241949522242014



タグ:VBScript WMI
posted by lightbox at 2014-05-22 20:55 | VBS + WMI | このブログの読者になる | 更新情報をチェックする

2014年03月09日


VBScript : OSのバージョンを取得



関数になっていますので、他から利用可能です

バージョン数値(小数以下がある場合もある) = GetOSVersion()
Wscript.Echo GetOSVersion()

' **********************************************************
' Windows 2000 : 5
' Windows XP   : 5.1
' Windows 7    : 6.1
' Windows 8    : 6.2
' Windows 8.1  : 6.3
' **********************************************************
Function GetOSVersion()

	Dim obj,colTarget,objRow,str,aData,nData,I

	Set obj = GetObject("winmgmts:\\.\root\cimv2")
	Set colTarget = obj.ExecQuery( "select * from Win32_OperatingSystem" )
	For Each objRow in colTarget
		str = objRow.Version
	Next

	aData = Split( str, "." )
	For I = 0 to Ubound( aData )
		if I > 1 then
			Exit For
		end if
		if I > 0 then
			nTarget = nTarget & "."
		end if
		nTarget = nTarget & aData(I)
	Next

	GetOSVersion = CDbl( nTarget )

End Function

関連する記事

WSH : 指定したキーでレジストリエディタを開く

レジストリエディタの直前に開いたレジストリの場所の保存名が、Windows バージョンによって変化しています。


タグ:VBScript 関数 WMI
posted by lightbox at 2014-03-09 00:28 | VBS + WMI | このブログの読者になる | 更新情報をチェックする

2011年08月12日


VBS : コンピュータから c$ 共有を一時的に削除

まず、共有名の一覧は以下で取得します
( 削除後の確認に使用します )
strComputer = "."  
  
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select * From Win32_Share")  
  
For Each objItem in colItems  
    Wscript.Echo objItem.Name  
Next 

以下の解説にもありますが、C$ は一時的に削除され、再起動すると復活します

Hey, Scripting Guy! コンピュータから C$ 共有を削除する方法はありますか
strComputer = "." 
 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
 
Set colShares = objWMIService.ExecQuery _ 
    ("Select * from Win32_Share Where Name = 'C$'") 
 
For Each objShare in colShares 
    objShare.Delete 
Next





posted by lightbox at 2011-08-12 08:57 | VBS + WMI | このブログの読者になる | 更新情報をチェックする

2011年03月18日


VBS : 指定した HOST 名を現在の IP アドレスで HOSTS ファイルに登録するスクリプト

最初の PC 名は処理に必要ありませんが、確認表示の為に取得しています。「テスト用コンピュータ名」に指定する HOST 名を設定しますが、想定しているのは、Windows7 の XPモードで環境が移動した際に、その環境で取得した(DHCP) IPアドレスに対して、「固定」の HOST 名で名前解決しようというものです。

■ IPアドレスの取得
■ HOSTS があるディレクトリの取得
■ HOSTS ファイルを開いてすべてのテキストを取得
■ 新規なのか、既に以前設定されていたかをチェック
■ 書き込み

というプロセスで実行されます。作業する前には、HOSTS ファイルのオリジナルをバックアップしておくといいと思います。
' 現在のコンピューター名の取得
Dim ComputerName
Set objWMIService = GetObject("winmgmts:\.\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select * From Win32_ComputerSystem")  

For Each objItem in colItems
	ComputerName = objItem.Name
	Exit For
Next 

Wscript.Echo ComputerName


' テスト用コンピュータ名
Dim TestComputerName

TestComputerName = "layla"


' IPアドレスの取得
Dim IPAddress

Set obj = GetObject("winmgmts:\.\root\cimv2")
Set objTargets = obj.ExecQuery( _
	"select * from Win32_NetworkAdapterConfiguration " & _
	"where IPEnabled = True" _
	)
For Each objTarget in objTargets
	For Each objAddress in objTarget.IPAddress
		IPAddress = objAddress & ""
		Exit For
	Next
Next

Wscript.Echo IPAddress


' HOSTS があるディレクトリの取得
Set obj = CreateObject("Shell.Application")
Set objFolder = obj.NameSpace( &h25 )


' HOSTS ファイルを開いてすべてのテキストを取得
FilePath = objFolder.Self.Path&"\drivers\etc\hosts"
Set Fso = CreateObject( "Scripting.FileSystemObject" )
Set objHandle = Fso.OpenTextFile( FilePath, 1 )
strText = objHandle.ReadAll
aData = Split( strText, vbCrLf )
objHandle.Close


' 新規なのか、既に以前設定されていたかをチェック
bExist = False
For I = 0 to Ubound( aData )-1
	aWork = Split( aData(I), " " )
	if Ubound(aWork) >= 0 then
		if Trim(aWork(0)) <> "" then
			if Ubound( aWork ) = 1 then
				strServer = Trim(aWork(1))
				if Ucase(TestComputerName) = Ucase(strServer) then
					bExist = True
					aData(I) = IPAddress & " " & TestComputerName
					Exit For
				end if
			end if
		end if
	end if
Next

' 新規
if not bExist then
	strText = strText & vbCrLf & IPAddress & " " & TestComputerName & vbCrLf
else
' 既に以前設定されている
	strText = Join( aData, vbCrLf )
end if

' 書き込み
Set objHandle = Fso.OpenTextFile( FilePath, 2, True )
objHandle.Write strText
objHandle.Close





posted by lightbox at 2011-03-18 16:32 | VBS + WMI | このブログの読者になる | 更新情報をチェックする
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 ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり