MR2オーナー吉田貴幸のブログ

MR2(SW20)オーナー吉田貴幸のブログ。仕事はITインフラエンジニア。愛車の記事とIT関連の情報を発信しています

【Windows】[VBScript] CDO(Collaboration Data Objects)でメールを送信する

 

はじめに

CDO.Messageを使用して、VBScriptでメール送信を行う方法です。Windows標準機能のみでメールを送信できるので、OS環境に依存せず使用することが出来ます。

※メール送信に使用するSMTPサーバーは別途必要になります。

 

VBScriptでメールを送信する

  • mailsend.vbs
Set oMessage = CreateObject("CDO.Message")

'//差出人 oMessage.From = "username@test.com" '//宛先 複数の場合はセミコロンで区切る
oMessage.To = "username@test.com"
oMessage.CC = "username@test.com"
oMessage.BCC = "username@test.com"
'//添付ファイル
oMessage.AddAttachment = "添付するファイルをフルパスで指定"
'///件名
oMessage.Subject = "テストメールです" '//本文(テキスト形式)
oMessage.TextBody = "テストメールです。"& vbCRLF & "改行は vbCRLFを使用します"
'//メール送信設定
'//1:ローカルSMTPサービスのピックアップ・ディレクトリにメールを配置する(デフォルトの動作)
'//2:SMTPポートに接続して送信する
'//3:OLE DBを利用してローカルのExchangeに接続する oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 '//SMTPサーバー名
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtpservername"
'//ポート番号
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
'//設定更新
oMessage.Configuration.Fields.Update

'//メールヘッダーの設定

'//設定は省略可能です。
'//メーラー
oMessage.Fields("urn:schemas:mailheader:X-Mailer") = "vbscript mail"
'//重要度
oMessage.objMail.Fields("urn:schemas:mailheader:Importance") = "High"
oMessage.objMail.Fields("urn:schemas:mailheader:Priority") = 1
oMessage.Fields("urn:schemas:mailheader:X-Priority") = 1
oMessage.Fields("urn:schemas:mailheader:X-MsMail-Priority") = "High"
oMessage.Fields.update

'//メール送信実行
oMessage.Send Set oMessage = Nothing

その他設定

添付ファイル

  • 添付ファイルは以下を追加する

'//添付ファイル
oMessage.AddAttachment "C:\Scripts\Output.txt"

 

HTML形式

  • メールをHTML形式で作成する場合は、oMessage.TextBody の部分をoMessage.HTMLBody にしてHTML形式で記載する
  • 暗号化通信(SSL)を使用する場合は、メール送信設定に以下を追加する
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl")  = True or Flase

 

SMTPサーバー認証

  • SMTPサーバー認証は、メール送信設定に以下を追加する
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1(Basic認証) or 2(NTLM認証)
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "ユーザー名"
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "パスワード"
oMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 180

 

 

参考記事

gallery.technet.microsoft.com

 

www.atmarkit.co.jp

 

【SCCM】[VBScript] [WMI] デバイスのオンライン状態を取得する | Microsoft System Center Configuration Manager(SCCM)

f:id:takayuki-yoshida:20190421222641p:plain

 

はじめに

SCCMのSMS_CollectionMemberClientBaselineStatusクラスを使用して、デバイスのオンライン状態をVBScriptから取得します。

 

以下の記事で使用している「Connect」Functionプロシージャを使用する前提で記載します。

www.startpassion.life

デバイスコレクション内のデバイスのオンライン状態を取得する 

  • 実行行方法

set Connection = Connect("サーバー名","ユーザー名"."パスワード")
call SCCM_CollectionMemberClientBaselineStatus_Query(connection,CollectionID)

 

Sub SCCM_CollectionMemberClientBaselineStatus_Query(connection,CollectionID)

'Query WMI for SMS_CollectionMemberClientBaselineStatus
'baselinetype 1:実稼働 2:実稼働前
Set oResults = connection.ExecQuery("Select * from SMS_CollectionMemberClientBaselineStatus Where CollectionID='" & CollectionID &"' and baselinetype=1")

For Each oResourceID In oResults
Wscript.echo oResouceID.ResourceID & "," & oResouceID.Name & "," & oResouceID.CNIsOnline
Next

if err.number<>0 then
Wscript.echo "取得できませんでした"
Exit Sub
End If

If oResults.count = 0 then
Wscript.echo "クエリ結果は0件です"
End If

End Sub

 

 このスクリプトでは、SCCM Configration Manager コンソールのデバイスに表示されるアイコンと同じ状態になります

クライアントのオンライン状態アイコン デバイスはオンラインです
クライアントのオフライン状態アイコン デバイスはオフラインです
クライアントの不明な状態アイコン オンライン状態は不明です
クライアントがインストールされていない デバイスにクライアントがインストールされていません

 

参考記事

docs.microsoft.com

 

【SCCM】[VBScript] [WMI] 対象のコンピュータのパッチ適用状況を取得する | Microsoft System Center Configuration Manager(SCCM)

f:id:takayuki-yoshida:20190421222641p:plain

 

はじめに

SCCMのQUICK_FIX_ENGINEERINGクラスを使用して、パッチ適用状況をVBScriptから取得します。

事前にクライアント規則のハードウェアでQUICK_FIX_ENGINEERINGクラスを取得するように設定してください。

以下の2つの記事で使用している「Connect」Functionプロシージャ、「FindResourceID」プロシージャを使用する前提で記載します。

www.startpassion.life

www.startpassion.life

 

デバイス名(コンピュータ名)からパッチ適用状況を取得する 

  • 実行行方法

set Connection = Connect("サーバー名","ユーザー名"."パスワード")
ResourceID = FindResourceID('対象のコンピュータ名')
call SCCM_QFE_Query(connection,ResourceID)

 

Sub SCCM_QFE_Query(connection,ResourceID)

'Query WMI for QFE
Set oResults = connection.ExecQuery("Select * from SMS_G_System_QUICK_FIX_ENGINEERING Where SMS_G_System_QUICK_FIX_ENGINEERING.ResourceID='" & ResourceID &"')

For Each oResourceID In oResults
Wscript.echo oResouceID.ResourceID & "," & oResouceID.HotFixID & "," & oResouceID.InstallDate
Next

if err.number<>0 then
Wscript.echo "取得できませんでした"
Exit Sub
End If

If oResults.count = 0 then
Wscript.echo "クエリ結果は0件です"
End If

End Sub

 

 

【SCCM】[VBScript] [WMI] デバイス名(コンピュータ名)からResourceIDを取得する | Microsoft System Center Configuration Manager(SCCM)

f:id:takayuki-yoshida:20190421222641p:plain

 

はじめに

SCCMでデバイスのResourceIDをコンピュータ名から取得するFunctionプロシージャですです。

こちらの記事のSCCM接続のFunctionプロシージャを使用する前提で記載します。

www.startpassion.life

 

デバイス名(コンピュータ名)からResourceIDを取得する 

  • 実行行方法

VBScript内でSCCM接続のFunctionプロシジャーを含めてください。

set Connection = Connect("サーバー名","ユーザー名"."パスワード")
SCCM_ResourceID = FindResourceID(Connection,DeviceName)

 

Sub FindResourceID(Connection,DeviceName)

'Query WMI for find ResourceID from netBiosName
Set oResults = connection.ExecQuery("Select * from SMS_R_System Where Name = '" & DeviceName & "')

End Sub

 

 

【SCCM】[VBScript] [WMI] ダイレクト規則のデバイスコレクションにデバイスを追加・削除する | Microsoft System Center Configuration Manager(SCCM)

f:id:takayuki-yoshida:20190421222641p:plain

 

はじめに

SCCMでデバイスコレクションのメンバー追加、削除するサブルーチンです。

こちらの記事のSCCM接続のFunctionプロシージャを使用する前提で記載します。

www.startpassion.life

 

デバイスコレクション(ダイレクト規則)にメンバーを追加する

ダイレクト規則のデバイスコレクションのメンバーに、デバイスを追加します。ResourceIDは、SCCMでデバイスを一意を表すIDです。事前に取得している前提です。

コレクションIDは事前にSCCM管理コンソールから調べておいてください。

※デバイスコレクションに追加するデバイスがいないことを事前に確認してください。重複した場合は、無効状態で登録されてしまうようです。

 

  • 実行行方法

VBScript内でSCCM接続のFunctionプロシジャーを含めてください。

set Connection = Connect("サーバー名","ユーザー名"."パスワード")
call DeviceCollection_AddComputer(Connection,ResourceID,collectionID)

 

Sub DeviceCollection_AddComputer(Connection,ResourceID,collectionID)

Dim collection
Dim collectionRule

Set collection = connection.Get("SMS_Collection.CollectionID='" & collectionID & "'")
Set collectionRule = connection.Get("SMS_CollectionRuleDirect").SpawnInstance_
collectionRule.ResourceClassName="SMS_R_System"
collectionRule.ResourceID=ResourceID

'Add CollectionMember
collection.AddMembershipRule collectionRule

End Sub

 

デバイスコレクション(ダイレクト規則)にメンバーから削除する

ダイレクト規則のデバイスコレクションのメンバーからデバイスを削除します。

サンプルスクリプトは追加する場合とほぼ同じで、削除する際に使用するメゾットが違う程度です。

事前に削除するデバイスのResourceIDを取得している前提です。

また、コレクションIDは事前にSCCM管理コンソールから調べておいてください。

 

  • 実行方法

VBScript内でSCCM接続のFunctionプロシジャーを含めてください。

set connection = Connect("サーバー名","ユーザー名"."パスワード")
call DeviceCollection_DeleteComputer(connection,ResourceID,collectionID)

 

Sub DeviceCollection_DeleteComputer(connection,ResourceID,collectionID)

Dim collection
Dim collectionRule

Set collection = connection.Get("SMS_Collection.CollectionID='" & collectionID & "'")
Set collectionRule = connection.Get("SMS_CollectionRuleDirect").SpawnInstance_
collectionRule.ResourceClassName="SMS_R_System"
collectionRule.ResourceID=ResourceID

'Delete CollectionMember
collection.DeleteMembershipRule collectionRule

End Sub

参考)

devblogs.microsoft.com

 

 

【SCCM】[VBScript] [WMI] デバイスコレクションのメンバーを取得する | Microsoft System Center Configuration Manager(SCCM)

f:id:takayuki-yoshida:20190421222641p:plain

 

はじめに 

Microsoft System Center Configuration Manager(SCCM) は、WMI(Windows Management Instrumentation)から操作ができます。特にデバイスコレクションでダイレクト規則のメンバーを、PowerShell、VBScriptから一括登録・削除できると作業を省力化できますし、大規模環境でのSCCM管理者は必要になると思います。

また、ワークフローシステムと組み合わせて、アプリケーション配信を自動化するなどで運用自動化にも応用できると思います。

ここではVBScriptから操作する方法を記載します。

 

SCCMサーバーへ接続する

ここではSCCMサーバーへ接続するためのFunctionプロシージャのみです。実際の操作時にプロシージャをコールして使用します。

Function Connect(server, userName, userPassword) 
On Error Resume Next
Dim net Dim localConnection Dim swbemLocator Dim swbemServices Dim providerLoc Dim location
Set swbemLocator = CreateObject("WbemScripting.SWbemLocator") swbemLocator.Security_.AuthenticationLevel = 6 'Packet Privacy. ' If the server is local, do not supply credentials. Set net = CreateObject("WScript.NetWork") If UCase(net.ComputerName) = UCase(server) Then  localConnection = true userName = "" userPassword = "" server = "." End If
' Connect to the server. Set swbemServices= swbemLocator.ConnectServer _ (server, "root\sms",userName,userPassword) If Err.Number<>0 Then Wscript.Echo "Couldn't connect: " + Err.Description Connect = null Exit Function End If
' Determine where the provider is and connect. Set providerLoc = swbemServices.InstancesOf("SMS_ProviderLocation") For Each location In providerLoc If location.ProviderForLocalSite = True Then Set swbemServices = swbemLocator.ConnectServer _ (location.Machine, "root\sms\site_" + _ location.SiteCode,userName,userPassword) If Err.Number<>0 Then Wscript.Echo "Couldn't connect:" + Err.Description Connect = Null Exit Function End If Set Connect = swbemServices Exit Function End If Next Set Connect = null ' Failed to connect. End Function

参考)

 

デバイスコレクションのメンバーを取得する

デバイスコレクションのメンバーを取得するサンプルスクリプトです。MSページでは3種類のクエリ方法が記載されていますが、このサンプルでは1番目のみ記載しています。(基本的には1番目で動作します)

SCCMでは、デバイスが「ResourceID」で管理されていますので、ResoueceIDとデバイス名を出力するようにしています。

なお、コレクションIDは事前にSCCM管理コンソールから調べておいてください。

  • 実行方法

VBScript内で前述の接続Functionプロシジャーを含めてください。

set connection = Connect("サーバー名","ユーザー名"."パスワード")
call EnumerateCollectionMembers(connection,"コレクションID(例)SMS00001")

 

Sub EnumerateCollectionMembers(connection,strCollectionID)
Const wbemFlagReturnImmediately = 16
Const wbemFlagForwardOnly = 32 ' Set required variables. ' Note: Values must be manually added to the queries below. Dim Query1
Dim ListOfResources1
Dim Resource1
' The following example shows how to enumerate the members of the All Systems collection. Query1 = "SELECT ResourceID FROM SMS_FullCollectionMembership WHERE CollectionID = '" & strCollectionID &"'" ' Run query. Set ListOfResources1 = connection.ExecQuery(Query1, , wbemFlagForwardOnly Or wbemFlagReturnImmediately) ' The query returns a collection that needs to be enumerated. Wscript.Echo " " Wscript.Echo "Query: " & Query1 For Each Resource1 In ListOfResources1 'ResourceID,name
Wscript.Echo Resource1.ResourceID & "," & Resource1.name Next End Sub

 参考)


【Python】 Twitter APIを使って Windows 7 の延長サポート終了日までの日数をつぶやく

はじめに

個人的にPythonの勉強をかねて作成してみました。こちらのソースコードはPython3とWindows10上で動かしています。

なお、Twitter APIの使用制限が厳しいらしいので、ご注意ください。参考記事にリンクを貼っておきます。

実行方法にあるコマンドをバッチにして、タスクスケジューラーで実行すれば自動でつぶやきます。

 

事前準備

  • Pythonインストール

下記の公式ページからダウンロードしてインストールする

www.python.jp

 

  • ライブラリ requests requests-oauthlib のインストール

pipインストールでライブラリをインストールします

pip install requests requests-oauthlib

 

  • Twitterアプリケーションの作成

下記のリンクから登録します。参考記事を参考にしてください。

Twitter Developer Platform — Twitter Developers

 

 

ソースコード 

  •  postWin7EOSLcounter.py
#jsonモジュール
import json
#OAuthライブラリ
from requests_oauthlib import OAuth1Session 
#日付ライブラリ
import datetime

#TwitterAPI
#[Twitter]Consumer API keys
#CONSUMER_KEY
CK = "xxxxxxxxxxxxxxxxxxxxxxx"
#CONSUMER_SECRET CS = "xxxxxxxxxxxxxxxxxxxxxxx"
#[Twitter]Access token & access token secret #ACCESS_TOKEN
AT = "xxxxxxxxxxxxxxxxxxxxxxx" #ACCESS_TOKEN_SECRET
ATS = "xxxxxxxxxxxxxxxxxxxxxxx" #現在の日付の取得 dtToday = datetime.date.today() #Win7のEOSL 2020-1-14 dtWin7EOSL = datetime.date(2020, 1, 14) #Win7のEOSLまでの日にちを計算 strRemainingDate = str((dtWin7EOSL-dtToday).days) #認証処理 twitter = OAuth1Session(CK, CS, AT, ATS) #ツイートポストエンドポイント url = "https://api.twitter.com/1.1/statuses/update.json" #Tweetメッセージ/nは改行コード strtweet = ("[bot] Windows7の延長サポート終了まで\nあと " + strRemainingDate + " 日 ") params = {"status" : strtweet} #投稿/post res = twitter.post(url, params = params) if res.status_code == 200:
#投稿完了の場合 print("投稿しました") else:
  #投稿エラーの場合 print("エラー: %d"% res.status_code)

 

実行方法

コマンドプロンプトから下記のコマンドを実行

python postWin7EOSLcounter.py

 

 

参考記事

  • PythonでTwitter API を利用していろいろ遊んでみる - Qiita

こちらの記事を参考にさせていただきました。大変わかりやすいです!ぜひ見てください。

qiita.com

 

  • TwitterAPIの使用条件

www.itmedia.co.jp