ソースデータ:
- ドメインレベル:Windows 2008 R2
- Sharepointサーバー:Windows Server 2012 Standart
- すべての更新プログラムを含むSharePoint 2010バージョン
タスクの目標
タスクの目標は、動的に更新される電話帳を迅速に展開することでした。電話帳のデータソースはActive Directoryです。
問題解決
このタスクに対する私のソリューションは、Sharepointの専門家にとって画期的なものではありませんが、同様のタスクに直面する初心者のシステム管理者にとっては興味深いかもしれません。 興味がある人のために、猫をお願いします。
そのため、タスク全体を2つの段階に分けることができます。
- Active Directoryからデータをエクスポートします。
- Sharepointリストにデータをインポートします。
ADからデータをエクスポートする
ADからデータをエクスポートするには、PowerShell 2または3バージョンのActive Directoryモジュールを使用します。 興味のあるコマンドレットはGet-ADUserと呼ばれ、広範なヘルプがあります。 私たちはそれを使用します:
Get-ADUser -Filter {(ObjectClass -eq "user")} | FT Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber
このコードの実行結果は、サービスアカウントを含むドメインのすべてのユーザーのデータを含むテーブルになりますが、このテーブルには電話番号、メールアドレス、部署、従業員の職位などのデータはありません。 これは、デフォルトでは、PSが10個のAD関連プロパティのみを返すためです。 PSが必要なパラメーターを抽出する必要があることを示すために、Get-ADUsers -Parametersコマンドレットのパラメーターを使用します(タフトロジーはごめんなさい)。
Get-ADUser -Filter {(ObjectClass -eq "user")} -Properties Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | FT Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber
このコードは、ドメインのすべてのユーザーに必要なすべてのデータを表形式で返します。 ドメイン環境では、大量のサービス資格情報があると想定するのが論理的です。 空の「GivenName」フィールド、つまり「Name」を持つユーザーアカウントを拒否するフィルターを追加します。
Get-ADUser -Filter {(ObjectClass -eq "user") -and (GivenName -like "*")} -Properties Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | FT Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber
次に、受信したデータをCSVファイルにエクスポートします。 (当初はすべてを1つのスクリプトで実行する予定でしたが、PowerShell 3はSharepoint 2010コマンドレットをサポートしておらず、Powershell 2はPowerShell 3用に設計されたActive Directoryモジュールと連携できません)。 データをエクスポートするには、標準のPS Export-CSVコマンドレットを使用して、レーキを踏んだ:
- エクスポートされたデータは、タイプ4641548913248745でした 。 以前にコンソールに出力されたものはまったくありません。 結論:表形式のデータは私たちには合いません。 FTをSELECTに置き換えて取得...
- ...キリル文字の代わりにたくさんの質問。 データにキリル文字が含まれる場合、エクスポートエンコーディング(Unicode)を明示的に設定する必要があります。
また、Sharepointにこれを強制しないように、またCSVファイル(PowerShellによって残されたヘッダー)から最初の行を削除しないように、「名前」または「フルネーム」フィールドでアルファベット順にデータを並べ替える価値があります。
Get-ADUser -Filter {(ObjectClass -eq "user") -and (GivenName -like "*")} -Properties Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | sort-object -property Name | Select Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | Export-Csv D:\Contacts.csv -Encoding Unicode -NoTypeInformation
Sharepointリストにデータをインポートする
portalで利用可能なSharepointポータルと、ADからデータをインポートする標準の「連絡先」リストがあるとします。 PowerShellを介してSharepointに接続するには、Sharepointに含まれているSharepointレムナントをPowerShellに追加する必要があります。 ポータル「 portal 」にある必要な「連絡先」のリストへの接続の形式は次のとおりです。
add-pssnapin microsoft.sharepoint.powershell
$web = Get-SPWeb "http://portal"
$list = $web.lists[""]
このリストの解析にはあまり意味がないので、同期するたびにループを使用してすべてのエントリを削除することをお勧めします。
do {$list.items.delete(0)}
until ($list.items.Count -eq 0)
さて、実際にはインポート自体:
Import-Csv D:\Contacts.csv | ForEach-Object {
$item = $list.items.Add()
$item[" "] = $_.Name
$item[""] = $_.Company
$item[" "] = $_.telephoneNumber
$item[" "] = $_.mobile
$item[" "] = $_.Mail
$item[""] = $_.Title
$item.update()
}
味に他のオプションを追加してください...
PowerShell 3からのPowerShell 2
Sharepoint 2010をWindows Server 2012にインストールしたことを覚えていますか? ここに別のレーキがあります! いくつかの解決策があります:ADからのエクスポートとSharepointへのインポートを適時に分割するか、PowerShell 3からPowerShell 2を実行できます(メッセンジャーは多くのことを知っています...(s))。 これを行うには、最初のスクリプトに1行だけが必要です。
C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -version 2.0 "&'D:\Set-Contacts.ps1'"
実際にはそれだけです。 C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ PowerShell.exeをパラメーター「& 'D:\ Set-Contacts.ps1'」とともにタスクスケジューラーにドロップし、ADユーザーのデータを最新の状態に保つだけです。 お時間をいただきありがとうございます! 以下にスクリプトの完全版を残します。
Get-Contacts.ps1
Get-ADUser -Filter {(ObjectClass -eq "user") -and (GivenName -like "*")} -Properties Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | sort-object -property Name | Select Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | Export-Csv D:\Contacts.csv -Encoding Unicode -NoTypeInformation
C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -version 2.0 " & ' D:\Set-Contacts.ps1 ' "
Set-Contacts.ps1
add-pssnapin microsoft.sharepoint.powershell
$web = Get-SPWeb "http://portal"
$list = $web.lists[""]
do {$list.items.delete(0)}
until ($list.items.Count -eq 0)
Import-Csv D:\Contacts.csv | ForEach-Object {
$item = $list.items.Add()
$item[" "] = $_.Name
$item[""] = $_.Company
$item[" "] = $_.telephoneNumber
$item[" "] = $_.mobile
$item[" "] = $_.Mail
$item[""] = $_.Title
$item.update()
}