再起動やログオフせずに Active Directory のグループメンバーシップを更新する方法

コンピューターまたはユーザー アカウントを Active Directory (AD) セキュリティ グループに追加した後でよくある問題として、新しいアクセス許可や GPO がすぐに有効にならないことが挙げられます。そのため、何らかの方法で更新する必要があります。通常は、再起動またはユーザーのログオフを行いますが、それがすぐに実行できない場合や、単に不便な場合もあります。そこで、Kerberos チケットとコマンド ライン ツールを使ったいくつかのトリックが役立ちます。これらは完璧ではなく、常に万全というわけではありませんが、ほとんどの場合、完全な再起動を行わなくても目的を達成できます。ただし、これは主に NTLM ではなく Kerberos に依存するサービスやアプリで機能することを覚えておいてください。そのため、それでも動作がおかしくなる場合は、最終的には再起動またはログオフが必要になる可能性があります。それでも、頻繁に再起動を避けたい場合は、試してみる価値はあります。

再起動せずにコンピュータのグループメンバーシップと Kerberos チケットを更新する

仕組みはこうです。コンピューターをグループに追加すると、システムはグループ情報をキャッシュするKerberosチケットを発行します。これらのチケットは自動的に更新されるだけでなく、マシンの起動時やログイン時に実行されるチケット付与プロセスにも関連しています。そのため、強制的に更新するには、これらのチケットをクリアし、ポリシーを更新する必要があります。これは、複数のPCをリモートまたはVPN経由で管理していて、再起動が困難な場合に特に便利です。

まず、マシンがどのグループに属していると認識しているかを確認します。管理者特権のコマンドプロンプトから次のコマンドを実行します。

gpresult /r /scope computer 

これにより、コンピュータのすべてのセキュリティグループが一覧表示されます。コンピュータが保持しているKerberosチケットを確認するには、以下のコマンドを実行します。

klist.exe -li 0x3e7 

注: 0x3e7 はローカル SYSTEM セッションに対応します。Windows はローカルシステムのキャッシュを個別に扱うため、この値が必要になります。

次に、Active Directory ユーザーとコンピューター または PowerShell を使用して、マシンを新しい AD グループに追加します。

Add-ADGroupMember -Identity "YourGroupName" -Members wks-mns21$

`”YourGroupName”` を実際のグループ名に、`”wks-mns21$”` をマシンのホスト名またはアカウントに置き換えてください。チケットを素早く削除するには、以下の手順を実行してください。

klist -lh 0 -li 0x3e7 purge 

Windows 7 / Server 2008 R2 の場合、このコマンドは若干異なる場合がありますが、ほとんどの最新の Windows 10/11/Server 2016 以降のマシンでは、次のコマンドを使用します。

klist --li 0x3e7 purge 

これにより、すべてのKerberosチケットが消去され、次回のアクセス時にマシンは新しいチケットを要求するようになります。その後、以下を実行します。

gpupdate /force 

これにより、再起動せずに最新のグループポリシー設定がプッシュされます。すべてがうまくいけば、そのグループに関連付けられたポリシーが適用され、新しいグループメンバーシップが反映されるはずです。

「現在のログオンIDは…」というエラーが表示されたり、操作が進まなくなったりした場合は、コマンドをSYSTEM権限で実行する必要があるかもしれません。Sysinternalsに含まれるPsExecを使えば、以下の手順で実行できます。

psexec -s -i -d cmd.exe 

次に、SYSTEMコンテキスト内でコマンドklist purgegpupdate /forceコマンドを実行します。これは少し巧妙な方法ですが、通常の管理者権限でアクセスできない場合に役立つことがよくあります。

この方法は、再起動はできないが更新をすぐに適用する必要があるリモート クライアントまたは VPN 接続クライアントにとって救世主となります。

ログオフせずにユーザーグループのメンバーシップを再読み込みする

セキュリティグループへの追加は、ログアウトして再度ログインするまで有効になりません。これは従来のWindowsの仕様です。ただし、強制的にログアウトさせることなくアクティブなセッションでグループを更新する必要がある場合は、ユーザーのKerberosチケットを消去することもできます。これは、共有リソースへのアクセスを許可するADグループにユーザーを追加した直後などに特に便利です。

そのユーザーとしてコマンドプロンプトを開きます。管理者モードではなく、通常のシェルです。次のコマンドを実行します。

klist purge 

これにより、グループメンバーシップを含むすべてのKerberosチケットがクリアされ、次回のリクエストで強制的に更新されます。新しいグループメンバーシップを確認するには、更新されたトークンを含む新しいコマンドウィンドウを作成してください。

runas /user:DOMAIN\username cmd 

次に、次のグループをリストします。

whoami /groups 

リモート デスクトップ (RDS) セッションがある環境の場合は、PowerShell を使用してすべてのユーザーに対してリモートでこれを実行できます。

Get-WmiObject Win32_LogonSession | Where-Object {$_. AuthenticationPackage -ne 'NTLM'} | ForEach-Object {klist.exe purge -li ([Convert]::ToString($_. LogonId, 16))} 

ただし、権限をすぐに反映させるには、そのユーザー (または各 RDS セッション) のファイル エクスプローラー プロセスを再起動する必要がある場合があります。

  1. コマンドプロンプトを開きます。
  2. 探検家を殺す:taskkill /f /im explorer.exe
  3. 同じ資格情報を使用して新しい Explorer インスタンスを開始します。runas /user:DOMAIN\username explorer.exe
  4. 通常通りパスワードでログインしてください。

これは少し不格好ですが、アクティブなセッションでトークンを更新する唯一の方法であることがよくあります。

ご注意:短いサーバー名(\\SERVER\Sharingなど)を使用していて、その後 FQDN(\\server.company.local\Sharing)に切り替えると、異なる Kerberos チケットが発行されます。NetBIOS 名を使用すると、グループ情報をより早くリセットできる場合があります。チケットをクリアした後、FQDN ではなく短い名前で共有にアクセスして、新しいチケットを強制的に発行してみてください。

チケットが最新であることを確認するには、次の TGT を確認してください。

klist tgt 

すべてのチケットの開始時刻が現在設定されている場合は、更新されたグループメンバーシップが表示されます。これにより、ログオフや再起動といった手間をかけずに、新しい権限が有効になります。

100% 確実ではありませんが、多くの場合、このアプローチにより、再起動が絶対に避けられなくなるまで、物事がスムーズに進行し続けます。

まとめ

  • 再起動せずに Kerberos チケットを消去するために使用しますklist.exe
  • 削除後に実行してgpupdate /force新しい GPO を適用します。
  • ユーザー グループを更新するには、セッション チケットを消去し、新しいコマンド セッションを開きます。
  • NTLM サービスでは、トークンを更新するためにログオフ/再起動が必要であることに注意してください。

まとめ

アクティブな環境でのグループメンバーシップの更新は、Windows管理のグレーゾーンと言えるでしょう。本来はそれほど複雑であるべきではないのですが、現状ではそうもいきません。これらのコマンドラインツールは、特にリモートセットアップや再起動が現実的でない場合に、多くの時間を節約できます。ただし、すぐに更新されない場合は、再起動が最終的な解決策となる場合があることを覚えておいてください。しかし、これらのヒントが、毎回再起動を回避できる程度には役立つことを願っています。