SEブログ

【Active Directory】PowerShellでユーザーアカウントを管理する

こんにちは!SE ブログの相馬です。

 

 

 

今回は、PowerShell を使い、ユーザーアカウントを管理(作成・移動・無効・削除など)をする方法について書きました。

 

 

 

ユーザーを作成する

 

 

まず、AD のユーザーアカウントを作成するコマンドレットは New-ADUser になります。コマンドの詳細については以下のリンク先が参考になりました。

 

 

New-ADUserコマンド | POWERSHELL FROM JAPAN!! BLOG

 

 

アカウント名と OU の指定

 

 

ユーザーアカウントを作成する OU を指定する場合は、-Path オプションを付けて、OU を指定します。ここでは単純にユーザーアカウント名と OU を指定してアカウントを作成します。

 

New-ADUser labuser01 -Path "OU=Sales,DC=soma-engineering,DC=local"

 

 

 

パスワードの指定とアカウントの有効化

 

 

アカウント作成後には、ユーザーアカウントが無効の状態になっています。これを有効化にするには以下のようにパスワードの指定とアカウントを有効化するオプションを使います。

 

 

パスワードの指定は、-AccountPassword オプションを使います。またアカウント有効化は、-Enabled オプションを使います。また、パスワードは平文では保存できないので、ConvertTo-SecureString を使って文字列を暗号化します。

 

$passwd = ConvertTo-SecureString "P@ssW0rd" -AsPlainText -Force
New-ADUser labuser01 -Path "OU=Sales,DC=soma-engineering,DC=local" -AccountPassword $passwd -Enabled $true

 

 

 

一度で多くの属性を登録する

 

 

一度に多くの属性を登録したいという場合は、以下のように必要な分をオプションとして付けて値を入れてあげれば登録ができます。

 

$passwd = ConvertTo-SecureString "P@ssW0rd" -AsPlainText -Force
$ou = "OU=Sales,DC=soma-engineering,DC=local"

New-ADUser luser03 `
 -Surname Lab -GivenName User03 -DisplayName "Lab User03" `
 -Path $ou -AccountPassword $passwd -Enabled $true `
 -UserPrincipalName "luser03@soma-engineering.local" `
 -EmailAddress "user03.lab@soma-engineering.local" `
 -OfficePhone "0312345678" `
 -EmployeeNumber "0003" -EmployeeID "SL0003" `
 -Division "第三営業課" -Department "営業部" -Company "相馬エンジニアリング" `
 -City “千代田区”-Country "JP"

 

 

 

エラーチェックも含めたほうが良いかと思います。ユーザーが存在しない場合はユーザーを作成し、存在しない場合は作成せずに警告メッセージを返すようにしました。

 

$passwd = ConvertTo-SecureString "P@ssW0rd" -AsPlainText -Force
$ou = "OU=Sales,DC=soma-engineering,DC=local"
$Name = "luser03"
$User = Get-ADUser -Filter {sAMAccountName -eq $Name}

if ($User -eq $NULL) {

    New-ADUser luser03 `
     -Surname Lab -GivenName luser03 -DisplayName "Lab User03" `
     -Path $ou -AccountPassword $passwd -Enabled $true `
     -UserPrincipalName "luser03@soma-engineering.local" `
     -EmailAddress "user03.lab@soma-engineering.local" `
     -OfficePhone "0312345678" `
     -EmployeeNumber "0003" -EmployeeID "SL0003" `
     -Division "第三営業課" -Department "営業部" -Company "相馬エンジニアリング" `
     -City “千代田区”

    Write-Host "ユーザー($Name)が登録されました。" -ForegroundColor green

} else {

    Write-Host "ユーザーは既に登録されています。" -ForegroundColor Yellow

}

 

 

 

ユーザーを移動する

 

 

ユーザーアカウントを別の OU に移動するには、Move-ADObject コマンドレットを使います。

 

Move-ADObject -Identity "CN=luser03,OU=Sales,DC=soma-engineering,DC=local" -TargetPath "OU=IT,DC=soma-engineering,DC=local"

 

 

 

ユーザーアカウントをまとめて移動したい場合は、以下のようなスクリプトを使えば移動ができます。

 

 

  1. $Name にユーザーアカウント名の途中まで入力し、Like 検索するのでワイルドカードの部分は * にしておきます。
    • ここでは、luser01,02,03 が対象なので、luser* と指定しました。
  2. Get-ADUser コマンドレットで $Name を Like 検索するので、複数のユーザーがヒットします。それを $Users に代入します。
  3. foreach で 1 個ずつ Move-ADObject で別の OU に移動します。

 

$Name = "luser*"
$Users = Get-AdUser -Filter {sAMAccountName -Like $Name}
$Ou = "OU=IT,DC=soma-engineering,DC=local"

foreach ($User in $Users) {

    Move-ADObject -Identity $User -TargetPath $Ou

}

 

 

 

ユーザーを無効にする

 

 

ユーザーアカウントを無効にするコマンドレットは、Set-ADUser コマンドレットで -Enable オプションを $false にすれば無効にできます。

 

Get-AdUser -Filter {sAMAccountName -eq "luser03"} | Set-ADUser -Enabled $false

 

 

 

ユーザーを削除する

 

 

ユーザーアカウントを削除します。いきなりユーザーアカウントを削除してしまうのは問題があると思いますので、削除用の OU に一時退避しておきます。

 

 

以下の処理では

 

 

  1. $Name にユーザーアカウント名の途中まで入力し、Like 検索するのでワイルドカードの部分は * にしておきます。
    • ここでは、luser01,02,03 が対象なので、luser* と指定しました。
  2. Get-ADUser コマンドレットで $Name を Like 検索するので、複数のユーザーがヒットします。それを $Users に代入します。
  3. foreach で 1 個ずつ 処理します。
    • ユーザーアカウントを無効にします。既に無効になっていれば警告メッセージを返します。
    • ユーザーアカウントを Delete OU に移動します。既に当該 OU にあれば警告メッセージを返します。
  4. 3 を繰り返し処理します。

 

$Name = "luser*"
$Users = Get-AdUser -Filter {sAMAccountName -Like $Name}
$Dn = "OU=Delete,DC=soma-engineering,DC=local"

foreach ($User in $Users) {

    if ($User.Enabled -eq "false") {

        $User | Set-ADUser -Enabled $false

    } else {

        Write-Host "$user は既に無効になっています。"

    }

    if ($User.DistinguishedName -notmatch $Dn) {

       Move-ADObject -Identity $User -TargetPath $Dn

    } else {

       Write-Host "$user は $Delete OUに既に入っています。"

    }

}

 

 

 

ユーザーをグループに追加する

 

 

ユーザーをグループに追加するには、Add-ADGroupMember コマンドレットを使います。まずはシンプルな方法で追加してみます。

 

【 Add-ADGroupMember 】コマンドレット――Active Directoryのグループにユーザーを追加する | @IT

 


Add-ADGroupMember "LabGroup" -Members luser03

 

 

 

上の処理ですと、グループに追加できるユーザーは 1 ユーザーのみです。(同じ処理を複数行追加してユーザー名を変更すれば複数ユーザーをグループに追加する事はできます。)

 

 

ユーザー名が全く異なるのであればこの方法が一番シンプルで分かり易いと思います。

一方で、特定のユーザー名があり(例:user01, user02, user03)、名前の規則がある程度一致している場合はもう少し効率的な方法で追加する事ができます。

 


$Name = "luser*"

$Users = Get-ADUser -Filter {sAMAccountName -Like $Name }

foreach ($User in $Users) {

    Add-ADGroupMember -Identity "LabGroup" -Members $Users

}

 

 

 

上の処理を一行で書くとこう書けます。

 

Get-ADUser -Filter {sAMAccountName -Like "luser*"} | foreach {Add-ADGroupMember -Identity "LabGroup" -Members $_}

 

 

 

これでユーザーをグループに追加する事ができましたので、グループにユーザーが追加されたか確認してみましょう。

 

 

 

グループに追加されているユーザーの一覧を取得する

 

グループにユーザーが追加されているか確認します。Get-ADGroupMember コマンドレットを使います。

 

【 Get-ADGroupMember 】コマンドレット――Active Directoryのグループのメンバーを表示する | @IT

 

Get-ADGroupMember "LabGroup"


# 実行結果
distinguishedName : CN=Lab User01,OU=Users,OU=Lab,DC=soma-engineering,DC=local
name : Lab User01
objectClass : user
objectGUID : dde8870d-a203-4075-a2aa-54da1e7bf2c3
SamAccountName : luser01
SID : S-1-5-21-1588114628-1561702856-3468549428-1103

distinguishedName : CN=Lab User02,OU=Users,OU=Lab,DC=soma-engineering,DC=local
name : Lab User02
objectClass : user
objectGUID : e10d53d1-4fa9-4b63-8a58-09dd03813914
SamAccountName : luser02
SID : S-1-5-21-1588114628-1561702856-3468549428-1106

distinguishedName : CN=luser03,OU=Users,OU=Lab,DC=soma-engineering,DC=local
name : luser03
objectClass : user
objectGUID : 1eeb3ea5-ac5d-472f-9bb5-286ec23b9df5
SamAccountName : luser03
SID : S-1-5-21-1588114628-1561702856-3468549428-2108

 

 

 

上の取得結果ですと、ユーザー名だけではなく、他の情報も取ってきてしまいます。そこで、ユーザー名の一覧を取得するには以下の方法を使います。

 

Get-ADGroupMember "LabGroup" | Select name, SamAccountName | Format-Table -AutoSize


# 実行結果
name SamAccountName
---- --------------
Lab User01 luser01 
Lab User02 luser02 
Lab User03 luser03

 

 

 

ユーザーアカウントの属性を表示する

 

 

ユーザーアカウントのオブジェクトには、多くの属性(プロパティ)を持っています。PowerShell を使えば、特定の属性を簡単に取得する事ができます。とりあえず、サンプルとして属性を見てみましょう。(属性の一部は省略しております。)

 

Get-ADUser luser01 -Properties *


# 実行結果
AccountExpirationDate : 
accountExpires : 9223372036854775807
AccountLockoutTime : Created : 2018/07/19 6:03:19
createTimeStamp : 2018/07/19 6:03:19
DisplayName : Lab User01
DistinguishedName : CN=Lab User01,OU=Users,OU=Lab,DC=soma-engineering,DC=local
...
LastBadPasswordAttempt : 
...
lastLogon : 131772991434688644
LastLogonDate : 2018/07/19 6:14:14
lastLogonTimestamp : 131764220545603796
LockedOut : False
logonCount : 22
LogonWorkstations : 
Manager : 
MemberOf : {CN=LabGroup,OU=Groups,DC=soma-engineering,DC=local}
...
PasswordExpired : False
PasswordLastSet : 2018/07/19 6:03:19
PasswordNeverExpires : True
PasswordNotRequired : False
...
whenChanged : 2018/07/29 9:51:46
whenCreated : 2018/07/19 6:03:19

 

 

 

一部は省略していますが、これだけでもかなりの量になります。この属性から最終ログオン日時を取得したい場合はどうしたら良いでしょうか。

 

 

Get-ADUser で取得したオブジェクトをパイプラインでつなぎ、Select-Object コマンドレットで指定してあげれば良いだけです。

 

Get-ADUser luser01 -Properties * | Select-Object Name,LastLogonDate | Format-Table -AutoSize


# 実行結果

Name LastLogonDate 
---- ------------- 
Lab User01 2018/07/19 6:14:14

 

 

 

以上になります。

 

 

いかがでしょうか。管理する対象のユーザーアカウントが多いと、GUI でいちいち管理するのは面倒なので、バッチや PowerShell を使うと良いと思います。

 

 

では最後までお読みいただきありがとうございました!