サイトのユーザー情報 (表示名、メールアドレス) を一括で変更する方法

こんにちは。
SharePoint サポート チームの成田です。

今回は SharePoint Server 2010 および 2013 において、サイトのユーザー情報 (表示名、メール アドレス) を複数ユーザー分まとめて最新の情報に更新する方法について書きたいと思います。
サイトのユーザー情報は SharePoint のプロファイルから同期されますが、プロファイルの情報が正しくない場合や、プロファイルからサイトへの同期が正しく動作していない場合は、サイトの情報が期待したデータにならないことがあります。 サイトへのユーザー情報 (プロファイル) の同期の詳細については下記のブログで紹介されていますのでご確認ください。(かなり詳しく書かれています)

サイト コレクションのユーザー情報へのユーザー プロファイル同期の仕組みについて (まとめ)
https://blogs.technet.com/b/sharepoint_support/archive/2013/11/10/3608500.aspx

サイトのユーザー情報が古いままだと、サイト上部に表示される自分の名前が古いままだったり、リストに通知を設定してもメール アドレスが古いため通知が届かなかったりする現象が発生します。
しかるべき設定を行っておけば [AD -> プロファイル -> サイト] の順に情報が更新され、ある程度の時間が経てば最新の情報が更新されるはずなのですが、「すぐに更新したい!」「同期に問題が発生しているため暫定回避したい!」などの場合には、サイトの情報を直接更新することが可能です。(プロファイル機能は SharePoint Server の機能ですので、SharePoint Foundation では特に有効ですね。)
具体的には Set-SPUser コマンドを使用するのですが、今回は “全てのサイト” の “全てのユーザー” の情報を、最新の AD 上の表示名とメールアドレスの情報に一括で更新するスクリプトをご紹介します。

サンプル スクリプト
--------------------------
下記のテキストを拡張子 ps1 のファイル (例: script.ps1) として保存し、PowerShell から実行します。
ハイライトされている部分を実際のドメイン名に置き換えてください。(システム アカウントなどの更新が不要なアカウントに対してコマンドが実行させない目的でドメイン名を指定します)

-----
Add-PSSnapIn Microsoft.SharePoint.PowerShell -ea silentlycontinue
$domain = "contoso"
$sites = Get-SPSite
foreach ($web in $sites.AllWebs)
{
Write-Host ("--- " + $web.url + " ---")
$users = $web.AllUsers
foreach($user in $users)
{
if($user.userlogin -match $domain)
{
Write-Host ($user.userlogin + " を更新中...")
Set-SPUser $user.UserLogin -web $web.Url -SyncFromAD
}
}
Write-Host ("")
}
-----

なお、上記のコマンド、スクリプトで更新される情報は表示名とメール アドレスだけです。 Set-SPUser コマンドで更新できる情報がこれらの情報に限られることがその理由です。
もし、電話番号、部署、上司などのその他のプロパティを更新したい場合は、各サイトの “ユーザー情報リスト” と呼ばれるリストのアイテムを更新する必要があり、これを自動化するには高度なスクリプティングが必要になります。
下記のブログでは AD から最新の情報を取得してユーザー情報リストを更新するスクリプトの例が紹介されているようです。

https://www.hornerit.com/2012/12/sharepoint-2010-foundation-user-profile.html

前述しましたが、通常は [AD -> プロファイル -> サイト] の順に情報が更新されるため、あまり意識しなくてもユーザー情報は更新されることも多いと思います。
もし期待したとおりに同期されない場合には問題を解決する必要がありますが、取り急ぎ回避したい時などにご活用ください!