【发布时间】:2016-08-08 03:04:59
【问题描述】:
这个脚本今天在测试时运行良好。我做了一些更改并开始出现错误。然后我回到我从互联网上得到的最原始的脚本,现在即使它也不起作用。错误是:
使用“0”参数调用“SetInfo”的异常:“违反约束
发生了。”
在 C:\Scripts\CreateTest2.ps1:51 char:2
+ $LABUser.SetInfo()
+~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
使用“2”参数调用“调用”的异常:“在
服务器。”
在 C:\Scripts\CreateTest2.ps1:55 char:2
+ $LABUser.psbase.invoke("setPassword", $Pwrd)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodTargetInvocation
使用“2”参数调用“InvokeSet”的异常:“目录属性
在缓存中找不到”
在 C:\Scripts\CreateTest2.ps1:56 char:2
+ $LABUser.psbase.invokeSet("AccountDisabled", $false)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodTargetInvocation
使用“0”参数调用“CommitChanges”的异常:“违反约束
发生了。”
在 C:\Scripts\CreateTest2.ps1:57 char:2
+ $LABUser.psbase.CommitChanges()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
这是脚本。我做错了什么?
function Select-FileDialog {
param(
[string]$Title,
[string]$Directory,
[string]$Filter = "CSV Files(*.csv)|*.csv"
)
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
$objForm = New-Object System.Windows.Forms.OpenFileDialog
$objForm.InitialDirectory = $Directory
$objForm.Filter = $Filter
$objForm.Title = $Title
$objForm.ShowHelp = $true
$Show = $objForm.ShowDialog()
if ($Show -eq "OK") {
return $objForm.FileName
} else {
exit
}
}
$FileName = Select-FileDialog -Title "Import an CSV file" -Directory "c:\"
$SelectOU = "OU=Test2,OU=Users,OU=Domain Controllers"
$domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain()
$DomainDN = (([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Domains | ? {$_.Name -eq $domain}).GetDirectoryEntry().distinguishedName
$final = "LDAP://$DomainDN"
$DomainPath = [ADSI]"$final"
$UserInformation = Import-Csv $FileName
$OUPath = "LDAP://$SelectOU,$DomainDN"
$UserPath = [ADSI]"$OUPath"
foreach ($User in $UserInformation) {
$CN = $User.samAccountName
$SN = $User.Surname
$Given = $User.givenName
$samAccountName = $User.samAccountName
$Display = $User.DisplayName
$LABUser = $UserPath.Create("User", "CN=$CN")
Write-Host "Please Wait..."
$LABUser.Put("samAccountName", $samAccountName)
$LABUser.Put("sn", $SN)
$LABUser.Put("givenName", $Given)
$LABUser.Put("displayName", $Display)
$LABUser.Put("userPrincipalName", "$samAccountName@$domain")
$LABUser.SetInfo()
$Pwrd = $User.Password
$LABUser.psbase.invoke("setPassword", $Pwrd)
$LABUser.psbase.invokeSet("AccountDisabled", $false)
$LABUser.psbase.CommitChanges()
}
Write-Host "Script Completed"
【问题讨论】:
-
对不起格式混乱
-
那么,您到底要问什么?到目前为止,您做了哪些故障排除?您是否搜索过错误消息的含义? (这个想法是至少自己执行一些敷衍的故障排除,而不是进行“代码转储”,然后期望其他人为您调试和修复它。)
-
约束冲突,第一个也是最重要的错误,意味着你要求目录做它不想做的事情。复制 sAMAccountName、复制 userPrincipalName、复制 distinctName 或相对 distinctName 等等。
-
我已经完成了自己的故障排除。我回到了始终有效的原始代码,并从 AD 中删除了所有用户,但仍然出现错误。我将尝试使用新名称列表,但它不应该重复任何内容,因为我已经删除了所有用户。
-
所以基本上,是的:您要求其他人为您排除故障、调试/修复/重写您的代码。我建议您发布一个没有任何 GUI 杂乱或非必要代码的最小示例(请参阅sscce.org),以便其他人可以轻松地重现该问题。
标签: powershell scripting active-directory