この人、ReplaceパラメータとReplace演算子の区別がついてないかも。
2021年8月20日金曜日
2021年4月22日木曜日
2020年12月8日火曜日
2020年10月22日木曜日
◆Get-ADUser フィルター(filter)の指定方法
外側をダブルコーテーション、文字列をシングルコーテーションで囲むのが基本でしょうか。
外側囲み記号 |
属性 |
値の指定方法 |
値の囲み記号 |
例 |
結果 |
シングルコーテーション |
数値 |
コンスタント |
無し |
Get-ADUser -Filter 'employeeid -eq 479' |
〇 |
シングルコーテーション |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter 'employeeid -eq $id' |
〇 |
シングルコーテーション |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter 'employeeid -eq $($p.id)' |
X |
シングルコーテーション |
文字列 |
コンスタント |
ダブルコーテーション |
Get-ADUser -Filter 'samaccountname -eq "hoge_hoge"' |
〇 |
シングルコーテーション |
文字列 |
変数 |
無し |
$account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq $account' |
〇 |
シングルコーテーション |
文字列 |
変数 |
ダブルコーテーション |
$account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq "$account" ' |
X |
シングルコーテーション |
文字列 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq $($p.account)' |
X |
ダブルコーテーション |
数値 |
コンスタント |
無し |
Get-ADUser -Filter "employeeid -eq 479" |
〇 |
ダブルコーテーション |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter "employeeid -eq $id" |
〇 |
ダブルコーテーション |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "employeeid -eq $($p.id)" |
〇 |
ダブルコーテーション |
文字列 |
コンスタント |
シングルコーテーション |
Get-ADUser -Filter "samaccountname -eq 'hoge_hoge' " |
〇 |
ダブルコーテーション |
文字列 |
変数 |
無し |
$account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq $account" |
X |
ダブルコーテーション |
文字列 |
変数 |
シングルコーテーション |
$account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq '$account' " |
〇 |
ダブルコーテーション |
文字列 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq $($p.account)" |
X |
ダブルコーテーション |
文字列 |
変数(プロパティ) |
シングルコーテーション |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq '$($p.account)' " |
〇 |
波括弧 |
数値 |
コンスタント |
無し |
Get-ADUser -Filter {employeeid -eq 479} |
〇 |
波括弧 |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter {employeeid -eq $id} |
〇 |
波括弧 |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter {employeeid -eq $($p.id)} |
X |
2020年10月13日火曜日
◆ActiveDirectory ユーザーの名前(name)を更新するには
どうするんでしょうね。
Set-Aduserには Name パラメータが無いんですね。
GUIでは更新できるので何かしら方法はありそうなのですが。
そのうち調べてみましょう。
2019年7月31日水曜日
◆Windows10からActiveDirectoryを管理する
◆Windows7からActiveDirectoryモジュールを使う
Windows10では若干手順が変わっているようだ。
なおかつ1809以降とその前でも手順が違うのだとか。
私のPCは1809なので以下を参考にインストールした
https://www.atmarkit.co.jp/ait/articles/1811/29/news046.html
のだが、なぜかうまくいかない。
ためしにPowerShellコマンドでインストールしてみるとエラーコード「0x800f0954」でエラーになっているようだ。
調べてみるとどうやらDomain環境でWSUSを使っていると失敗するらしい。
対策は「gpedit.msc」でローカルグループポリシーエディターを起動し「コンピューターの構成」「管理用テンプレート」「システム」から「オプションコンポーネントのインストールおよびコンポーネントの修復のための設定を指定する」を選び「有効」にするとともに、オプションで「WSUSの代わりにWindowsUpdateから修復コンテンツとオプションの機能を直接ダウンロードする」をチェックしてあげると良いようだ。
1903にしたら消えやがるし・・・(@@
2017年2月14日火曜日
◆ActiveDirectoryユーザーグループにメンバー(グループ)を追加
アクセス権を付けるには通常ローカルグループにグローバルグループを突っ込んであげる。
追加するグループを選ぶ時にActiveDirectoryの検索画面を使うのだが、今ひとつ使い勝手が良くない。
(部分一致検索が出来ないのでグループ名の名前を正確に覚えている必要がある。)
そこでローカルグループを抽出しGridViewに表示して対象を選択。
グローバルグループをGridViewに表示して追加先を選択。
ローカルグループにグローバルグループを追加。
と言った簡単なスクリプトにしてみた。
特に難しいところは無いのだが、「Add-ADGroupMember」の「Identity」パラーメータに抽出したグループを直接指定するとエラーになってしまった。
定義は
-Identity ADGroup
An Active Directory group object by providing one of the following values.
(The identifier in parentheses is the LDAP display name for the attribute.)
とあるのでそのまま指定できそうだが・・・。
(select しているのが良くないのか)
時間がなかったのでとりあえずNameプロパティを指定した。
最近全くPowerShellを使っていなかったので使い方をすっかり忘れてしまった・・・。(><)
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 | $target_FileAccess_G = $null $target_FileAccess_G = Get-ADGroup -Filter "Name -like 'Hoge*FileAccess-G'" | select name | sort name | Out-GridView -title "Select Target FileAccess Group" -PassThru if($target_FileAccess_G){ $target_UserGroup = Get-ADGroup -Filte * -SearchBase "OU=Groups,DC=city,DC=London,DC=gov,DC=uk" | select name | Out-GridView -title "Select Add Group" -PassThru if($target_UserGroup){ Add-ADGroupMember -Identity $target_FileAccess_G.Name -Member $target_UserGroup.Name if($?){"Complete"} } } |
2013年1月28日月曜日
◆ログオンできる端末を制限する
ユーザーID自体にログオン可能な端末を制限することができる。
対象者を「Active Directory管理センター」で開き「ログオン先」に指定するだけ。
これをPowerShellからやるとこんな感じ
>set-ADUser User1 -add @{userworkstations='PC1'} |
しかし、以下のように複数のPCを指定すると
>set-ADUser User1 -add @{userworkstations='PC1','PC2'} |
といったエラーになる。
となっているので指定の仕方に間違いは無いようなのだが・・・。
実は、調べていると「ログオン先」のプロパティについては予めパラメータが用意されていた(><)
>Set-ADUser User1 -LogonWorkstations "PC1","PC2" |
しかし、これがまたエラー。
このパラメータは「string」を要求する・・・。
でも、「LogonWorkstations」って書いてあるじゃん。と思いながらよくよくヘルプを見ると、配列ではなくカンマ区切りの文字列を指定するのだそうな・・・。
こうですね。
>Set-ADUser User1 -LogonWorkstations "PC1,PC2" |
もしやと思い最初の「Add」パラメータもハッシュテーブル値に同じ形式で指定したらうまくいった。(ヘルプ君間違っているのね・・・)
>set-ADUser User1 -add @{userworkstations='PC1,PC2'} |
ふぅ~。
2012年9月21日金曜日
◆ActiveDirectory グループに所属しているか判定する
あるユーザーが特定のグループに所属しているか判定したい。
どうするんでしょうね・・・。
単純にユーザーが所属しているグループなら取れそうな気もするけど、グループが入れ子になっていると再帰して親まで辿らないといけない。
ちょっと面倒な感じ。
逆にグループに所属しているメンバーは「Get-ADGroupMember」に「Recursive」パラメータがあってすべてのリーフを取得できる。
こいつを保持して置いて「-contain」で判定するのが簡単かな。
もっとダイレクトな方法があるのかしらん・・・。
--
whoami /groups /fo csv | ConvertFrom-Csv
こんな感じでグループ名を取ってくれば良いのだろうか。
2012年6月8日金曜日
◆ActiveDirectoryオブジェクトのプロパティを比較する
以下のやり取りを見ていてActiveDirectoryオブジェクトのプロパティを調べてみたくなりちょっと試してみました。
LastlogonDate
「Get-ADObject」で返ってくるのは「Microsoft.ActiveDirectory.Management.ADObject」
「Get-ADUser」で返ってくるのは「Microsoft.ActiveDirectory.Management.ADUser」
この2つのオブジェクトのプロパティが比較的できればOK
AD関連のオブジェクトはサイズが大きいせいか明示的に「Property」パラメータで指定しないと返ってこないプロパティが多い。
全プロパティはどうなっているのか。
MSDNをちょっと探してみたが見つからない・・・。
仕方がないので適当にやってみたら「Property」パラメータに「*」を指定すると全部返ってくるみたい。ラッキー。
全プロパティが取ってこれればあとは比較するだけ。
こんな感じだろうか。
001 002 003 004 005 006 007 008 | Import-Module ActiveDirectory $adobject = Get-ADObject -filter {name -eq 'Administrator'} -property * | gm | ?{$_.MemberType -eq "Property"} | select -ExpandProperty name $aduser = Get-ADUser administrator -property * | gm | ?{$_.MemberType -eq "Property"} | select -ExpandProperty name Compare-Object $aduser $adobject |
2012年5月31日木曜日
◆ActiveDirectoryコマンドレットでFilterの記述方法
Filterの記述方法が良く分からなかったので纏めておく。
サンプルを見るとこんな感じにシングルコーテーションで囲んでいる。
PS>Get-ADUser -filter 'SamAccountName -like "test*"' | select SamAccountName SamAccountName |
ダブルコーテーションとシングルコーテーションを入れ替えても大丈夫。
PS>Get-ADUser -filter "SamAccountName -like 'test*'" | select SamAccountName SamAccountName |
{}で囲んであげるサンプルも載っていた。
PS>Get-ADUser -filter {SamAccountName -like "test*"} | select SamAccountName SamAccountName |
コマンドを組み合わせると条件は変数指定になることが多くなると思うので変数でも試してみる。
PS>$st = "test*" |
シングルコーテーションはOK
PS>Get-ADUser -filter 'SamAccountName -like $st' | select SamAccountName SamAccountName |
{}で囲むのもOK
PS>Get-ADUser -filter {SamAccountName -like $st} | select SamAccountName SamAccountName |
ダブルコーテーションはエラーになる
PS>Get-ADUser -filter "SamAccountName -like $st" | select SamAccountName |
こんな感じにコーテーションの追加が必要みたい
PS>Get-ADUser -filter "SamAccountName -like '$st'" | select SamAccountName SamAccountName |
次は変数が以下のようなプロパティの場合。
PS>($st = 1 | select prop).prop = "test*" |
シングルコーテーションはエラーになる。
PS>Get-ADUser -filter 'SamAccountName -like $st.prop' | select SamAccountName |
{}で囲んでも駄目
PS>Get-ADUser -filter {SamAccountName -like $st.prop} | select SamAccountName |
当然ダブルコーテーションも駄目
PS>Get-ADUser -filter "SamAccountName -like $st.prop" | select SamAccountName |
どうすればよいんでしょうね。
まぁ、一旦変数に入れれば良いだけではあるのですがなんとなく残念な気持ち。
プロパティをFilterに使うことは多くないのかもしれませんが、配列要素なんかも同様に駄目そうなので・・・。
かろうじてダブルコーテーションで式の評価を強制させた場合はうまくいく。
PS>Get-ADUser -filter "SamAccountName -like '$($st.prop)'" | select SamAccountName SamAccountName |
ちょっと場当たり的に試しただけで理由が分かっていないのでいずれ機会があったらもう少し調べてみたい。
2012年3月22日木曜日
◆Active Directory 直属の部下たちのメールアドレスを取得
前回に引き続き、残業時間をチェックし警告メールを送信するスクリプトを作っている。
サブリーダーに「Cc」でメールすることにしたのだが、リーダーとサブリーダーの関係をどこに持つか・・・。
今のところ「上司」-「直属の部下」プロパティは使われていないので、簡便的にこのプロパティを使うこととした。
リーダーが上司、サブリーダー達がその部下という扱いだ。
「直属の部下」プロパティが見つかればなんてことはないと思ったのだが、そのプロパティが「属性エディタ」で見つからない。
実は、「上司」プロパティと「直属の部下」プロパティは一体管理されており、通常はメンバー側から見た「上司」プロパティとして表示されているようだ。
「直属の部下」プロパティを「属性エディタ」で表示するには、「フィルター」ボタンをクリックして「後方リンク」をチェックしてあげればよい。
プロパティを確認していくと、「直属の部下」は「directReports」だと判る。
直属の部下からメールアドレスを取得するのはこんな感じ。
001 002 | (Get-ADUser hara_tatsunori -Properties DirectReports).DirectReports | %{Get-ADUser $_ -Properties mail} | select -expand mail |
あとはこれをこのまま「Cc」に指定すればよい。
2011年10月13日木曜日
◆ActiveDirectory、ある属性に設定のないユーザーを検索する
例えば、メールアドレスが設定されていないユーザーを検索するには、
Get-ADUser –Filter ‘mail –ne “”’ |
かな?、と思ってしまうがこれではうまくいかない。
こんな感じになるようだ。
Get-ADUser –Filter ‘mail –notlike “*”’ |
また、これをカウントするためにMeasureにパイプする場合は、resultsetsizeパラメーターを指定したほうが良さそう。
(デフォルトでは検索結果の数が500に制限されていて、それを超えると正確にカウントできなくなる。)
Get-ADUser –Filter ‘mail –notlike “*”’ –ResultSetSize $null |
ResultSetSizeパラメータにnullを指定すると無制限になる。
2011年9月13日火曜日
◆ソートのカスタマイズ
ActiveDirectoryからユーザー情報を取ってきて表示する際に独自の並び順で並べたいことがある。
例えば、役職などでは基本的に偉い順で並べたいのだが、単純に日本語で登録している場合は意図したとおりには並ばない。
幸い、Sortコマンドレットはソートプロパティに集計プロパティが指定できるのでそれを使うとこんな感じでカスタマイズが可能だ。
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 | $dmAUsers = Get-QADGroupMember -Identity "Domain users" -Service "A.hoge.co.jp" $dmBUsers = Get-QADGroupMember -Identity "Domain users" -Service "B.hoge.co.jp" $dmAUsers + $dmBUsers | sort domain,department, @{expression={ switch ($_.title){ "本部長"{1;break} "部長"{2;break} "副部長"{3;break} "主任"{4;break} "係員"{5;break} default{6;break} } }} | select domain,department,title,name,email,samaccountname |
他ドメインの情報も必要だったのでPowerQuestの拡張コマンドを使ってユーザーを取得している。
ソートコマンドレットで並べたい順番に数字に置き換えてあげれば独自の並び順を実現できる。
◆ActiveDirectory、無効のアカウントをフィルターする
Search-ADAccountコマンドレットのAccountDisabledパラメータを使えば無効でないアカウントを取得することは可能だが、既に取得済みのユーザーに対してフィルターしたいこともある。
有効、無効を判定する属性はuserAccountControl属性として以下のように保持しているようだ。
最下位2ビット目がそれっぽいのでフィルターすると以下のようになる。
001 002 003 | Get-ADGroupMember "Domain Users"| Get-ADUser -prop name,userAccountControl | ?{!(($_.userAccountControl -band 0x00002) -eq 0x00002)} |
ちなみに、PowerShell: ◆ActiveDirectoryグループごとのメンバー一覧を表示する2で使ったPowerQuestの拡張コマンドを使うと以下のように簡単にフィルターできる。
001 | Get-QADGroupMember "Domain Users"| ?{!$_.AccountIsDisabled} |
ただし、拡張コマンドは全般的に機能が豊富な分若干重い感じがするのでケースバイケースで使い分けが必要かもしれない。
--
あれ、単純にEnabledプロパティを使えばよいだけ?(汗)
2011年8月9日火曜日
◆ActiveDirectory、有効期限の切れるユーザーを取得する
有効期限を判定するには「accountExpires」プロパティを使えば良さそうだ。
試した環境では、期限が設定されていないユーザーの「accountExpires」がゼロになってるケースが何件かあったのでそれも条件に加えている。
以下では40日以内に有効期限が切れるユーザーを抽出して管理者宛にメールしている。
「accountExpires」はPowerShell: ◆ActiveDirectory、コンピュータ一覧を取得するで使ったDateTime型のメソッドを関数化して変換している。
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 | $Month = ((Get-Date).AddDays(40)).ToFileTime() #40日後 $target = "OU=hogeOU,DC=xx,DC=giants,DC=co,DC=jp" $user = @() $user = Get-ADUser -Filter {(accountExpires -lt $Month) -and (accountExpires -ne 0)} ` -SearchBase $target -Properties accountExpires | select name,@{name="有効期限";expression={Get-I-FTime($_.accountExpires)} } $userStr = $user | fl | Out-String $body = @" ADサーバー管理ツールからの自動報告メールです。 以下のIDの有効期限が迫っています。 $userStr "@ if($user.Count){ Send-MailMessage -To "<hara_tatsunori@giants.co.jp>" ` -From "AD管理者 <admin@giants.co.jp>" ` -Subject "AD管理報告" ` -SmtpServer "mserver.giants.co.jp" ` -Body $body ` -Encoding ([System.Text.Encoding]::Default) } |