はじめに
背景としてはへーしゃでは現場や常駐先より本社に戻ってきた社員が一時的(当日返却)に利用するPCがあります。
がっ、1つのアカウントを使いまわしているので以前にMicrosoft365を利用したユーザーがサインアウトしていないと、情報が残ってしまうし、サインアウトしていても情報は残っていると懸念点がありました。
(デスクトップ、ドキュメント、ダウンロード、ピクチャーフォルダなどはシャットダウン時に自動削除するようにスクリプト設定済みだが、Microsoft365については設定していなかった)
その際思いついたのが今回のコマンドであります。
※ユーザーデータ自体削除すれば済む話しではありますが…
手順
1.「.bat」ファイルを作成する
2.実行するだけ
1.「.bat」ファイルを作成する
.batファイルのコード
<# :
@echo off & setlocal EnableDelayedExpansion
if not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
set BATCH_ARGS=%*
for %%A in (!BATCH_ARGS!) do set "ARG=%%~A" & set "ARG=!ARG:'=''!" & set "PWSH_ARGS=!PWSH_ARGS! "'!ARG!'""
endlocal & Powershell -NoProfile -Command "$input|&([ScriptBlock]::Create((gc '%~f0'|Out-String)))" %PWSH_ARGS%
exit/b
: #>
# ここから下にPowerShellスクリプトを書き込むとコマンドプロンプトでPowerShellを実行できるようになる。
# ----------------------------------------------------------------------------------
# ========================================Office 365 Apps EnterPriseの強制ログアウト========================================
# --- 隠しフォルダ表示を有効化 ---
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name Hidden -Value 1
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name ShowSuperHidden -Value 1
# --- エクスプローラーの再起動 ---
Get-Process explorer -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Process explorer.exe
# ライセンストークンを削除する
remove-item "$Env:LocalAppData\Microsoft\Office\Licensing" -Force -Recurse
#共有コンピューター ライセンス認証の場合は以下のフォルダ
remove-item "$Env:LocalAppData\Microsoft\Office\16.0\Licensing" -Force -Recurse
#ライセンスキーを削除する
# $LicenseKey = ((cscript "$Env:ProgramFiles\Microsoft Office\Office16\ospp.vbs" /dstatus | Select-String 'last 5 chara') -split ': ')[1]
# if ($LicenseKey -ne $Null) {cscript "$Env:ProgramFiles\Microsoft Office\Office16\ospp.vbs" /unpkey:$LicenseKey}
#レジストリ上のライセンスキーも削除する
# reg delete "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Common\Licensing" /f
#OfficeアカウントIDを削除する
reg delete "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Common\Identity" /f
#共有アカウントの場合は以下のレジストリキー
$Sid = (Get-WmiObject win32_Useraccount | Where-Object {$_.caption -like "*$env:Computername\$env:UserName*"}).sid
reg delete "HKEY_USERS\$SID\SOFTWARE\Microsoft\Office" /f
#Microsoftアカウントからサインアウト
remove-item "$Env:LocalAppData\Packages\Microsoft.AAD.BrokerPlugin_cw5n1h2txyewy\AC\TokenBroker\Accounts" -force -Recurse
remove-item "$Env:LocalAppData\Packages\Microsoft.Windows.CloudExperienceHost_cw5n1h2txyewy\AC\TokenBroker\Accounts" -force -Recurse
remove-item "$Env:LocalAppData\Microsoft\TokenBroker\Cache" -force -Recurse
remove-item "$Env:LocalAppData\Microsoft\OneAuth" -force -Recurse
remove-item "$Env:LocalAppData\Microsoft\IdentityCache" -force -Recurse
# キャッシュ削除
cmd /c 'rmdir "%Appdata%\Microsoft\Office" /s /q'
cmd /c 'rmdir "%LOCALAPPDATA%\Microsoft\Office" /s /q'
cmd /c 'rmdir "%LOCALAPPDATA%\Microsoft\IdentityCache" /s /q'
reg delete "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office" /f
# 資格管理情報マネージャーにあるログイン情報の削除
cmdkey /delete:MicrosoftAccount:target=SSO_POP_Device
#====================================================================================================================================================================================================================================================================================================================
if(-not [Windows.Foundation.Metadata.ApiInformation,Windows,ContentType=WindowsRuntime]::IsMethodPresent("Windows.Security.Authentication.Web.Core.WebAuthenticationCoreManager", "FindAllAccountsAsync"))
{
throw "This script is not supported on this Windows version. Please, use CleanupWPJ.cmd."
}
Add-Type -AssemblyName System.Runtime.WindowsRuntime
Function AwaitAction($WinRtAction) {
$asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and !$_.IsGenericMethod })[0]
$netTask = $asTask.Invoke($null, @($WinRtAction))
$netTask.Wait(-1) | Out-Null
}
Function Await($WinRtTask, $ResultType) {
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
$asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
$netTask = $asTask.Invoke($null, @($WinRtTask))
$netTask.Wait(-1) | Out-Null
$netTask.Result
}
$provider = Await ([Windows.Security.Authentication.Web.Core.WebAuthenticationCoreManager,Windows,ContentType=WindowsRuntime]::FindAccountProviderAsync("https://login.microsoft.com", "organizations")) ([Windows.Security.Credentials.WebAccountProvider,Windows,ContentType=WindowsRuntime])
$accounts = Await ([Windows.Security.Authentication.Web.Core.WebAuthenticationCoreManager,Windows,ContentType=WindowsRuntime]::FindAllAccountsAsync($provider, "d3590ed6-52b3-4102-aeff-aad2292ab01c")) ([Windows.Security.Authentication.Web.Core.FindAllAccountsResult,Windows,ContentType=WindowsRuntime])
$accounts.Accounts | % { AwaitAction ($_.SignOutAsync("d3590ed6-52b3-4102-aeff-aad2292ab01c")) }
Write-Host "エクスプローラー設定を元に戻しますEnterを押してください。"
Read-Host
Clear-Host
# --- 隠しフォルダ表示を無効化 ---
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name Hidden -Value 2
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name ShowSuperHidden -Value 2
# --- エクスプローラーの再起動 ---
Get-Process explorer -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Process explorer.exe
Write-Host "完了しました。終了するにはEnterを押してください。"
Read-Host