Powershell 组数因个人需求而异

Powershell number of groups variable to individual needs

提问人:sanjacob 提问时间:4/18/2023 最后编辑:mklement0sanjacob 更新时间:4/19/2023 访问量:64

问:

大家好,谢谢你的帮助,

我制作了这个脚本来创建具有 de AD 中所有详细信息的新用户。 正如你所看到的,用户可以提供 5 个组的修复编号,以将新创建的用户添加到提供的组中。我不想实现的是 分配给用户的组数可能是可变的,因为有些用户是 3 的成员,有些是 5 的成员,等等。

由于我对 PowerShell 非常陌生,我不确定这是否可能,并希望有任何正确方向的提示。


#New AD user creation with all details
#On the Param Part it will collect all the parameters for #the user creation by user input.
#It's meant to be done by user input, as the user who #does the job likes it like that.  

 
  param
(
[Parameter(Mandatory=$true)][String]$Vorname_Abstand_Nachname,
[Parameter(Mandatory=$true)][String]$Vorname,
[Parameter(Mandatory=$true)][String]$Initialen_Beispiel_Miguel_Santiago_MSA,
[Parameter(Mandatory=$true)][String]$Nachname,
[Parameter(Mandatory=$true)][String]$Standort,
[Parameter(Mandatory=$true)][String]$TelefonBüro,
[Parameter(Mandatory=$true)][String]$Emailadresse,
[Parameter(Mandatory=$true)][String]$Homepage,
[Parameter(Mandatory=$true)][String]$Strasse_Abstand_Hausnummer,
[Parameter(Mandatory=$true)][String]$Kantons_Kürzel,
[Parameter(Mandatory=$true)][String]$Postleitzahl,
[Parameter(Mandatory=$true)][String]$Handynummer,
[Parameter(Mandatory=$true)][String]$Job_Titel,
[Parameter(Mandatory=$true)][String]$Abteilung,
[Parameter(Mandatory=$true)][String]$Firmenname_Abstand_AG,
[Parameter(Mandatory=$true)][String]$Vorname_Punkt_Nachname,
[Parameter(Mandatory=$true)][String]$Gruppe1,
[Parameter(Mandatory=$true)][String]$Gruppe2,
[Parameter(Mandatory=$true)][String]$Gruppe3,
[Parameter(Mandatory=$true)][String]$Gruppe4,
[Parameter(Mandatory=$true)][String]$Gruppe5
) 

New-ADUser 
-Name "$Vorname_Abstand_Nachname" 
-GivenName "$Vorname" 
-Initials "$Initialen_Beispiel_Miguel_Santiago_MSA" 
-Surname "$Nachname" 
-DisplayName "$Vorname_Abstand_Nachname" 
-Description "Login: $Vorname_Punkt_Nachname" 
-Office "$Standort" -OfficePhone "$TelefonBüro" 
-EmailAddress "$Emailadresse" 
-HomePage "$HomePage" 
-StreetAddress "$Strasse_Abstand_Hausnummer" 
-City "$Standort" -State "$Kantons_kürzel" 
-PostalCode "$Postleitzahl" 
-UserPrincipalName "$Emailadresse" 
-SamAccountName "$vorname_Punkt_Nachname" 
-PasswordNeverExpires $true 
-ScriptPath "genKIXTART.exe" 
-HomeDirectory \\server\Users$\$vorname_Punkt_Nachname 
-HomeDrive H 
-MobilePhone "$Handynummer" 
-Title "$Job_Titel" 
-Department "$Abteilung" 
-Company "$Firmenname_Abstand_AG" 
-Manager "CN=Manager Name,OU=Intern,OU=Benutzer,OU=XXX,DC=xxx,DC=local" 
-Path "OU=Intern,OU=Benutzer,OU=XXX,dc=xxx,dc=local" 
-AccountPassword (Read-Host -AsSecureString "Gib ein Passwort an. Muss mindestens 8 Zeichen lang sein. Darf weder Vor- noch Nachnamen des Benutzers beinhalten, muss Gross- und Kleinbuchstaben als auch Zahlen und Sonderzeichen enthalten") 
-Enabled $true



# This parts sets the users dial-in settings


Set-ADUser 
-Identity $Vorname_Punkt_Nachname 
-replace @{msNPAllowDialIn=$TRUE}



# This parts sets all the paramaeters for the country setting


Get-ADUser -SearchBase 'OU=Intern,OU=Benutzer,OU=QBIC,DC=QBIC,DC=LOCAL' 
-filter * | Set-ADUser -Replace @{c="CH";co="Switzerland";countryCode="756"}



# This part adds the user to the provided groups


Add-ADPrincipalGroupMembership $Vorname_Punkt_Nachname 
-MemberOf $Gruppe1,$Gruppe2,$Gruppe3,$Gruppe4


# This is the finishing part of the Script


Write-Host 
-ForegroundColor Green  'All Done!'

Write-Host 
-ForegroundColor Green 'Please press Enter to Exit'

Pause 

PowerShell 参数 参数传递

评论

0赞 mklement0 4/18/2023
两方面:永远不需要在 PowerShell 中将变量引用(如 in)括起来,即使变量包含空格也是如此。可以简化为$Vorname"..."Mandatory=$trueMandatory
0赞 sanjacob 4/18/2023
@mklement0我不确定我是否理解你的意思。1. 旁白:这是否意味着我可以这样做 / New-ADUser -Name $Vorname_Abstand_Nachname ?所以没有“”?/ 2.旁白:这是否意味着我可以从所有必需参数中删除 =$true 部分?所以就像这样 [Parameter(Mandatory)][String]$Vorname_Abstand_Nachname 等等等?
0赞 mklement0 4/18/2023
例如,使用 (无双引号)。您可以缩短为 ,因为是隐含的。New-ADUser … -GivenName "$Vorname" …New-ADUser … -GivenName $Vorname …[Parameter(Mandatory=$true)][Parameter(Mandatory)]=$true
0赞 sanjacob 4/18/2023
但是在那个问题上,我必须保留“”,正确吗?否则他会把 Login 部分作为参数?/ -描述“登录:$Vorname_Punkt_Nachname”,并且由于.exe,也在那个上?/ -脚本路径 “genKIXTART.exe”
0赞 mklement0 4/18/2023
是的,在字符串文字中(无论是否可扩展(插值)),如果它们包含空格或其他元字符,则确实需要引号,例如 .例如,您可以使用引号,但它们不是必需的;此外,对于逐字值(不包含变量值的值),最好使用(单引号)。-Description "Login: $Vorname_Punkt_Nachname"-ScriptPath "genKIXTART.exe"'...'

答:

0赞 mklement0 4/18/2023 #1

声明一个数组类型的参数,可以向其传递可变数量的参数,用,

一个简化的例子:

  • 注意:使用函数而不是脚本(文件)的唯一原因是以这种方式更容易演示解决方案(您可以将代码复制并粘贴到交互式会话中,而无需创建文件)。*.ps1

  • 重要的是块内的内容,您可以按原样使用它来替换脚本代码中的 , ..., 声明。param(...)$Gruppe1$Gruppe5

  • 块的语法是相同的,无论您是在创作函数还是脚本;另请参阅:param(...)

# Declare a sample function.
function Foo {

  param(
    # Define a -Groups parameter as an array.
    # Insert "[]" at the end of a type name to declare
    # an array of that type; in the case at hand,
    # [string[]] is an array of [string] elements.
    [Parameter(Mandatory)] [string[]] $Groups 
  )

  $Groups # Output for diagnostic purposes
}

# Call the function with 2 groups
Foo -Groups Group1, Group2

要将它们全部放在代码的上下文中(省略附带部分;查找):$Groups

param
(
  [Parameter(Mandatory = $true)][String]$Vorname_Abstand_Nachname,
  [Parameter(Mandatory = $true)][String]$Vorname,
  [Parameter(Mandatory = $true)][String]$Initialen_Beispiel_Miguel_Santiago_MSA,
  [Parameter(Mandatory = $true)][String]$Nachname,
  [Parameter(Mandatory = $true)][String]$Standort,
  [Parameter(Mandatory = $true)][String]$TelefonBüro,
  [Parameter(Mandatory = $true)][String]$Emailadresse,
  [Parameter(Mandatory = $true)][String]$Homepage,
  [Parameter(Mandatory = $true)][String]$Strasse_Abstand_Hausnummer,
  [Parameter(Mandatory = $true)][String]$Kantons_Kürzel,
  [Parameter(Mandatory = $true)][String]$Postleitzahl,
  [Parameter(Mandatory = $true)][String]$Handynummer,
  [Parameter(Mandatory = $true)][String]$Job_Titel,
  [Parameter(Mandatory = $true)][String]$Abteilung,
  [Parameter(Mandatory = $true)][String]$Firmenname_Abstand_AG,
  [Parameter(Mandatory = $true)][String]$Vorname_Punkt_Nachname,
  # Define a -Groups parameter as an *array*, instead of individual
  # -Gruppe1, -Gruppe2, ... parameters.
  # (Translate as needed, such as $Gruppen)
  [Parameter(Mandatory)] [string[]] $Groups
)

# ...


# This part adds the user to the provided groups

# Pass the $Groups parameter value as-is (as an array) to -MemberOf
Add-ADPrincipalGroupMembership $Vorname_Punkt_Nachname -MemberOf $Groups

# ...

评论

0赞 sanjacob 4/19/2023
当我准确地测试了你写的东西(编辑后的代码)并且它起作用了。/ $Groups # 用于诊断目的的输出 / 部分是否被认为在控制台中显示提供的组?我认为在最终将创建的用户添加到它们之前,向运行脚本的用户显示预配的组会很棒。到目前为止,感谢您的耐心和帮助,我非常感谢:))。我真的开始喜欢 powershell,因为它使工作变得如此容易(:D本身即可工作)。现在将检查您上面的链接。
0赞 mklement0 4/19/2023
很高兴听到它,@sanjacob;别客气。是的,默认情况下,它本身会将元素(每个元素在自己的行上)打印到控制台 - 有关此隐式输出行为的详细信息,请参阅此答案。PowerShell 需要一段时间来学习,但值得付出努力。在元注释中:您可以通过清楚地表明哪个答案(如果有的话)解决了您的问题,即接受它来帮助未来的读者。$Groups