Microsoft flowを使ってみた
個人的には、IFTTTとかの自動連携ツールは大好きです。
そんな中、MicrosoftからでたMicrosoft Flowが面白そうなので、早速設定してみた。
今回は、日々読み切れないほど受信するメールの中から、特にすぐに確認しなければいけないメールを受信したときに、iPhoneで通知してくれるように設定してみました。
まず意外と手こずったのが、FlowとOutlookの接続設定。
接続の設定でOutlookを接続しておく必要があるが、
自分がつかっているのがOffice365かOutlook.comなのかわからない。。。
めんどくさいので両方登録しておいた。
実際には、office365の受信動作で動いているので、こっちが正しいと思われます。
次に実際にフローを作成します。
今回は、ベースのテンプレートとして、
これを利用しました。
今回はiphoneにだけ通知が来ればいいので、
Office365のNotificationを削除して利用してます。
条件の項目は、きちんとFromとToを指定したかったので、
GUIではできず、以下のように記載しました。
@and(equals(triggerBody()?['From'], '送る人のメアド'),contains(triggerBody()?['To'], '自分のメアド'))
設定後、設定したフローを見ると、接続がきちんとされているか確認できる。
早速、メールを送ってみます。
フローが流れて、今回は判定がfalseのため、通知されなかったことがわかります。
本当は成功ログも記載したかったのですが、Fromの人からなかなかメールが来ないので、次回来た時に乗せるようにします。
このFrowは、office365と連携できるし、SharePointなども連携できるので、工夫次第でかなりいろいろとできる気がする。
また便利な使い方を思いついたら公開したいと思います。
VBSによる簡易クリップボード履歴保存
客先常駐など、自由にソフトウェアをインストールできないときに、
メモ帳にクリップボード履歴を保存し、呼び出すための簡易スクリプトです。
これをスタートメニューで自動起動しておきます。
履歴を保存するファイル、clipbord.txt を、ショートカットキーで起動できるようにしておけば、
ショートカットキーからいつでもクリップボード履歴を呼び出せます。
基本動作は、以下の通りです。
- 3秒毎にクリップボードを監視し、値を取得
- 取得した値が、保存用のclipbord.txtに存在するか確認
- 存在しなかったらclipbord.txtの一番下に追記
phrase.txt に、固定文書をあらかじめ保存、登録しておくことで、
定型文としてすぐに呼び出すことができます。
clipbord.txt
phrase.txt
この二つのファイルは、同じフォルダに配置する必要があります。
Dim GetClipboardText Dim objHTML Dim objFSO ' FileSystemObject Dim objFile ' ファイル書き込み用 Dim objFilepath Dim objTemp On Error Resume Next Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFilepath = WScript.CreateObject("Scripting.FileSystemObject") objFilepath = objFilepath.GetFile(WScript.ScriptFullName).ParentFolder.Path objFSO.DeleteFile "clipbord.txt" Set objFile = objFSO.OpenTextFile( objFilepath & "\phrase.txt", 1) objTemp = objFile.ReadAll Set objFile = Nothing Set objFile = objFso.OpenTextFile(objFilepath & "\clipbord.txt" , 2 , True) objFile.WriteLine "20" & date objFile.WriteLine objTemp Set objFile = Nothing do Set objFile = objFSO.OpenTextFile( objFilepath & "\clipbord.txt", 1) Set objHTML = CreateObject("htmlfile") GetClipboardTextOld = objHTML.ParentWindow.ClipboardData.GetData("text") objTemp = objFile.ReadAll I = InStr( objTemp, GetClipboardTextOld ) If I > 0 then objFile.Close Else objFile.Close Set objFile = objFSO.OpenTextFile( objFilepath & "\clipbord.txt", 8) objFile.WriteLine(GetClipboardTextOld) objFile.Close end If WScript.Sleep 3000 Set objFile = Nothing Set objHTML = Nothing loop Set objFSO = Nothing
Windows環境で、プリンターをバッチで追加する
Windwosにプリンターコマンドやバッチで追加する方法です。
::利用プリンタサーバ名 printer.server.com @echo off cls ::対象プリンターが複数ある場合に、選択 echo ******* 利用するプリンタを選択 ******* echo [1] : PrinterA echo [2] : PrinterB echo [0] : 作業をやめる echo 複数のプリンタを追加したい場合は、このバッチを複数回実行してください echo (その場合最後に追加したプリンタが通常使うプリンタに設定されます) echo *************************************************** set /p NUM="一覧から利用するプリンタを数字で選んでください >" if "%NUM%"=="1" goto PrinterA if "%NUM%"=="2" goto PrinterB if "%NUM%"=="0" echo 作業を中止しました & timeout 2 > nul & exit :PrinterA echo PrinterAを設定しています echo しばらくお待ちください。 Please wait..... rundll32 printui.dll,PrintUIEntry /in /n\\ printer.server.com\PrinterA echo 完了しました & timeout 2 > nul & exit :PrinterB echo PrinterBを設定しています echo しばらくお待ちください。 Please wait..... rundll32 printui.dll,PrintUIEntry /in /n\\ printer.server.com\PrinterB echo 完了しました & timeout 2 > nul & exit
PowerShellでフォルダのACLを一括設定する
フォルダをアクセス権を設定したいセキュリティグループ名のリストをCSVで用意し、
このps1スクリプトに実行させます。
付与される権限は固定
下記の例
$aclparam = @($ADGroup, "Modify, Synchronize" ,"ContainerInherit, ObjectInherit","None","Allow")
は、
「変更」「読み取りと実行」「フォルダーの内容の一覧表示」「読み取り」「書き込み」
を対象のセキュリティグループに追加します。
CSVのフォーマット
Tfolder,Agroup
対象フォルダ1,対象セキュリティグループ1
対象フォルダ2,対象セキュリティグループ2
# ダイアログを表示 if($dialog.ShowDialog() -eq "OK"){ # [OK]ボタンがクリックされたら、選択されたファイル名(パス)を表示 $dialog.FileName + " が選択されました。" } $CsvFileName = $dialog.FileName Write-Host $CsvFileName #get-content samplelist.csv > unicode.csv $arrayData = @(import-csv $CsvFileName) $j = $arrayData.Length Write-Host $j for ($i=0; $i -lt $j; $i++){ $FolderPath = "対象フォルダの一つ上位のフォルダパス" + $arrayData[$i].TFolder $ADGroup = $arrayData[$i].AGroup Write-Host $FolderPath Write-Host $ADGroup $aclparam = @($ADGroup, "Modify, Synchronize" ,"ContainerInherit, ObjectInherit","None","Allow") $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $aclparam $acl = Get-Acl $FolderPath $acl.AddAccessRule($rule) Set-Acl $FolderPath -AclObject $acl Write-Host $i }
リモートホストのWindowsUpdateが最新か確認し、かつ最後にUpdateされた日時と実行されたKB番号を取得する
WindowsUpDateは、本来はWSUSで管理すればいいのだが、どうしてもそれができない現場というのがあります。
そういう時に、管理している端末のWindowsUpDateの状況を確認するのに、1台ずつアクセスして確認していては時間がかかるので、
VBAで取得するコードを書きました。
必ずしもすべての端末が起動しているとは限らないので、まずはPingを打って疎通と起動を確認してます。
WakeOnLanができればいいのですが、それはまた次の機会に設定してみようと思います。
'対象ホストにPingを打つFunction Function GetPingResult(Host) Dim objPing As Object Dim objStatus As Object Dim Result As String Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}"). _ ExecQuery("Select * from Win32_PingStatus Where Address = '" & Host & "'") For Each objStatus In objPing Select Case objStatus.StatusCode Case 0: strResult = "Connected" Case 11001: strResult = "Buffer too small" Case 11002: strResult = "Destination net unreachable" Case 11003: strResult = "Destination host unreachable" Case 11004: strResult = "Destination protocol unreachable" Case 11005: strResult = "Destination port unreachable" Case 11006: strResult = "No resources" Case 11007: strResult = "Bad option" Case 11008: strResult = "Hardware error" Case 11009: strResult = "Packet too big" Case 11010: strResult = "Request timed out" Case 11011: strResult = "Bad request" Case 11012: strResult = "Bad route" Case 11013: strResult = "Time-To-Live (TTL) expired transit" Case 11014: strResult = "Time-To-Live (TTL) expired reassembly" Case 11015: strResult = "Parameter problem" Case 11016: strResult = "Source quench" Case 11017: strResult = "Option too big" Case 11018: strResult = "Bad destination" Case 11032: strResult = "Negotiating IPSEC" Case 11050: strResult = "General failure" Case Else: strResult = "Unknown host" End Select GetPingResult = strResult Next Set objPing = Nothing End Function 'Pingを打って結果を保存 Sub GetIPStatus() Dim Cell As Range Dim ipRng As Range Dim Result As String Dim Wks As Worksheet 'シート名はworkとする '対象ホスト名記載の列は"B3"から Set Wks = Worksheets("work") Set ipRng = Wks.Range("B3") Set RngEnd = Wks.Cells(Rows.Count, ipRng.Column).End(xlUp) Set ipRng = IIf(RngEnd.Row < ipRng.Row, ipRng, Wks.Range(ipRng, RngEnd)) For Each Cell In ipRng Result = GetPingResult(Cell) Cell.Offset(0, 1) = Result Cell.Offset(0, 2) = Date & " " & Time Next Cell End Sub ================================================================================================== 'Ping結果がConnectedのものだけにWindowsUpdateを確認 Sub WinUpDateResult() Application.DisplayAlerts = False On Error Resume Next Dim TagetHostName As String Dim TagetHostPingResult As String '対象ホストのセルの行番号 y = 3 Do While Cells(y, 2).Value <> "" TagetHostName = Cells(y, 2).Value TagetHostPingResult = Cells(y, 3).Value If TagetHostPingResult = "Connected" Then Set objSession = CreateObject("Microsoft.Update.Session", TagetHostName) Debug.Print "TagetHostName = " & TagetHostName Debug.Print "エラーの番号:" & Err.Number Debug.Print "エラーの種類:" & Err.Description If Err.Number <> 0 Then Next Set objSearcher = objSession.CreateUpdateSearcher strSeatchCondition = "IsInstalled=0" Set objSearchResult = objSearcher.Search(strSeatchCondition) If objSearchResult.Updates.Count = 0 Then Cells(y, 6).Value = "未適用の更新ファイルなし" End If Set colHistory = ob jSearcher.QueryHistory(0, 1) For Each objEntry In colHistory Cells(y, 8).Value = objEntry.Title Cells(y, 7).Value = objEntry.Date Next Else End If y = y + 1 Loop Application.DisplayAlerts = True End Sub
PowerShellのコマンド一覧
最近VBSよりもPowerShellで作業することが増えてきたので、
備忘録的にコマンドを書いておきます。
以外と便利なのが、
format-table -autosize
これです。PowerShellだと、表示内容が切れしまい、画面コピーしてもログを出しても、
「○○○・・・・」
と表示されてしまうので、このオプションをつけることで、必要なカラムを表示できます。
- 指定OUからアカウント名、部署、ラストログオン一覧 Get-ADUser -Filter * -SearchBase "OUのDN名" -Properties * | format-table -autosize LastLogonDate,SamAccountName,Department - 指定OUからセキュリティグループに属するメンバー一覧 Get-ADUser -Filter { memberOf -RecursiveMatch "セキュリティグループのDN名" } -SearchBase "OUのDN名" | Format-Table name,SamAccountName -auto - グループメンバー一覧取得 Get-ADGroupMember -Identity セキュリティグループ名 | select SamAccountName - フォルダサイズ一覧(カレントフォルダ以下) Get-ChildItem | Select-Object Name,@{name="Size";expression={(Get-ChildItem $_.FullName -Recurse -Force | Measure-Object Length -Sum).Sum /1GB}} - PowerShellでのアカウントロック解除 Unlock-ADAccount -Identity Windowsアカウント名 -Server "ドメインコントローラ名" - コンソール画面で切れてしまう項目を広げて表示させる "目的のコマンド" | select -Expand "表示させたい項目名" 例) Get-ADUser -Properties MemberOf -Identity Windowsアカウント名 | select -Expand MemberOf