【问题标题】:Adding multiple users to AD向 AD 添加多个用户
【发布时间】: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


【解决方案1】:

您能否尝试从

中删除引号

1) LABUser 分配,即 CN = $CN。

2) 从该行中删除 CN =。

一一尝试,希望你能得到答案。

【讨论】:

  • CN= 在该上下文中是必需的,Create 的参数必须包含对象类和相对可分辨名称。底层方法(通过 ADSI 在 iADSContainer 上显示)在此处记录,并通过 DirectoryEntry 对象以简化形式显示:msdn.microsoft.com/en-us/library/aa705987(v=vs.85).aspx
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多