データ容量上限のあるWiFiに接続している時だけ、(たとえば)Amazon WorkDocsのプロセスを止める

# はじめに
アマゾン ウェブ サービス ジャパンの瀧澤です。
唐突ですが、Amazon WorkDocsを使っていますか？ Amazon WorkDocsは、完全マネージド型のセキュアなエンタープライズストレージなのですが、簡単に言うといわゆる「ファイル共有サービス」です。そして、単なるファイル共有だけでなく、PDFやPowerPointなどのファイルに対して、皆でコメントを付けてレビューを行う機能もあります。
そして、Webブラウザからのアクセスだけでなく、Windows, MacOSなどに、Amazon WorkDocs Sync クライアントが提供されており、ローカルフォルダと自動で同期することができます。
Amazon WorkDocsのサービスの詳細は[BlackBeltの資料](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-amazon-workdocs-amazon-workmail-58658632)を参照してください。


# ちょっとだけ困ること
私は、Amazon WorkDocsを常時使っており、仲間とのファイルやデータの共有に使っており、また、自分のノートPCと自分のAmazon WorkSpacesの間でのファイルの同期にも使っています。そして、Amazon WorkDocs Syncクライアントを使い、ローカルのフォルダにファイルが同期されるようにしている共有フォルダもあります。
とても便利なのですが、外出時、データ容量上限のあるモバイル通信サービスでテザリングをしている時に、大量のファイルがsyncされると、おおおーーーーー、という感じになってしまうところです。
（ファイルが大量に更新されていると、WorkDocsのsyncで大通信が発生し、テザリング用に使用しているモバイルデータ通信サービスのデータ容量上限に達してしまう。）


# ソリューション
というわけで、データ容量上限のあるWiFiに接続している時だけ、Amazon WorkDocs Syncクライアントを停止させるスクリプトを作成してみました。私は、普段、Windowsを使うことが多いので、PowerShellで書いてみます。
~~（MacOSでも同じロジックで作れると思います。）~~

```
2016/9/20追記：
MacOSでも同じロジックで作れました。
GitHub上に、MacOSとWindows両方に対応したPowerShellスクリプトをおいています。
https://github.com/yo1t/WorkDocs-NWchecker
```  
---


1. netsh wlan show interfaceで現在接続しているWiFiのSSIDを取得。-- *1) MacOSの場合は下記参照*
2. データ容量制限のあるSSIDならば、WorkDocsのプロセスをGet-Processで調べ、Stop-Processする。
3. データ容量制限のないSSIDで、WorkDocsのプロセスが動いてなければ、WorkDocsをStart-Processする。
4. 指定時間待ち、これらを繰り返す。

```
*1)
MacOSの場合、1のSSIDを取得する部分は、下記のコマンドで取得できます。 
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
```

なお、Amazon WorkDocs Syncクライアントを「ログイン時に起動」させている場合、このスクリプトは管理者権限で実行する必要があります。スタートメニューからユーザが実行させた場合は、管理者権限は不要です。

# ソースコード（PowerShell）
下記のスクリプトは、PowerShell for Windows用です。MacOS X用のPowerShellにも対応したスクリプトはGitHubにアップしています。
https://github.com/yo1t/WorkDocs-NWchecker

```PowerShell:WorkDocs-NWchecker.ps1
# CHANGE VALUE. SET YOUR WiFi-SSID, you want to stop WorkDocs. 
$ssid = "yo1-007"

# Set Checking interval for WiFi-SSID
$interval = 180

# Set Environment for WorkDocs
$WorkDocs = "\Programs\Amazon.com, Inc\Amazon WorkDocs.appref-ms"
$WorkDocsPath = [Environment]::GetFolderPath('StartMenu') + $WorkDocs
$WorkDocsProcessName = "AmazonWorkDocs"
$LogMessage = ""

# function of start process
function StartProcessList {
    Start-Process $WorkDocsPath
}

# function of stop process
function StopProcessList {
    Stop-Process -name $WorkDocsProcessName
}

$ManageProcess = "WorkDocs" 


# Main Process
while (1) {
    # Get SSID of wifi that is currently connected.
    $netsh_ssid = netsh wlan show interface | Select-String "    SSID                   :"
    $now_ssid = $netsh_ssid -replace ".*: "
    $LogMessage = "Now SSID is " + $now_ssid + ". " + $ManageProcess +": "

    # Get Now time for log
    $nowtime = Get-Date -Format "yyyy/MM/dd-HH:mm:ss"


    if ( $now_ssid -eq $ssid ) {
        # Process of Stop WorkDocs
        if ( ( Get-Process $WorkDocsProcessName -ErrorAction 0 )  ) {
            StopProcessList
            $logmessage = $logmessage + "try to stop."
        } else {
            $LogMessage = $LogMessage + "stopped."
        }

    } else {
        # Process of Start WorkDocs
        if ( ( Get-Process $WorkDocsProcessName -ErrorAction 0 )  ) {
            $LogMessage = $LogMessage + "still running."
        } else {
            StartProcessList
            $LogMessage = $LogMessage + "running."
        }
    }

    # Oputput Log
    Write-Output ($nowtime + " " + $LogMessage)

    # sleep for several seconds
    Start-Sleep -Seconds $interval
}

```

実行する前に、ソースコード２行目のSSIDを自分のものに変更してください。

実行方法：
> powershell WorkDocs-NWchecker.ps1

タスクスケジューラに登録する場合(「操作」に設定)：
> プログラム/スクリプト： %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
> 引数の追加： -Command "c:\tools\WorkDocs-NWchecker.ps1"


# まとめ
このコードをWindowsの「タスクスケジューラ」で「任意のユーザーのログイン時」に１回実行するタスクとして登録しておけば、接続しているWiFiのSSIDを3分ごとにチェックし、データ容量上限のあるWiFiに接続している時だけ、Amazon WorkDocsのプロセスを停止し、そうでないときは、Amazon WorkDocsのプロセスを開始させることができます。
Amazon WorkDocs syncクライアントのプロセスをStop-Processで停止させてしまっている点に関しては、改善したほうがよいかもしれません。タスクトレイアイコンの右クリックで、「終了」を選べるようにしたいのですが・・。（[UIAutomation PowerShell Extensions](https://uiautomation.codeplex.com)を使えばできるのかもしれません。）
こちらのスクリプトは、PowerShellでWiFiのSSIDを調べて、条件にあったSSIDならば、なんらかのプログラムを実行するサンプルということで。

# 免責
こちらのコードの使用は、自己の責任でお願いします。また、ここに記載の全ての内容については、個人の意見で、所属する企業や団体は関係ありません。