我正在使用我在網路上找到的powershell腳本,嘗試使用win7 cpu透過RSAT遠端更改Windows Server 2008上的密碼。現在,伺服器2008和win7都是虛擬機,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
我認為「呼叫」可能只適用於 powershell 3,但在查看 technet 文章後,它說它也適用於 powershell 2。我在 AD 中有一個名為「test」的帳戶,但我不確定這是否是實際的常用名稱(名稱:Test,姓氏:Test,使用者登入:[電子郵件受保護])有人可以告訴我異常是指我的 CN 不正確還是完全是其他東西?
答案1
同意上面的評論。
您可以刪除對 ADSI(Active Directory 腳本介面)的引用,因為這是「舊」的處理方式; Active Directory PS 模組旨在取代它。
因此,在您的實例中,您首先需要確認使用者物件存在。您可以使用取得 ADUsercmdlet,基於您選擇的任何搜尋條件。現在,在這個階段,我建議讓搜尋變得非常規範,也就是說,您只傳回一個使用者對象,例如:
try {
$objUser = Get-ADUser -Filter { Name -eq $user }
//
// rest of code here
//
}
catch{
Write-Host "ERROR : Failed to locate user.";
}
然後您可以使用設定 ADAccountPassword用於重設密碼的 cmdlet(請參閱超連結)。這需要使用者的專有名稱 (DN),這將是您的屬性$obj用戶傳回的對象取得 ADUser稱呼。
我無法從這裡對此進行測試,因此如果您從互動式 PowerShell 提示字元中嘗試此操作,您可以看到您的系統存在哪些屬性$obj用戶目的:
$test = Get-ADUser -Filter { Name -eq "jimbob" }
$test | Get-Member
我懷疑有一個DN或者專有名稱屬性,但就像我說的,我無法從這裡進行測試。
嘗試一下,如果您需要更多幫助,請在此處更新進度...