私はオンラインで見つけた PowerShell スクリプトを使用して、Windows Server 2008 のパスワードを RSAT 経由でリモートで変更するために、win7 CPU を使用しようとしています。現在、Server 2008 と win7 は VM であり、win7 CPU はサーバーにドメイン化されており、PowerShell の Active Directory モジュールを適切に実行できます。私は PowerShell とサーバーの取り扱いにかなり不慣れです (このプロジェクトはインターンシップでのトレーニングです)。このスクリプトをコンパイルしようとすると、エラーが発生します。
import-Module ActiveDirectory
Function Set-AdUserPwd
{
Param(
[string]$user,
[string]$pwd
) #end param
$oUser = [adsi]"LDAP://$user"
$ouser.psbase.invoke("SetPassword",$pwd)
$ouser.psbase.CommitChanges()
} # end function Set-AdUserPwd
Set-AdUserPwd -user "cn=test,ou=Users,dc=ifrit,dc=local" -pwd P@ssword1
Exception calling "Invoke" with "2" argument(s): "There is no such object on the server.
"
At line:10 char:25
+ $ouser.psbase.invoke <<<< ("SetPassword",$pwd)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
'invoke' は PowerShell 3 だけの機能だと思っていたのですが、TechNet の記事を見ると PowerShell 2 にも適用されると書いてありました。AD に 'test' というアカウントがあるのですが、それが実際の共通名かどうかはわかりません (名: Test、姓: Test、ユーザー ログオン名:[メールアドレス]) この例外は、CN が間違っていることを意味しているのか、それともまったく別の何かなのかを教えていただけますか?
答え1
上記のコメントに同意します。
ADSI (Active Directory Scripting Interface) への参照は削除できます。これは「古い」方法であるためです。Active Directory PS モジュールは、これを置き換えるように設計されています。
したがって、インスタンスでは、まずユーザーオブジェクトが存在することを確認する必要があります。これは、取得ADユーザーコマンドレットは、選択した検索条件に基づいて実行されます。この段階では、検索をかなり厳密にして、1 つのユーザー オブジェクトのみを返すようにすることをお勧めします。例:
try {
$objUser = Get-ADUser -Filter { Name -eq $user }
//
// rest of code here
//
}
catch{
Write-Host "ERROR : Failed to locate user.";
}
その後、ADAccountPassword の設定パスワードをリセットするためのコマンドレット(ハイパーリンクを参照)。これには、ユーザーの識別名(DN)が必要です。これは、$objユーザー返されるオブジェクト取得ADユーザー電話。
ここではテストできませんが、対話型PowerShellプロンプトから試してみると、どのような属性が存在するかがわかります。$objユーザー物体:
$test = Get-ADUser -Filter { Name -eq "jimbob" }
$test | Get-Member
私は、DNまたは識別名属性ですが、前述したように、ここからテストすることはできません。
ぜひ試してみて、さらにサポートが必要な場合は、進捗状況をここで更新してください...