Microsoft flowを使ってみた

個人的には、IFTTTとかの自動連携ツールは大好きです。

そんな中、MicrosoftからでたMicrosoft Flowが面白そうなので、早速設定してみた。

 

今回は、日々読み切れないほど受信するメールの中から、特にすぐに確認しなければいけないメールを受信したときに、iPhoneで通知してくれるように設定してみました。

 

まず意外と手こずったのが、FlowとOutlookの接続設定。

接続の設定でOutlookを接続しておく必要があるが、

自分がつかっているのがOffice365かOutlook.comなのかわからない。。。

めんどくさいので両方登録しておいた。

 

実際には、office365の受信動作で動いているので、こっちが正しいと思われます。

 

 次に実際にフローを作成します。

今回は、ベースのテンプレートとして、

f:id:zztasu:20170705134151p:plain

 これを利用しました。

 

 

今回はiphoneにだけ通知が来ればいいので、

Office365のNotificationを削除して利用してます。

 

f:id:zztasu:20170705124442p:plain

 

条件の項目は、きちんとFromとToを指定したかったので、

GUIではできず、以下のように記載しました。

 

@and(equals(triggerBody()?['From'], '送る人のメアド'),contains(triggerBody()?['To'], '自分のメアド'))

 

設定後、設定したフローを見ると、接続がきちんとされているか確認できる。

 

f:id:zztasu:20170705125246p:plain

 

 

早速、メールを送ってみます。

f:id:zztasu:20170705130331p:plain

フローが流れて、今回は判定がfalseのため、通知されなかったことがわかります。

 

本当は成功ログも記載したかったのですが、Fromの人からなかなかメールが来ないので、次回来た時に乗せるようにします。

 

このFrowは、office365と連携できるし、SharePointなども連携できるので、工夫次第でかなりいろいろとできる気がする。

また便利な使い方を思いついたら公開したいと思います。

 

VBSによる簡易クリップボード履歴保存

客先常駐など、自由にソフトウェアをインストールできないときに、
メモ帳にクリップボード履歴を保存し、呼び出すための簡易スクリプトです。

これをスタートメニューで自動起動しておきます。
履歴を保存するファイル、clipbord.txt を、ショートカットキーで起動できるようにしておけば、
ショートカットキーからいつでもクリップボード履歴を呼び出せます。


基本動作は、以下の通りです。

  1. 3秒毎にクリップボードを監視し、値を取得
  2. 取得した値が、保存用のclipbord.txtに存在するか確認
  3. 存在しなかったら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