背景:
阅读新闻

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

  作者: 今日评论: [字体: ]

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


来源:
录入日期:[2019/05/20 11:47:00]
收藏 推荐 打印 | 录入:mikebai | 阅读:
文章评论      
正在加载评论列表...
评论关闭