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

PowerShellでローカルアカウントの操作


ドメイン環境であればアカウント メンテナンス用の PowerShell コマンドレットが数多く提供されていますが、ワークグループ環境で使うローカルアカウントにはメンテナンス コマンドレットが用意されていません。

結構困るので、良く使う「アカウント新規作成」「グループへ参加」「パスワード無期限設定」「パスワード更新」を関数にしました。

メンバーになっているかの確認も必要なので、メンバーか否かの確認関数も作ってみました。

組み込みで使う事を想定していますが、関数コピペして使う事も出来ます。

################################################
# アカウント新規作成
################################################
function CreateUser( $UserID, $Password ){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $NewUser = $Computer.Create("User", $UserID)
    $NewUser.SetPassword( $Password )
    $NewUser.SetInfo()
}

################################################
# グループへ参加
################################################
function JoinGroup( $UserID, $JoinGroup ){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $Group = $Computer.GetObject("group", $JoinGroup)
    $Group.Add("WinNT://$hostname/$UserID")
}

########################################################################################
# グループへ参加
#  IIS APPPOOL\xx とかの一般的なユーザーではないアカウントとローカルグループ追加対応
########################################################################################
function JoinGroup2( $UserID, $JoinGroup ){
    $hostname = hostname
    $Group = [ADSI]"WinNT://$hostname/$JoinGroup,group"
    $NTAccount = New-Object System.Security.Principal.NTAccount($UserID)
    $SID = $NTAccount.Translate([System.Security.Principal.SecurityIdentifier])
    $User = [ADSI]"WinNT://$SID"
    $Group.Add($User.Path)
}

################################################
# パスワード無期限設定
################################################
function DontExpirePasswd( $UserID ){
    $hostname = hostname
    [ADSI]$UpdateUser = "WinNT://$HostName/$UserID,User"
    $UserFlags = $UpdateUser.Get("UserFlags")
    $UserFlags = $UserFlags -bor 0x10000
    $UpdateUser.Put("UserFlags", $UserFlags)
    $UpdateUser.SetInfo()
}

################################################
# パスワード更新
################################################
function UpdatePasswd( $UserID, $Password ){
    $hostname = hostname
    [ADSI]$UpdateUser = "WinNT://$HostName/$UserID,User"
    $UpdateUser.SetPassword( $Password )
    $UpdateUser.SetInfo()
}

################################################
# ローカルユーザーが存在するか
################################################
function IsLocalUserAccunt( $UserID ){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $Users = $Computer.psbase.children | ? {$_.psBase.schemaClassName -eq "User"} | Select-Object -expand Name
    return ($Users -contains $UserID)
}

################################################
# ドメインユーザーが存在するか
################################################
function IsADUserAccunt( $DomainName, $DomainUser ){
    $hostname = hostname
    $ADUser = [ADSI]("WinNT://$DomainName/$DomainUser")
    if( $ADUser.ADsPath -ne $null ){
        return $true
    }
    else{
        return $false
    }
}

###########################################################
# ドメインユーザー/ドメイングループのローカルグループ参加
###########################################################
function JoinADUser2Group( $DomainName, $DomainUser, $LocalGroup ){
    $HostName = hostname
    $ADUser = [ADSI]("WinNT://$DomainName/$DomainUser")
    $LocalGroup = [ADSI]("WinNT://$HostName/$LocalGroup") 
    $LocalGroup.Add($ADUser.ADsPath)
}

################################################
# ローカルユーザーのグループ離脱
################################################
function DefectionLocalAccunt( $UserID, $GroupName ){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $Group = $Computer.GetObject("group", $GroupName)
    $User = $Computer.GetObject("user", $UserID)
    $Group.Remove($User.ADsPath)
}

#############################################################
# ドメインユーザー/ドメイングループのグループ離脱
#############################################################
function DefectionDomainAccunt( $DomainName, $DomainUser, $LocalGroup ){
    $HostName = hostname
    $ADUser = [ADSI]("WinNT://$DomainName/$DomainUser")
    $LocalGroup = [ADSI]("WinNT://$HostName/$LocalGroup") 
    $LocalGroup.Remove($ADUser.ADsPath)
}

################################################
# ローカルユーザーがメンバーになっているか
################################################
function IsMemberLocalAccunt( $UserID, $GroupName ){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $Group = $Computer.GetObject("group", $GroupName)
    $User = $Computer.GetObject("user", $UserID)
    return $Group.IsMember($User.ADsPath)
}

################################################
# ドメインユーザーがメンバーになっているか
################################################
function IsMemberDomainAccunt( $DomainName, $DomainUser, $LocalGroup ){
    $HostName = hostname
    $ADUser = [ADSI]("WinNT://$DomainName/$DomainUser")
    $LocalGroup = [ADSI]("WinNT://$HostName/$LocalGroup") 
    return $LocalGroup.IsMember($ADUser.ADsPath)
}

################################################
# ローカルグループメンバー取得
################################################
function ListLocalGroupMember( $GroupName ){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $Group = $Computer.GetObject("group", $GroupName)
    $MemberNames = @()
    $Members = $Group.psbase.Invoke("members")
    $Members | % { $MemberNames += $_.GetType().InvokeMember("Name", "GetProperty", $null, $_, $null) }
    return $MemberNames
}

################################################
# アカウント無効
################################################
function DisableAccunt( $UserID ){
    $hostname = hostname
    [ADSI]$UpdateUser = "WinNT://$HostName/$UserID,User"
    $UserFlags = $UpdateUser.Get("UserFlags")
    $UserFlags = $UserFlags -bor 0x0202
    $UpdateUser.Put("UserFlags", $UserFlags)
    $UpdateUser.SetInfo()
}

################################################
# アカウント有効
################################################
function EnableAccunt( $UserID ){
    $hostname = hostname
    [ADSI]$UpdateUser = "WinNT://$HostName/$UserID,User"
    $UserFlags = $UpdateUser.Get("UserFlags")
    $SaveUserFlags = $UserFlags
    $UserFlags = $UserFlags -bor 0x0202
    $UserFlags = $UserFlags -bxor 0x0202
    $UpdateUser.Put("UserFlags", $UserFlags)
    $UpdateUser.SetInfo()
}

################################################
# ローカルグループ新規作成
################################################
function CreateGroup( $GroupName ){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $NewGroup = $Computer.Create("Group", $GroupName)
    $NewGroup.SetInfo()
}

################################################
# ローカルグループ取得
################################################
function GetLocalGroups(){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $Groups = $Computer.psbase.children | ? {$_.psBase.schemaClassName -eq "Group"} | Select-Object -expand Name
    return $Groups
}

################################################
# ローカルグループが存在するか
################################################
function ExistGroup( $GroupName ){
    $hostname = hostname
    [ADSI]$Computer = "WinNT://$hostname,computer"
    $Groups = $Computer.psbase.children | ? {$_.psBase.schemaClassName -eq "Group"} | Select-Object -expand Name
    return ($Groups -contains $GroupName)
}

 

こんな感じで使って下さい。

# ユーザー新規作成
$UserID = "HogeHoge"
$Password = "GonyoGonyo@2015"
CreateUser $UserID $Password

# グループへ参加
$UserID = "HogeHoge"
$JoinGroup = "Administrators"
JoinGroup $UserID $JoinGroup

# パスワード無期限設定
$UserID = "HogeHoge"
DontExpirePasswd $UserID

# パスワード更新
$UserID = "HogeHoge"
$Password = "P@ssw0rd%2015"
UpdatePasswd $UserID $Password

# ドメインユーザーのグループ参加
$DomainName = "contoso"
$DomainUser = "hogehoge"
$LocalGroup = "Administrators"
JoinADUser2Group $DomainName $DomainUser $LocalGroup

 

パスワード無期限設定とかのフラグコントロールは以下に情報があります

ADS_USER_FLAG_ENUM enumeration
https://msdn.microsoft.com/en-us/library/windows/desktop/aa772300(v=vs.85).aspx

ADS_UF_SCRIPT                                  = 1,        // 0x1
ADS_UF_ACCOUNTDISABLE                          = 2,        // 0x2
ADS_UF_HOMEDIR_REQUIRED                        = 8,        // 0x8
ADS_UF_LOCKOUT                                 = 16,       // 0x10
ADS_UF_PASSWD_NOTREQD                          = 32,       // 0x20
ADS_UF_PASSWD_CANT_CHANGE                      = 64,       // 0x40
ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED         = 128,      // 0x80
ADS_UF_TEMP_DUPLICATE_ACCOUNT                  = 256,      // 0x100
ADS_UF_NORMAL_ACCOUNT                          = 512,      // 0x200
ADS_UF_INTERDOMAIN_TRUST_ACCOUNT               = 2048,     // 0x800
ADS_UF_WORKSTATION_TRUST_ACCOUNT               = 4096,     // 0x1000
ADS_UF_SERVER_TRUST_ACCOUNT                    = 8192,     // 0x2000
ADS_UF_DONT_EXPIRE_PASSWD                      = 65536,    // 0x10000
ADS_UF_MNS_LOGON_ACCOUNT                       = 131072,   // 0x20000
ADS_UF_SMARTCARD_REQUIRED                      = 262144,   // 0x40000
ADS_UF_TRUSTED_FOR_DELEGATION                  = 524288,   // 0x80000
ADS_UF_NOT_DELEGATED                           = 1048576,  // 0x100000
ADS_UF_USE_DES_KEY_ONLY                        = 2097152,  // 0x200000
ADS_UF_DONT_REQUIRE_PREAUTH                    = 4194304,  // 0x400000
ADS_UF_PASSWORD_EXPIRED                        = 8388608,  // 0x800000
ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION  = 16777216  // 0x1000000

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.