https://www.vwnet.jp/Windows/PowerShell/MaintenanceLocalAccunt.htm
ドメイン環境であればアカウント メンテナンス用の 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