##今夜の一言
Qiitaのページがリニューアルされている!!
何か全体的に明るい感じになった?
そして、記事が書きやすくなってやす!あざす!
いやぁ、ここ最近忙しくてプライベートの人間関係も崩壊しそうですよ。。
どうすれば良いのか、仕事をしながらLineを返すってなかなか器用なことをできない人間。
とてもITの仕事をしているたぁ思えない旧時代人間ってやつです。
はぁ~ITが楽しくなる世の中って訪れますか?いや、使っている人は楽しいのかもしれない。
作り手にも楽しい世の中が訪れてほしい。
##というわけでPowerShellです!
2分位で読み終える記事です。
本当はね、ShibbolethっていうやつとDjangoの記事を書きたかったけど、リハビリだ。
仕事でADグループメンバーの属性を確認しなければならない場面に遭遇しました。
ところがですね。ADのユーザーとコンピュータってツールの画面構成だと
メンバーの属性を直接見れないってんで、PowerShellさんに登場してもらいました。
困ったときのお助けマン!下手なプログラムよりこのコマンドをパイプでつなげてくだけで
結構なことができるんじゃないか…
##試行錯誤から学ぶこと~その1~
実はですね。Get-ADUserってコマンドがあるんですが、全然よくわかってないんですね。
いつもこのコマンドを使うときに同じようなミスをやらかすのです。
Get-ADUser -Identity ~ -Filter ~
MicroSoftのページにも書いてあるけど、IdentityとFilterは併用できないっす。
どちらか片一方を指定して、条件を指定する形みたいなんですね。
ただ、上記のようにコマンドを実行したときのエラーメッセージが意味不明なんで、
いつも「???」ってなるんですよ。
Get-ADUser : 指定された名前のパラメーターを使用してパラメーター セットを解決できません
熟練のWindows技術者はどうやって上記のオプションを使いわけているのか気になるところです。
ちなみにどちらのオプションを指定しても以下のようなコマンド結果が返ってきますよ~
(下記の例はユーザーを指定してコマンドを実行した場合の結果です)
DistinguishedName : CN=netadmin1,OU=xxx,DC=xxx,DC=xxx
Enabled : True
GivenName :
Name : netadmin1
ObjectClass : user
ObjectGUID : xxx-xxx-xxx-xxx-xxx
SamAccountName : netadmin1
SID : S-x-x-x-xxx-xxx-xxx-xxx
Surname : netadmin1
UserPrincipalName : netadmin1@xxx.xxx
##試行錯誤から学ぶこと~その2~
この話の2つ目の教訓なんですけどね。
当然、仕事で使うコマンドなんで対象ユーザー数が3000名位いたわけなんですよ。
1個1個SamAccountNameを指定してコマンド打ってたら、
また、プライベートが崩壊してしまうんでそんなわけにはいかないわけです。
だからね、下に書いてることみたいなことをしたんです。
$MemberName = Get-ADGroupMember -Identity ~ | fl Name
$MemberName | ForEach {
Get-ADUser -Identity $MemberName | fl department,displayname,SamAccountName,UserPrincipalName,extensionAttribute1
| Out-File -FilePath 【ファイル出力先】}
まぁ、かわいいもんじゃないですか。
いつものようにForEachでグルグル回せばいいんじゃないか?
そんな風に考えたわけなんですけどね。
結果がやっぱり「???」ってなんですね。
※Windowsのエラーメッセージって分かりにくくないですか…
Get-ADUser : パラメーター 'Identity' で必要とされる型 'Microsoft.ActiveDirectory.Management.A
DUser' に 'System.Object[]' を変換できません。指定されたメソッドはサポートされていません。
発生場所 C:\Users\xxxx\Desktop\xxx.ps1:x 文字:xx
+ Get-ADUser -Identity $MemberName | fl department,displayname,SamAccountNa
me, ...
+ ~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-ADUser]、ParameterBindi
ngException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirectory.
Management.Commands.GetADUser
ISEっていうツールを使って変数の中身をみてみるとこんな感じなんですね。
name : XXXX
name : YYYY
ふ~ん、なんとなくダメそうだね汗
##結論
答えはいつもシンプル!
シンプルじゃなきゃ、自分が理解してない証拠!
コマンドの結果をパイプで渡してやることで解決します!
Get-ADGroupMember -Identity "xxx" | Get-ADUser | fl department,displayname,SamAccountName,UserPrincipalName,extensionAttribute1 | Out-File -FilePath 【ファイル出力先】
最後の部分、リダイレクトで出力しても問題ないと思います。
要はですね、パイプ使ってGet-ADUserに渡してやるとGet-ADUserで参照できる属性値を選択できるようになるってことなんです。
恐らくこの仕様は他のPowerShellコマンドでも流用できることで、パイプで渡す前に実行したコマンドの属性値と渡した後に実行するコマンドの属性値を連結するイメージなんですね。
発見だったので記事を書きました。
あ~あ、やっぱりこんな時間だよ。俺、結婚できるのかなぁ。。