時間をおくと同期されるんだけど…の時間をおいたら実行される同期コマンドを実行するPowerShellスクリプト

Page content

概要

タスクスケジューラで8時間に一度実行されるコマンドは以下のPowerShellスクリプトで管理者権限で実行すると同じ動作になるはず。

公式のドキュメントが見当たらないコマンドを雰囲気で実行しているのでこの記事を真似して何が起こっても自己責任でお願いします🙏

まだ今日作ったばかりのスクリプトなのでこのスクリプトを実行して一晩パソコンを電源つけて置いたら治ったものがすぐ治ったになるかどうかは今後運用してみてまたブログ書きます

$EnrollmentID=((Get-ScheduledTask|where{($_.TaskPath) -match "\\Microsoft\\Windows\\EnterpriseMgmt\\[0-9ABCDEF]"})[0]).TaskPath|split-path -Leaf
Write-Output "EnrollmentID:$EnrollmentID"
Start-Process -wait C:\Windows\system32\deviceenroller.exe -ArgumentList "/o $EnrollmentID /c /b"
Write-Output "deviceenroller.exe end..."

Intune本で有名な国井さんのこの記事を大変参考にさせていただきました https://azuread.net/archives/9259

マサカリは優しく投げて欲しいです🙏

詳細

こん○○は、弊社はまだバリバリの境界型ネットワークをやっているので一度社外のネットワークに繋いだ端末を社内ネットワークに繋ぐなんてとんでもない!…というような運用をしているため、社員全員に在宅勤務用PCを配布しています。 その一方で社員の半数程度のメンバーのPC環境はCitrix DaaS for Azureになっているため、社内でも社外でも同じ環境を触ることが出来るようになってます。

で、弊社は基本的に出社メインなので何かあったとき以外は在宅勤務用PCって使わないんですよね…するとどうなるかというと電源を入れるのが2ヶ月ぶりです…みたいなPCが発生してCitrixのクライアントが起動しません!というような問い合わせがやってきます。

Windows Updateを最新まで適用すると治ったりするのですが、それでもダメだとCitrixのクライアントを再インストールすることになります。弊社の在宅勤務用PCはIntuneでセットアップを行っていて基本的にユーザには管理者権限は渡していません。

基本出社の会社でのっぴきならない事情で在宅勤務をしている為PCを明日持って来てくれたら直しますよーという訳にはいかず、何が何でもリモートで直さねばならないのです…

Intuneで管理してるので普通はIntuneからアプリをアンインストール→インストールで問題ないんですけど、稀によく何時まで経っても管理対象のアプリの様子が変わらないという事が発生します。 対象のPCを一晩電源をつけて置いておくとIntuneからのインストールやアンインストールが動くのでタスクスケジューラで時間をおくと実行されるコマンドを実行すれば良いのでは?と思い今回のスクリプトを作成しました。

ユーザに設定画面の同期ボタンを押してもらえば良いじゃん…と思うかもしれないですが、それでも上手く行かない事があるんですよね…ユーザに管理者権限を渡してないのが原因かボタンを押したときとコマンドオプションが違うのが原因かまでは調べて無いです…

で、タスクスケジューラに登録されたタスクの実行頻度や実行コマンドを見てできあがったのが以下のスクリプトです。

リモートで動かすなら何かしらの手段でPowerShellを管理者権限でリモートで実行する必要があります。(Microsoft Defender for Endpointのライブ応答のrunでも実行出来るはずです)

8時間に一度実行する物を無理矢理すぐに動かして居るので時間をおくと実行される同期がすぐに実行される事を期待したスクリプトではありますが、何が起こるかわかりません

EnrollmentIDの取得の際に管理者権限が無いとタスクが見えないので失敗します(エラー処理してないので必要なら追加して下さい) deviceenrollment.exeが管理者権限無しで動くかどうかは試して無いです…

$EnrollmentID=((Get-ScheduledTask|where{($_.TaskPath) -match "\\Microsoft\\Windows\\EnterpriseMgmt\\[0-9ABCDEF]"})[0]).TaskPath|split-path -Leaf
Write-Output "EnrollmentID:$EnrollmentID"
Start-Process -wait C:\Windows\system32\deviceenroller.exe -ArgumentList "/o $EnrollmentID /c /b"
Write-Output "deviceenroller.exe end..."

その他

謎なdeviceenroller.exe

Endpoint Mangerのデバイスページから同期ボタンを押したときには以下のコマンドを実行するタスクが作られてるっぽいけど何が違うんだろうか全く分からないです…

C:\Windows\system32\deviceenroller.exe /o デバイスエンロールID /c /q

登録してから323日後に開始されて49日間7日毎に実行されるというタスクもあってこれは証明書の更新関連かな…?という感じのSchedule created by enrollment client for renewal of certificate warningという名前になっているタスクもある。 証明書が1年で有効期限が切れるとかなのかな…

C:\Windows\system32\deviceenroller.exe  /c /r /d デバイスエンロールID

デバイスエンロールIDの直前のオプションが /o では無いのが気になる。 他にも /c /StatusPageTracking /o デバイスエンロールID でnetsvcsから呼び出されてたりとかもする

Intuneの同期周りで困ったときに読むと良さそうな公式のドキュメント

https://docs.microsoft.com/en-us/mem/intune/remote-actions/device-sync

https://docs.microsoft.com/en-us/mem/intune/user-help/check-device-access-windows-cpapp 弊社のデバイスはDEM登録なのでポータル使えないんですよ…

DaaS使ってるならBYODで良いじゃん

って思うけど規定周りの整備が追いついてないので社給PC以外のPCで会社のリソースが触れないのと、何とびっくり家にパソコンがありませんと言う人が結構居るらしい…

ゼロトラストネットワークにしなよ

今やってる所です!