【问题标题】:Powershell: Add user to groups from arrayPowershell:将用户添加到数组中的组
【发布时间】:2014-10-22 00:23:11
【问题描述】:

我正在尝试编写一个 PowerShell 脚本,该脚本将根据部门和职位创建一个用户,并将它们添加到特定于该职位的 AD 组中。我有一个函数可以创建新用户并尝试将用户加入到数组中的组列表中。

function CreateUser{
     $sam = "$first.$last";...;$pwd = ConvertTo-SecureString "password" -AsPlainText -Force
     New-ADUser -Company "MyCompany" -Department $dept -Description $desc -DisplayName $dname -EmailAddress $email -GivenName $first -Office $office -Path $path -SamAccountName $sam -Surname $last -UserPrincipalName $email
     foreach ($group in $groups) { if (Get-ADGroup $group) { Add-ADGroupMember $group $sam } }
     }

我还有一段代码可以创建 $groups 数组

$positions = @()
if ($dept -eq "CSR") { $positions += "CSR Rep","CSR Lead","CSR Manager" }
if ($dept -eq "IT") { $positions += "Sysadmin","Netadmin","Sqladmin" }
...
$groups = @()
if ($position -eq "CSR Rep") { $groups += "group1","group2","group3",...,"groupN" }
if ($position -eq "CSR Lead") { $groups += "group1","group2","group3","group4",...,"groupN" }
if ($position -eq "CSR Manager") { $groups += "group1","group2","group3","group4","group5",...,"groupN" }
if ($position -eq "Sysadmin") { $groups += "group6","group7",...,"groupN" }
if ($position -eq "Netadmin") { $groups += "group7","group8","group9",...,"groupN" }
if ($position -eq "Sqladmin") { $groups += "group10","group11","group12",...,"groupN" }

在我指定了创建组数组的部门和位置后,我调用了 CreateUsers 函数,但我得到了错误,就像它是一个空数组一样。

在尝试将参数传递给函数时我是否遗漏了什么,或者是否有更好的方法来完成此任务?
任何帮助将不胜感激。

【问题讨论】:

  • 请告诉我们您如何调用该函数并发布错误
  • 最初我只是调用像'CreateUser'这样的函数,而没有指定任何参数来配合它。像 $first 和 $last 这样的东西会自动被填充,我并没有想太多。我确实尝试将 $groups 指定为参数,但我尝试了 [array]。我得到的错误是:Get-ADGroup:无法验证参数“身份”的参数。参数为空。提供一个非空参数并再次尝试该命令。在 usermanagement.ps1:131 char:19 + if (Get-ADGroup
  • 这仅在您在函数中使用的变量事先声明时才有效,如果您想安全,我建议您始终使用参数。有关如何正确声明 $groups 参数的示例,请参阅我的答案中的第一个参数声明
  • 我已经添加了上面的参数,经过一些故障排除后发现,由于某种原因,我存储组的变量在运行以创建用户之前被删除。似乎我有一些错误需要修复,然后才能创建用户。
  • 我能够将组放入变量中,并且一切都像魅力一样工作。感谢您对调用函数的澄清。

标签: arrays powershell active-directory


【解决方案1】:

由于您的代码没有显示函数调用并且您的函数没有定义任何参数,我假设您没有向它传递任何东西。

下面是如何使用带有三个示例参数的参数,其中一个是 String[]:

function CreateUser{
     param(
     [parameter(Mandatory=$True)]
     [ValidateNotNullOrEmpty()]
     [string[]] $groups,
     [parameter(Mandatory=$True)]
     [ValidateNotNullOrEmpty()]
     [hashtable] $userInfo,
     [parameter(Mandatory=$True)]
     [ValidateNotNullOrEmpty()]
     [securestring] $pwd
     )

     New-ADUser -Company "MyCompany" -Department $userInfo.dept -Description $userInfo.desc -DisplayName $userInfo.dname -EmailAddress $userInfo.email -GivenName $userInfo.first -Office $userInfo.office -Path $userInfo.path -SamAccountName $userInfo.sam -Surname $userInfo.last -UserPrincipalName $userInfo.email
     foreach ($group in $groups) { if (Get-ADGroup $group) { Add-ADGroupMember $group $userInfo.sam } }
     }

为了保持较低的参数数量,我将用户信息合并到一个哈希表中。哈希表是键值集,可以这样创建:

$userInfo = @{sam="sam"; dept="department"; desc="description"; ...}

要正确调用您的函数,请执行以下操作:

CreateUser -groups $groups -userInfo $userInfo -pwd $pwd

您当然可以添加更多参数。有关可能的定义和验证方法的文档,请参阅Technet

【讨论】:

  • 感谢您的帮助。我将尝试创建一个哈希表来传递这些参数,看看是否可行。
【解决方案2】:

如果您要创建的函数不仅仅是带有参数的简单事物,我强烈建议您在其中包含参数。如:

function CreateUser{
Param([Parameter(Position=0)][string]$First = $(throw "You must specify a first name"),
[Parameter(Position=1)][string]$Last = $(throw "You must specify a last name"),
[Parameter(Position=2)][string]$Desc = $(throw "You must specify a description"),
[Parameter(Position=3)][string]$Dept = $(throw "You must specify a department"),
[Parameter(Position=4)][string]$Office = $(throw "You must specify an office"),
[Parameter(Position=5)][string]$Password = $(throw "You must specify a password"),
[string[]]$Groups
)
     $sam = "$first.$last"
     $pwd = ConvertTo-SecureString $Password -AsPlainText -Force
     $email = "$first.$last@company.com"
     $dname = "$First $Last"
     $Path = "ou=$office,ou=Users,DN=company,DN=local"
     New-ADUser -Company "MyCompany" -Department $dept -Description $desc -DisplayName $dname -EmailAddress $email -GivenName $first -Office $office -Path $path -SamAccountName $sam -Surname $last -UserPrincipalName $email
     foreach ($group in $groups) { if (Get-ADGroup $group) { Add-ADGroupMember $group $sam } }
}

然后,当您调用该函数时,您会这样做:

CreateUser "Jim" "Kirk" "Captain Extraordinaire" "Space" "$uper$ecret123" @("ExploreNewWorlds","WhereNoManHasGone")

或者您可以按名称指定参数:

CreateUser -First "Jim" -Last "Kirk" -Desc "Captain Extraordinaire" -Dept "Space" -Password "$uper$ecret123" -Groups @("ExploreNewWorlds","WhereNoManHasGone")

...当我忙于发布这篇文章时,Paul 打败了我。干得好,保罗!

编辑: 另外,我想向您介绍Switch cmdlet。我想你会从中受益匪浅。虽然您的几个 If 语句可能确实有效,但请考虑一下:

Switch($position){
    "CSR Rep" { $groups += "group1","group2","group3",...,"groupN";continue }
    "CSR Lead" { $groups += "group1","group2","group3","group4",...,"groupN";continue }
    "CSR Manager" { $groups += "group1","group2","group3","group4","group5",...,"groupN";continue }
    "Sysadmin" { $groups += "group6","group7",...,"groupN";continue }
    "Netadmin" { $groups += "group7","group8","group9",...,"groupN";continue }
    "Sqladmin" { $groups += "group10","group11","group12",...,"groupN" }
}

这很简单,在您的情况下可能不会提供太多的性能改进,但 Switch 提供了一个更简洁的解决方案,并且通过多个 If 语句提高了性能。它还允许更多的逻辑,例如:

Switch($position){
    {$_ -match "CSR" } { $groups += "group1", "group2" }
    {$_ -match "CSR" -and -not $_ -match "Rep"} { $groups += "group3","Group4" }
}

这将为所有 CSR 添加第 1 组和第 2 组,并且只有领导和经理获得第 3 组和第 4 组。无论如何,只是需要考虑的事情。

【讨论】:

  • 感谢您的帮助。我喜欢开关的想法。我将通过将参数传递给函数来尝试一下,并让你知道它是如何进行的。
猜你喜欢
  • 2011-11-19
  • 2022-01-02
  • 2011-03-28
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多