【问题标题】:PowerShell Dynamic Creation of ADUsers from imported ExcelsheetPowerShell 从导入的 Excel 表动态创建 AD 用户
【发布时间】:2021-07-09 11:31:33
【问题描述】:

首先,我想说,我对 PowerShell 非常、非常 新手。这是我写的第一个 PS 脚本。

我目前正在开发用于 AD 管理的 PS 脚本。目前,用于添加/删除 SmbShares、从组中添加或删除用户等的脚本已经完成。 我已经有一个用于在 AD 中创建用户的工作脚本,但它不是动态的,因为在硬编码变量中,所有这些都必须输入到 new-ADUser 命令中。由于代码将用于多个特定参数集,因此它必须是动态的。

我正在使用 Import-Excel 并找到了一个很棒的函数 here,但是我在使用这个函数时遇到了两个问题。

    $sb = {
  param($propertyNames, $record)
  $propertyNames | foreach-object -Begin {$h = @{} }  -Process {
      if ($null -ne $record.$_) {$h[$_] = $record.$_}
  } -end {New-AdUser @h -verbose}
}
      



Use-ExcelData -Path $Path -HeaderRow 1 -scriptBlock $sb

其中的动态部分是,表头将用作 New-ADUser 的参数名。如果需要更改的参数数量是在 Excel 表中添加或删除一列,则只需更改一件事。列标题始终需要与 New-ADUser 的参数同名。

Screenshot of excel table

我现在的问题是我在 A 列中的“类型”标题。需要指定用户的类型才能将用户添加到特定的 ADGroups。但是由于上面的函数使用所有标题作为参数,这不起作用。 有谁知道如何更改函数 $sb 使其从第二列开始?我已经尝试过使用 skip 1 并尝试了许多其他解决方法,但是根据我的 non 经验,没有什么可以接近我所需要的。

解决了以下问题:将 -DataOnly 添加到 Use-ExcelData,现在它可以工作了。

第二个问题是,一旦没有更多的参数值,该函数就不会停止尝试创建用户。为了尝试,我删除了“类型”列。在尝试创建两个用户 testuser 和 testuser2 的示例中,Powershell 毫无问题地创建了用户,但随后询问了新 ADUser 的名称。

AUSFÜHRLICH: Ausführen des Vorgangs "New" für das Ziel "CN=Test User,CN=Users,DC=****,DC=**".
AUSFÜHRLICH: Ausführen des Vorgangs "New" für das Ziel "CN=Test2 User2,CN=Users,DC=****,DC=**".
Cmdlet New-ADUser an der Befehlspipelineposition 1
Geben Sie Werte für die folgenden Parameter an:
Name:

提前谢谢你,对不起我的英语,如果我在论坛上做错了什么,请告诉我。

【问题讨论】:

  • 您能否更具体一些并提供minimal reproducible example?现在这个问题似乎很混乱(我在编辑之前理解它,但现在我不知道发生了什么)。

标签: excel powershell


【解决方案1】:

我明白了,我会将 Excel 工作表另存为 CSV 文件,然后将其导入。它更快更容易消费。标头成为您的参数名称,并且导入的行为与任何其他对象一样。

$csvData = Import-csv -path <path to csv file>

从这里迭代行并将值作为行的属性访问。无需将数据导入哈希表,它已经可以通过标题行定义的属性名称访问。

foreach ($row in $csvData) {
  Write-Host $row.Name
  Write-Host $row.Path
  }

一旦循环到达文件末尾,它就会停止尝试创建用户。

仅供参考,使用单字母变量会使您的代码非常难以维护。光是看着就眼睛疼。

【讨论】:

  • 非常感谢!稍后我会尝试一下。但这可能是动态的吗?因为不必使用 $row.Name 等遍历标题行。正如我在最初的问题中所写,代码需要能够自动使用标题行作为 new-aduser 的参数,作为我问题中的函数做。因此,如果 excel 中的表有一个新列,我们就说地址。然后应将地址用作参数名称,然后将值传递给 new-aduser 函数。这可能吗?再次提前感谢您!
  • 嗨@ErnestCorreale。试了一下。将excel表格转换为csv。 excel表的表头不会成为参数表头。 $csvData 看起来像这样(总共有 15 个分号行):Path;Name;GivenName;Surname;SamAccountName;EmailAddress;City;Department;Manager; -------------------------------------------------------------------------------- CN=Users CN=Users ;;;;;;;;;
猜你喜欢
  • 2016-08-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
相关资源
最近更新 更多