作成 2023.03.30
更新 2023.03.30
ドメイン外からドメイン ユーザーのパスワードを変更する
パスワード変更に成功した後、Windows 資格情報も更新します
$target_dc = "db-dc1.db.lan"
$file_sv = "db-file1.db.lan"
$user_name = "db-user1@db.lan"
$old_pass = "old_password"
$new_pass = "new_password"

$provider = New-Object Microsoft.CSharp.CSharpCodeProvider
$params = New-Object System.CodeDom.Compiler.CompilerParameters
$params.GenerateInMemory = $True
$params.TreatWarningsAsErrors = $True
$refs = @("System.dll","System.DirectoryServices.dll","System.DirectoryServices.AccountManagement.dll")
$params.ReferencedAssemblies.AddRange($refs)

# C Sharp
$txtCode = '
using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

public class MyPass {
    private string my_domain = "";
    private bool change_result = false;
    public MyPass(){}
    public void SetDomain(string dns_domain){
        my_domain = dns_domain;
        return;
    }
    public string AuthTest(string upn, string pass){
        try
        {
            using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain, my_domain, upn, pass))
            using(UserPrincipal usr = UserPrincipal.FindByIdentity(ctx, upn)){ return usr.Name; }
        }
        catch(NullReferenceException){ return upn + " アカウントが見つかりませんでした"; }
        catch(DirectoryServicesCOMException){ return "ユーザー名またはパスワードが正しくありません。"; }
        catch(PrincipalServerDownException){ return "サーバーに接続できませんでした。ユーザーのドメイン名が違っているかもしれません。"; }
        catch(Exception my_e){ return my_e.ToString(); }
    }

    public string ChangePassword(string upn, string old_pass, string new_pass){
        try
        {
            using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain, my_domain, upn, old_pass))
            using(UserPrincipal usr = UserPrincipal.FindByIdentity(ctx, upn))
            {
                change_result = false;
                usr.ChangePassword(old_pass, new_pass);
                change_result = true;
                return "パスワードを変更しました。";
            }
        }
        catch(NullReferenceException){ return upn + " アカウントが見つかりませんでした"; }
        catch(DirectoryServicesCOMException){ return "ユーザー名またはパスワードが正しくありません。"; }
        catch(PrincipalServerDownException){ return "サーバーに接続できませんでした。ユーザーのドメイン名が違っているかもしれません。"; }
        catch(PasswordException){ return "パスワードはパスワード ポリシーの要件を満たしていません。パスワードの最短の長さ、パスワードの複雑性、およびパスワード履歴の要件を確認してください。"; }
        catch(Exception my_e){ return my_e.ToString(); }
    }

    public bool GetChangeResult(){
        return change_result;
    }
}
'

$results = $provider.CompileAssemblyFromSource($params, $txtCode)
$results.Errors
$mAssembly = $results.CompiledAssembly
$i = $mAssembly.CreateInstance("MyPass")

$i.SetDomain($target_dc)
$i.AuthTest($user_name,$old_pass)
$i.ChangePassword($user_name,$old_pass,$new_pass)
if($i.GetChangeResult()){
    cmdkey /add:"$file_sv" /user:"$user_name" /pass:"$new_pass"
}

©2004-2017 UPKEN IPv4