PowerShell帐户创建脚本

PowerShell帐户创建脚本,powershell,automation,active-directory,user-accounts,Powershell,Automation,Active Directory,User Accounts,我有一个相当标准的广告帐户创建脚本,我创建了,但需要自定义它,以适应我的需要,这就是我有麻烦的地方。。。我添加了基于搜索OU创建txt或csv文件的功能,并对在最后一天内创建的帐户进行了搜索筛选,其中包括帐户的用户名和密码(将创建的其他服务需要密码,非ldap),密码通过PowerShell函数随机生成 但当运行时,它只包含1个用户名,没有密码,或者当我只需要一个时,它将循环并生成3-4个日志文件。关于如何在创建所有帐户的情况下创建1个日志文件,有什么建议吗?我很确定这与脚本中csv或txt文件

我有一个相当标准的广告帐户创建脚本,我创建了,但需要自定义它,以适应我的需要,这就是我有麻烦的地方。。。我添加了基于搜索OU创建txt或csv文件的功能,并对在最后一天内创建的帐户进行了搜索筛选,其中包括帐户的用户名和密码(将创建的其他服务需要密码,非ldap),密码通过PowerShell函数随机生成

但当运行时,它只包含1个用户名,没有密码,或者当我只需要一个时,它将循环并生成3-4个日志文件。关于如何在创建所有帐户的情况下创建1个日志文件,有什么建议吗?我很确定这与脚本中csv或txt文件的位置有关,但仍在学习PowerShell:)

#2018年3月14日编辑 **加布里埃尔·露西——你建议的方式奏效了。然而,在与几个人交谈后,他们问这是否可能是CSV。我有CSV函数在这个脚本之外工作。但我需要它做同样的事情,另一个是做一个csv格式的标题为“用户名,密码”任何想法? 谢谢你的帮助! # 以下是应写入CSV的部分。。当我把它分离到另一个PS脚本中时,它就工作了。它应该循环通过CSV,并为每个用户名写上密码。但是当我把它和帐户创建脚本放在一起时,它没有写用户名或密码,我检查了我的powershell脚本,它没有被注释掉,我认为Stackoverflow的事情是对我发布的内容进行了奇怪的格式化。还是有更好的方法来做我正在尝试的事情

###
$CSV | ForEach-Object {
$FIRST = $_.FIRST_NAME
$LAST = $_.LAST_NAME
$USER = "$FIRST" + "$LAST"
$csvadd = $USER + "," + $Student_Password
$csvadd | Out-File $filename -Append -Encoding ASCII

###

Import-Module ActiveDirectory
#Imports CSV File and Starts Loop
$CSV = Import-CSV "C:\ActiveDirectory\NewStudent.csv" | % { 
#Create Variables
#
$First_Name = $_.FIRST_NAME
$Last_Name = $_.LAST_NAME
$Username = "$First_Name" + "$Last_Name"
$Student_Number = $_.Student_Number
#Shouldn'tBeNeeded-$Lunch_ID = $_.Lunch_ID
$Grade_Level = $_.Grade_Level
$School_Name = $_.School_Name
$School_Abbr = $_.School_Abbr
$Graduation_Year = $_.graduation_year
$EmployeeID = $Student_Number
$StudentPassword = New-Password
$SecurePassword = (ConvertTo-SecureString -AsPlainText $StudentPassword -
Force)
$FullName = "$First_Name" + " "+ "$Last_Name"
$UserPN = $Username + "@home.virtual.local"
$Email = $Username + "@home.virtual.local"
#NotNeeded-$LegacyEmail = $_.WEB_ID + "@home.virtual.local"
$Description = "Grade " + $Grade_Level
$Path = "OU=ScriptTesting,OU=Test Accounts,OU=People,DC=Home,DC=Local"
#$Path = "OU=" + $Grade_Level + ",OU=" + $School_Abbr + 
",OU=ScriptTesting,OU=Test Accounts,OU=People,DC=Home,DC=Local"
#NotNeeded-$GradeLevelGroup = "Stu_" + $Grade_Level + "_Grade"
#$HomeFolder = "\\staff-files\" + "$Graduation_Year\" + $Username
#
$curdate = Get-Date -Format o | foreach {$_ -replace ":", "."}
#curdate = Get-Date -format s | foreach {$_ -replace ":", "."}
$filename = "C:\Student_Accounts\logs\Usernames_Passwords-" + $curdate + 
".csv"
$CSVHeader = "Username,Password"
$CSVHeader | Out-File $filename -Encoding ASCII
##
$ADUser = Get-ADUser -LDAPFilter "(sAMAccountName=$Username)"
#
If ($ADUser -eq $Null) 
{

New-ADUser $FullName -GivenName $First_Name -Surname $Last_Name `
-SamAccountName $Username -UserPrincipalName $UserPN `
-AccountPassword (ConvertTo-SecureString $StudentPassword -AsPlainText -
 force) `
-Office $School_Name `
-Title $Graduation_Year `
-EmployeeID $Student_Number `
-DisplayName $FullName `
-Department $Grade_Level `
-Description $Description  `
-EmailAddress $Email `
-Path $Path `
-PassThru | Enable-ADAccount
#
Sets Home Directory
New-Item -Name $Username -ItemType -Path $HomeFolder | Out-Null
Set-ADUser $Username -HomeDirectory $HomeFolder -HomeDrive S:
Sets ACL List
$ACL= Get-ACL $HomeFolder
$ACL.SetAccessRuleProtection($true, $True)

#Add User to AD Grade Level Group

#Add-ADGroupMember -Identity $GradeLevelGroup -Members $Username

#Small Pause to give time for AD Account to be created before resetting 
   password
Start-Sleep -s 30

#Reset Password
Set-ADAccountPassword -Identity $Username -NewPassword $SecurePassword -
Reset | Set-ADuser -ChangePasswordAtLogon $False -PasswordNeverExpires 
$True -CannotChangePassword $True

Write-Host $StudentPassword
#Write-Host "Account Created" $Username
#Write-Host "Password for" $Username "Is" $StudentPassword
#Return $Username
#Return $StudentPassword

$CSV | ForEach-Object {
$Username = "$First_Name" + "$Last_Name"
$csvadd = $Username + "," + $Student_Password
$csvadd | Out-File $filename -Append -Encoding ASCII
}
}
}

日志文件名包括时间,包括秒和毫秒,因此,由于在循环的每次迭代中重新生成文件名,日志文件名每次都在更改,因此会得到多个日志文件

您可以通过在进入循环之前确定日志文件的名称来解决这个问题,以便循环的每个迭代都使用相同的文件

将这些行上移到脚本顶部,循环之外:

$curdate = Get-Date -Format o | foreach {$_ -replace ":", "."}
$filename = "C:\ActiveDirectory\Logs\AccountCreation\AccountsCreated-" + $curdate + ".txt"
#$CSV | ForEach-Object { ### You don't need this ForEach
#Just use the next 3 lines
$Username = "$First_Name" + "$Last_Name"
$csvadd = $Username + "," + $Student_Password
$csvadd | Out-File $filename -Append -Encoding ASCII
#}
输出到文件的行也将覆盖文件(
Out file
默认情况下覆盖):

实际上,有3种方法可以附加到文件。你挑吧。这三种方法的作用完全相同:

$log | Out-File $filename -Append
您不需要使用
写入主机
写入输出

编辑:这是我正在谈论的部分,我说要删除循环:

$curdate = Get-Date -Format o | foreach {$_ -replace ":", "."}
$filename = "C:\ActiveDirectory\Logs\AccountCreation\AccountsCreated-" + $curdate + ".txt"
#$CSV | ForEach-Object { ### You don't need this ForEach
#Just use the next 3 lines
$Username = "$First_Name" + "$Last_Name"
$csvadd = $Username + "," + $Student_Password
$csvadd | Out-File $filename -Append -Encoding ASCII
#}

如果字符串使用双引号来定义变量,则可以在字符串中包含变量,例如:
$Path=“OU=$Grade\u Level,OU=$School\u Abbr,OU=User,DC=home,DC=virtual,DC=local”
$UserPN=”$Username@home.virtual.local“
这样做可以节省在任何地方使用过多的
+
。唯一的问题是
$\uu.X
您需要将其包装在
$()
中,例如:
$LegacyEmail=“$($.WEB\u ID)@home.virtual.local”
感谢您的澄清。。它为什么现在不断生成新的日志文件是有道理的。只是想确保我理解你,当你说在我的循环之外时,你是指高于“导入CSV”路径还是高于“If($ADUser-eq$Null)”?在你的
Import CSV
行的上方进行简短测试。测试了你所说的内容,效果良好。。编辑原始帖子以反映我发现\所做的更改。感谢您帮助我使旧的日志工作正常,您仍然在循环中设置
$filename
(并写入标题)。我猜你在文件中看到了重复的标题?有时。。。我看到的是重复的标题,但不是文件名
#$CSV | ForEach-Object { ### You don't need this ForEach
#Just use the next 3 lines
$Username = "$First_Name" + "$Last_Name"
$csvadd = $Username + "," + $Student_Password
$csvadd | Out-File $filename -Append -Encoding ASCII
#}