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

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

【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

 

【Windows】[バッチ] ping応答がなくなるまで待機する

 

はじめに

対象ホストにpingを打って、応答がなくなるのを待つバッチです。リモートからOS再起動を行いOS終了を待ってから、さらにバッチを実行したい場合などで活用してください。

また、リモートでOS再起動指示→「OS停止待ち.bat」→「OS起動待ち.bat」 と実行することで、バッチファイル上でOS再起動を待つで使えます。

【Windows】バッチで ping応答があるまで待機する OS起動待ち.bat | システム管理者向け - MR2オーナー吉田貴幸のブログ

 

バッチファイル(OS停止待ち.bat) 

  • OS停止待ち.bat

変数「HOST」に対象ホストのIPアドレス/ホスト名を入れてください。または%1で引数化すれば、共通化して使えると思います。

INTERVALとTIMEOUTCOUNTは、ご利用の環境に合わせて変更ください。

@echo off
REM ######################################################
REM OS停止待ちバッチ
REM PING応答がなくなるまでループ
REM 5秒×100回でタイムアウト
REM ######################################################

set COUNT=0
set TIMEOUTCOUNT=100
set INTERVAL=5
set HOST=127.0.0.1

REM ######################################################
REM メイン処理
REM PING結果で"ms TTL="がなかったら終了する REM ###################################################### :error set /a COUNT=COUNT+1 echo %HOST%の停止を待っています....%COUNT% if "%COUNT%" == "%TIMEOUTCOUNT%" goto errortimeout ping -n 1 %HOST% | find "ms TTL=" > NUL if ERRORLEVEL 1 goto notrespond timeout /t %INTERVAL% > nul goto error REM ###################################################### REM 終了処理(PING応答なし) REM ###################################################### :notrespond echo %HOST%が停止しました goto end REM ###################################################### REM 終了処理(タイムアウト) REM ###################################################### :errortimeout echo %HOST%の停止が確認できませんでした(タイムアウト) :end

 

【Windows】 [バッチ] ping応答があるまで待機する

 

はじめに

対象ホストにpingを打って、応答を待つバッチです。リモートからOS再起動を行いping応答を待ってから、さらにバッチを実行したい場合などで活用してください。

反対にOS停止待ちは下記をご参照ください

【Windows】バッチで ping応答がなくなるまで待機する OS停止待ち.bat | システム管理者向け - MR2オーナー吉田貴幸のブログ

 

バッチファイル(OS起動待ち.bat) 

  • OS起動待ち.bat

変数「HOST」に対象ホストのIPアドレス/ホスト名を入れてください。または%1で引数化すれば、共通化して使えると思います。

INTERVALとTIMEOUTCOUNTは、ご利用の環境に合わせて変更ください。

@echo off
REM ######################################################
REM OS起動待ちバッチ
REM PING応答があるまでループ
REM 5秒×100回でタイムアウト
REM ######################################################

set COUNT=0
set TIMEOUTCOUNT=100
set INTERVAL=5
set HOST=127.0.0.1

REM ######################################################
REM メイン処理
REM ping結果の"ms TTL="の文字列が存在するか確認し、存在したら終了 REM ###################################################### :error set /a COUNT=COUNT+1 echo %HOST%の起動を待っています....%COUNT% if "%COUNT%" == "%TIMEOUTCOUNT%" goto errortimeout ping -n 1 %HOST% | find "ms TTL=" > NUL timeout /t %INTERVAL% > nul if ERRORLEVEL 1 goto error REM ###################################################### REM 終了処理(PING応答あり) REM ###################################################### echo %HOST%が起動しました goto end REM ###################################################### REM 終了処理(タイムアウト) REM ###################################################### :errortimeout echo %HOST%の起動が確認できませんでした(タイムアウト) :end

 

【Windows】 [バッチ] 資格情報を指定してリモートデスクトップ接続する

 

説明

Windowsのリモートデスクトップ接続(mstsc.exe)を使用して、サーバーやリモートPCにリモートデスクトップ接続する際に、初回接続時にユーザー名とパスワードを要求されて認証が必要になってしまいますが、資格情報を事前に指定することで、資格情報の要求なしに接続することが出来ます。

システム管理をしていると、GUIで操作をしていると何かと煩雑になることがあるので、これをバッチにしておき、毎回認証要求なしにリモートデスクトップ接続をできるようにしました。

 

また、初めてリモートデスクトップ接続先サーバーに接続した際に「このリモートコンピュータの IDを識別できません。」のメッセージが出ることがあるので、あらかじめレジストリにキーを追加しておき、メッセージの表示を回避します。(ポリシーの設定により出ない場合もあります)

 

なお、バッチファイルではリモートデスクトップ接続後に、追加した資格情報及びレジストリの削除しています。

 

使い方

1.下記をコピーして、ファイル名を「mstsc.bat」 で保存します。

  • mstsc.bat
@Echo off
REM ############################
REM #接続先情報
REM ############################
Set SERVERNAME=%1
Set PORT=3389
Set USERNAME=%2
Set PASSWORD=%3

if ""%1""=="""" goto error
if ""%2""=="""" goto error
if ""%3""=="""" goto error


REM ############################
REM #このリモートコンピュータの
REM #IDを識別できません。を回避
REM #レジストリ追加
REM ############################
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /v AuthenticationLevelOverride /t REG_DWORD /d 0 /f

REM ############################
REM #資格情報の設定
REM ############################
Cmdkey /generic:TERMSRV/%SERVERNAME% /user:%USERNAME% /pass:%PASSWORD%
Timeout 1

REM ############################
REM #リモートデスクトップ接続
REM ############################
Start mstsc /v:%SERVERNAME%:%PORT%
Timeout 5

REM ############################
REM #設定した資格情報を削除する
REM ############################
Cmdkey /delete:TERMSRV/%SERVERNAME%

REM ############################
REM #このリモートコンピュータの
REM #IDを識別できません。を回避
REM #レジストリ削除
REM ############################
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /v AuthenticationLevelOverride /f

goto end


:error
ECHO 【使い方】mstsc.bat <接続先コンピュータ名> <接続ユーザーアカウント> <接続ユーザーパスワード>
ECHO.

:end

 ※うまく動かない場合、バッチファイル内の「Timeout」コマンドのスリープ時間を調整してください。

 

 

2.コマンドプロンプトを開き、下記のコマンドを実行します。

バッチ保存先パス\mstsc.bat <接続先コンピュータ名> <接続ユーザーアカウント> <接続ユーザーパスワード>

 

  • 実行結果例
C:\Users\xxxxx>C:\Users\xxxxx\デスクトップ\mstsc.bat pcname admin adminpw
この操作を正しく終了しました。

CMDKEY: 資格情報を正しく追加しました。

0 秒待っています。続行するには何かキーを押してください ...

0 秒待っています。続行するには何かキーを押してください ...

CMDKEY: 資格情報を正しく削除しました。
この操作を正しく終了しました。
C:\Users\xxxxx>

 

 

 

【Office 365】 [PowerShell] ユーザーの削除 Power Shell まとめ

f:id:takayuki-yoshida:20190106020037j:plain

目次

 

はじめに (Office365へのPowershell接続)

Office365へのPowershell接続を行います。方法は下記のリンクを参照。

www.startpassion.life

 

削除対象ユーザーの一覧取得

次のコマンドで削除対象のアクティブユーザーの UserPrincipalName (UPN) を取得します。

Get-MsolUser -All

 コマンド実行結果(例)

PS C:\Users\xxxx> Get-MsolUser -All

UserPrincipalName DisplayName isLicensed
----------------- ----------- ----------
username@domainname TEST True

 

ユーザーの削除

次のコマンドを実行します。

<Account>は「削除対象ユーザーの取得」で取得した「UserPrincipalName」を指定します

Remove-MsolUser -UserPrincipalName <Account>

コマンド実行結果(例)

※確認は「Y」を入力します

PS C:\Users\xxxx> Remove-MsolUser -UserPrincipalName username@domainname

確認
この操作を続行しますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): Y

 

ユーザーの削除(確認メッセージなし)

次のコマンドを実行します。

<Account>は「削除対象ユーザーの取得」で取得した「UserPrincipalName」を指定します

Remove-MsolUser -UserPrincipalName <Account> -Force

コマンド実行結果(例)

※メッセージは表示されません

PS C:\Users\xxxx> Remove-MsolUser -UserPrincipalName username@domainname -Force
PS C:\Users\xxxx>

 

削除されたユーザーの一覧取得

ユーザー削除後30 日間の猶予期間内に復元できる削除されたユーザーの一覧を取得するには、次のコマンドを実行します。

Get-MsolUser -All -ReturnDeletedUsers

コマンド実行結果(例)

PS C:\Users\xxxx> Get-MsolUser -All -ReturnDeletedUsers

UserPrincipalName DisplayName isLicensed
----------------- ----------- ----------
username@domainname test False

 

削除済みのユーザーの削除

ユーザー削除後30 日間の猶予期間内に復元できる削除されたユーザーを削除するには、次のコマンドを実行します。

※注意:このコマンドを実行すると削除済みユーザーを復元できなくなります

Remove-MsolUser -UserPrincipalName <Account> -RemoveFromRecycleBin

コマンド実行結果(例)
※確認は「Y」を入力します

PS C:\Users\xxxx> Remove-MsolUser -UserPrincipalName username@domainname -RemoveFromRecycleBin

確認
この操作を続行しますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): Y
PS C:\Users\xxxx>

 

削除済みのユーザーの削除(確認メッセージなし)

ユーザー削除後30 日間の猶予期間内に復元できる削除されたユーザーを「確認メッセージなし」で削除するには、次のコマンドを実行します。

※注意:このコマンドを実行すると削除済みユーザーを復元できなくなります

Remove-MsolUser -UserPrincipalName <Account> -RemoveFromRecycleBin -Force

コマンド実行結果(例)

※メッセージは表示されません

PS C:\Users\xxxx> Remove-MsolUser -UserPrincipalName username@domainname -RemoveFromRecycleBin -Force
PS C:\Users\xxxx>

 

削除済みのユーザーの削除(UPN重複によりObectIdを指定した削除)

ユーザー削除後30 日間の猶予期間内に復元できる削除されたユーザーで、作成削除を繰り返した場合など、同じUserPrincipalNameが複数存在する場合、ObjectIDを指定して削除する必要があります。

まず、削除済みユーザーのObjectIDを取得するため、次のコマンドを実行します

Get-MsolUser -All -ReturnDeletedUsers | select UserPrincipalName,DisplayName,isLicensed,ObjectID

コマンド実行結果(例)

PS C:\Users\xxxx> Get-MsolUser -All -ReturnDeletedUsers | select UserPrincipalName,DisplayName,isLicensed,ObjectID

UserPrincipalName DisplayName IsLicensed ObjectId
----------------- ----------- ---------- --------
username@domainname test False 849cd099-1273-45a4-ba1d-34ca3f7a1ff5
username@domainname test False 848f8b66-e342-4513-a62d-7f0b24083cfa

 

次にObjectIDを指定して対象ユーザーを削除するため、次のコマンドを実行します

※注意:このコマンドを実行すると削除済みユーザーを復元できなくなります

Remove-MsolUser -ObjectId <ObjectId> -RemoveFromRecycleBin

コマンド実行結果(例)

この例ではObectId「849cd099-1273-45a4-ba1d-34ca3f7a1ff5」を削除します。

※確認は「Y」を入力します

PS C:\Users\xxxx> Remove-MsolUser -ObjectId 849cd099-1273-45a4-ba1d-34ca3f7a1ff5 -RemoveFromRecycleBin

確認
この操作を続行しますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): Y
PS C:\Users\xxxx>

 

削除済みのユーザーの一括削除(確認メッセージなし)

削除済みのユーザーを確認メッセージなしで、複数を一括削除するには、次のコマンドを実行します。

※注意:このコマンドを実行すると削除済みユーザーを復元できなくなります

Get-MsolUser -All -ReturnDeletedUsers | ForEach-Object -Process{Remove-MsolUser -ObjectId $_.ObjectId -RemoveFromRecycleBin -Force}

コマンド実行結果(例)

※メッセージは表示されません

PS C:\Users\xxxx> Get-MsolUser -All -ReturnDeletedUsers | ForEach-Object -Process{Remove-MsolUser -ObjectId $_.ObjectId -RemoveFromRecycleBin -Force}
PS C:\Users\xxxx>

 

(参考)マイクロソフトページ

docs.microsoft.com

docs.microsoft.com