ラベル ActiveDirectory の投稿を表示しています。 すべての投稿を表示
ラベル ActiveDirectory の投稿を表示しています。 すべての投稿を表示

2021年8月20日金曜日

◆Set-ADUser

https://atmarkit.itmedia.co.jp/ait/articles/2108/19/news004.html#_ga=2.20275579.276634599.1629436537-971364125.1629436537


この人、ReplaceパラメータとReplace演算子の区別がついてないかも。

2021年4月22日木曜日

◆ユーザーが所属するADグループを表示する

Get-ADPrincipalGroupMembership -Identity testuser1

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当時は以下の様な感じだった。
◆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管理センター」で開き「ログオン先」に指定するだけ。
image
image

これをPowerShellからやるとこんな感じ

>set-ADUser User1 -add @{userworkstations='PC1'}

しかし、以下のように複数のPCを指定すると

>set-ADUser User1 -add @{userworkstations='PC1','PC2'}

image

といったエラーになる。

ヘルプを見ても
image

となっているので指定の仕方に間違いは無いようなのだが・・・。

実は、調べていると「ログオン先」のプロパティについては予めパラメータが用意されていた(><)

>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

image

2012年5月31日木曜日

◆ActiveDirectoryコマンドレットでFilterの記述方法

Filterの記述方法が良く分からなかったので纏めておく。

サンプルを見るとこんな感じにシングルコーテーションで囲んでいる。

PS>Get-ADUser -filter 'SamAccountName -like "test*"' | select SamAccountName

SamAccountName
--------------
test
test2

ダブルコーテーションとシングルコーテーションを入れ替えても大丈夫。

PS>Get-ADUser -filter "SamAccountName -like 'test*'" | select SamAccountName

SamAccountName
--------------
test
test2

{}で囲んであげるサンプルも載っていた。

PS>Get-ADUser -filter {SamAccountName -like "test*"} | select SamAccountName

SamAccountName
--------------
test
test2

コマンドを組み合わせると条件は変数指定になることが多くなると思うので変数でも試してみる。

PS>$st = "test*"


シングルコーテーションはOK

PS>Get-ADUser -filter 'SamAccountName -like $st' | select SamAccountName

SamAccountName
--------------
test
test2


{}で囲むのもOK

PS>Get-ADUser -filter {SamAccountName -like $st} | select SamAccountName

SamAccountName
--------------
test
test2


ダブルコーテーションはエラーになる

PS>Get-ADUser -filter "SamAccountName -like $st" | select SamAccountName
Get-ADUser : クエリ解析エラー: 'SamAccountName -like test*' エラー メッセージ: 'syntax error' 場所: '22'。
発生場所 行:1 文字:11


こんな感じにコーテーションの追加が必要みたい

PS>Get-ADUser -filter "SamAccountName -like '$st'" | select SamAccountName

SamAccountName
--------------
test
test2

 

次は変数が以下のようなプロパティの場合。

PS>($st = 1 | select prop).prop = "test*"
PS>$st.prop
test*

シングルコーテーションはエラーになる。

PS>Get-ADUser -filter 'SamAccountName -like $st.prop' | select SamAccountName
Get-ADUser : 種類: 'System.Management.Automation.PSCustomObject' のオブジェクトでプ
発生場所 行:1 文字:11
+ Get-ADUser <<<<  -filter 'SamAccountName -like $st.prop' | select SamAccountName
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser]、ArgumentException
    + FullyQualifiedErrorId : 種類: 'System.Management.Automation.PSCustomObject'
見つかりません。,Micros    oft.ActiveDirectory.Management.Commands.GetADUser

{}で囲んでも駄目

PS>Get-ADUser -filter {SamAccountName -like $st.prop} | select SamAccountName
Get-ADUser : 種類: 'System.Management.Automation.PSCustomObject' のオブジェクトでプ
発生場所 行:1 文字:11
+ Get-ADUser <<<<  -filter {SamAccountName -like $st.prop} | select SamAccountName
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser]、ArgumentException
    + FullyQualifiedErrorId : 種類: 'System.Management.Automation.PSCustomObject' の
見つかりません。,Micros    oft.ActiveDirectory.Management.Commands.GetADUser

当然ダブルコーテーションも駄目

PS>Get-ADUser -filter "SamAccountName -like $st.prop" | select SamAccountName
Get-ADUser : クエリ解析エラー: 'SamAccountName -like @{prop=test}.prop' エラー メッ
発生場所 行:1 文字:11
+ Get-ADUser <<<<  -filter "SamAccountName -like $st.prop" | select SamAccountName
    + CategoryInfo          : ParserError: (:) [Get-ADUser]、ADFilterParsingExcept
    + FullyQualifiedErrorId : クエリ解析エラー: 'SamAccountName -like @{prop=test}
or' 場所: '22'。,M    icrosoft.ActiveDirectory.Management.Commands.GetADUser

どうすればよいんでしょうね。
まぁ、一旦変数に入れれば良いだけではあるのですがなんとなく残念な気持ち。

プロパティをFilterに使うことは多くないのかもしれませんが、配列要素なんかも同様に駄目そうなので・・・。

かろうじてダブルコーテーションで式の評価を強制させた場合はうまくいく。

PS>Get-ADUser -filter "SamAccountName -like '$($st.prop)'" | select SamAccountName

SamAccountName
--------------
test
test2

ちょっと場当たり的に試しただけで理由が分かっていないのでいずれ機会があったらもう少し調べてみたい。

2012年3月22日木曜日

◆Active Directory 直属の部下たちのメールアドレスを取得

前回に引き続き、残業時間をチェックし警告メールを送信するスクリプトを作っている。

サブリーダーに「Cc」でメールすることにしたのだが、リーダーとサブリーダーの関係をどこに持つか・・・。
今のところ「上司」-「直属の部下」プロパティは使われていないので、簡便的にこのプロパティを使うこととした。
リーダーが上司、サブリーダー達がその部下という扱いだ。

「直属の部下」プロパティが見つかればなんてことはないと思ったのだが、そのプロパティが「属性エディタ」で見つからない。
実は、「上司」プロパティと「直属の部下」プロパティは一体管理されており、通常はメンバー側から見た「上司」プロパティとして表示されているようだ。

「直属の部下」プロパティを「属性エディタ」で表示するには、「フィルター」ボタンをクリックして「後方リンク」をチェックしてあげればよい。
image
image

プロパティを確認していくと、「直属の部下」は「directReports」だと判る。
image

直属の部下からメールアドレスを取得するのはこんな感じ。

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
<!--EndFragment

他ドメインの情報も必要だったのでPowerQuestの拡張コマンドを使ってユーザーを取得している。

ソートコマンドレットで並べたい順番に数字に置き換えてあげれば独自の並び順を実現できる。

◆ActiveDirectory、無効のアカウントをフィルターする

Search-ADAccountコマンドレットのAccountDisabledパラメータを使えば無効でないアカウントを取得することは可能だが、既に取得済みのユーザーに対してフィルターしたいこともある。

有効、無効を判定する属性はuserAccountControl属性として以下のように保持しているようだ。
image

最下位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)
}