Home > Windows にまつわる e.t.c.

PowerShell でドメインユーザーの全属性を操作する


ドメインユーザー情報を取得するには、Get-ADUser コマンドレットを使いますが、でも、Get-ADUser で得られる情報が、ドメインユーザープロパティに比べて圧倒的に少ないのが気になりませんか?

PS C:\> Get-ADUser -Filter { SamAccountName -eq "mura" } | fl *


DistinguishedName  : CN=mura,CN=Users,DC=vwnet,DC=jp
Enabled            : True
GivenName          :
Name               : mura
ObjectClass        : user
ObjectGUID         : 4fd33852-ee49-4058-ab37-b072c6c823f6
SamAccountName     : mura
SID                : S-1-5-21-4127486010-668491162-2501035895-1106
Surname            : mura
UserPrincipalName  : mura@vwnet.jp
PropertyNames      : {DistinguishedName, Enabled, GivenName, Name...}
AddedProperties    : {}
RemovedProperties  : {}
ModifiedProperties : {}
PropertyCount      : 10

 

ドメインユーザーは、LDAP 属性を沢山持っており、そのままでは一部の属性しかハンドリングできません。

 

すべての属性を取得する

全ての属性を取得するには Get-ADUser の -Properties * オプションを指定します。

PS C:\> Get-ADUser -Filter { SamAccountName -eq "mura" } -Properties *


AccountExpirationDate                :
accountExpires                       : 9223372036854775807
AccountLockoutTime                   :
AccountNotDelegated                  : False
adminCount                           : 1
AllowReversiblePasswordEncryption    : False
AuthenticationPolicy                 : {}
AuthenticationPolicySilo             : {}
BadLogonCount                        : 0
badPasswordTime                      : 131541002409296671
badPwdCount                          : 0
CannotChangePassword                 : False
CanonicalName                        : vwnet.jp/Users/mura
以下省略

 

大量に属性が取得できましたが、実はこれが全てはなく、値がセットされていないと属性が取得できないものも多くあるのです。

その一つに info 属性があります。

PS C:\> Get-ADUser -Filter { SamAccountName -eq "mura" } -Properties info


DistinguishedName : CN=mura,CN=Users,DC=vwnet,DC=jp
Enabled           : True
GivenName         :
Name              : mura
ObjectClass       : user
ObjectGUID        : 4fd33852-ee49-4058-ab37-b072c6c823f6
SamAccountName    : mura
SID               : S-1-5-21-4127486010-668491162-2501035895-1106
Surname           : mura
UserPrincipalName : mura@vwnet.jp

 

このように info 属性そのものが取れていません。

それでは、info 属性の GUI である [電話]-[メモ] に適当なテキストを書いてみると、

PS C:\> Get-ADUser -Filter { SamAccountName -eq "mura" } -Properties info


DistinguishedName : CN=mura,CN=Users,DC=vwnet,DC=jp
Enabled           : True
GivenName         :
info              : This is test memo
                    ZZzzzz....
Name              : mura
ObjectClass       : user
ObjectGUID        : 4fd33852-ee49-4058-ab37-b072c6c823f6
SamAccountName    : mura
SID               : S-1-5-21-4127486010-668491162-2501035895-1106
Surname           : mura
UserPrincipalName : mura@vwnet.jp

 

属性と値が取れるようになりました。

このように、どの属性に値がセットされたかを確認する場合は、GUI で実際に値を設定して確認するが一番確実です。

ちなみに、pwdLastSet のように、FileTime 形式になっている属性は、[System.DateTime]::FromFileTime(値) で変換すれば datetime 形式になります。

 

属性をセットする

属性はハッシュテーブル構造になっているので、ハッシュテーブル形式を Set-ADUser の -Add オプションで追加するか、-Replace オプションで更新します。

$User = Get-ADUser -Filter { SamAccountName -eq "mura" } -Properties info
if( $User.info -eq $null ){
    $User | Set-ADUser -Add @{ info = "This is test memo" }
}
else{
    $User | Set-ADUser -Replace @{ info = "This is test memo" }
}

 

info 属性は以下のように `r`n で区切ってセットすると複数行書けます。

$SetString = "This is test memo" + "`r`n" + "ZZzzzz...."
$User | Set-ADUser -Replace @{ info = $SetString }

 

関数にするとこんな感じですね

##########################################################
# ドメインユーザーアカウントのメモを設定する
##########################################################
function SetInfo4ADUser( [string]$SamAccountName, [string[]]$Infos ){

    # セットする値の数
    $Max = $Infos.Count

    if($Max -eq 0 ){
        return $false
    }
    else{
        $InfoString = ""
        for($i = 0 ; $i -lt $Max; $i++){
            # 値セット
            $InfoString += $Infos[$i]

            # 末尾以外は改行を入れる
            if( $i -lt $Max -1 ){
                $InfoString += "`r`n"
            }
        }
    }

    # ユーザー情報取得
    $User = Get-ADUser -Filter { SamAccountName -eq $SamAccountName } -Properties info
    if( $User -eq $null ){
        # そんなユーザーはいない
        return $false
    }

    # 追加
    if( $User.info -eq $null ){
        $User | Set-ADUser -Add @{ info = $InfoString }
    }
    # 更新
    else{
        $User | Set-ADUser -Replace @{ info = $InfoString }
    }

    return $true
}

 

関連情報

AD のセキュリティグループ/OUメンバー情報と「説明」を PowerShellで表示する
http://www.vwnet.jp/Windows/WS12R2/2017041301/GetMemberDescription.htm

関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.