欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

powershell 批量指定主管账号.ps1 公司其它程序员做的 有大用 有大大用

mail_arbitration.csv 的内容

SamAccountName,Manager

66E2190,75009126

R0019229,75009126

111278914,12200180

11193588,13301389

111118479,12200180


批量指定主管账号.ps1 的内容

Import-Module activedirectory
$date = (Get-Date).ToString("yyyyMMdd")
$Output_file1 = "C:\SCRIPTS\mail_arbitration\USER_$date.html"

Import-Csv -Path C:\SCRIPTS\mail_arbitration.csv | foreach {set-ADUser -Identity $_.samaccountname -Manager $_.Manager}
Start-Sleep 2
$newstatus = Import-Csv -Path C:\SCRIPTS\mail_arbitration.csv | foreach {Get-ADUser -Identity $_.samaccountname -Properties samaccountname,name,Manager,mail | Select-Object `
samaccountname,name,mail,`
@{Label="manager";Expression={($_.manager | Get-ADUser | select -ExpandProperty name) -join ","}}}

$newstatus | ConvertTo-Html -Title "邮件仲裁指定主管账号" -Body "<H3>邮件仲裁指定主管账号</H3>" | ForEach {$_ -replace "<tr>","<tr bgcolor=silver>"}   > $Output_file1

#邮件正文
$smtpServer = "192.168.21.20"
$smtp = New-Object Net.Mail.SmtpClient($smtpServer)
$smtpUser = "System.Script"
$smtpPassword = "cccccccccccc()"
$smtp.Credentials = New-object System.Net.networkCredential($smtpUser,$smtpPassword)
$msg = New-Object Net.Mail.MailMessage
$msg.To.Add($user1)
$msg.To.Add($user2)
$msg.To.Add($user3)
$msg.To.Add($user4)
$msg.Subject = "邮件仲裁指定主管账号_$date"
$msg.IsBodyHTML = $true
$msg.Body = get-content $Output_file1
$smtp.Send($msg)
$body = ""



好的,我将逐行详细解释这段PowerShell脚本的功能与逻辑。该脚本的目的在于从CSV文件中读取用户的 SamAccountName 和 Manager,更新Active Directory中的用户经理信息,并将结果以HTML格式发送至指定邮箱。

代码详解

  1. 导入Active Directory模块

    powershell
    Import-Module activedirectory
  • 这一行加载ActiveDirectory模块,以便使用其中的命令来操作Active Directory(AD),如Set-ADUserGet-ADUser

  • 获取当前日期并创建输出文件路径

    powershell
    $date = (Get-Date).ToString("yyyyMMdd")
    $Output_file1 = "C:\SCRIPTS\mail_arbitration\USER_$date.html"
    • Get-Date获取当前日期,并将其格式化为yyyyMMdd的字符串形式。

    • 创建一个输出文件的路径,通过日期动态生成文件名,以便保存后续生成的HTML文件。

  • 更新Active Directory中的用户信息

    powershell
    Import-Csv -Path C:\SCRIPTS\mail_arbitration.csv | foreach {set-ADUser -Identity $_.samaccountname -Manager $_.Manager} 
    • 使用Import-Csv从指定的CSV文件中读取数据,每一行被转换为对象。

    • foreach循环遍历每个对象,并通过Set-ADUser命令更新用户的经理信息。

    • $_表示当前处理的对象,通过$_.samaccountname访问当前行的SamAccountName字段,$_.Manager访问当前行的Manager字段。

  • 暂停执行

    powershell
    Start-Sleep 2
    • 让脚本暂停2秒,以等待AD更新操作的完成。

  • 获取用户状态并生成报告

    powershell
    $newstatus = Import-Csv -Path C:\SCRIPTS\mail_arbitration.csv | foreach {Get-ADUser -Identity $_.samaccountname -Properties samaccountname,name,Manager,mail | Select-Object `
    samaccountname,name,mail,`
    @{Label="manager";Expression={($_.manager | Get-ADUser | select -ExpandProperty name) -join ","}}}
    • 再次通过Import-Csv从CSV文件中读取用户数据,获取每个用户的当前状态。

    • 使用Get-ADUser获取每个用户的samaccountnamenameManagermail属性。

    • Select-Object选择需要的属性,并创建一个计算属性manager,该属性展示其经理的名字。通过-join ","将多个经理名字合并为字符串。

  • 生成HTML文件

    powershell
    $newstatus | ConvertTo-Html -Title "邮件仲裁指定主管账号" -Body "<H3>邮件仲裁指定主管账号</H3>" | ForEach {$_ -replace "<tr>","<tr bgcolor=silver>"}   > $Output_file1
    • 将获取的用户状态通过ConvertTo-Html转换为HTML格式,设置网页标题和主体内容。

    • 使用ForEach循环对HTML表格的每一行应用替换,使列表中的每行都有背景色为银色。

    • 最终将生成的HTML内容输出到之前定义的输出文件中。

  • 发送电子邮件

    powershell
    # 邮件收件人列表
    $user1 = "1111.Kang@bbbb-ict.com"
    $user2 = "2222.Ye@bbbb-ict.com"
    $user3 = "3333.Zhuang@bbbb-ict.com"
    $user4 = "4444.Chen@bbbb-ict.com"
    $user5 = "5555.mmmmm@luxshare-ict.com"
    
    # SMTP服务器信息
    $smtpServer = "192.168.21.20"
    $smtp = New-Object Net.Mail.SmtpClient($smtpServer)
    $smtpUser = "System.Script"
    $smtpPassword = "cccccccc()"
    
    # 输入SMTP凭据
    $smtp.Credentials = New-object System.Net.networkCredential($smtpUser,$smtpPassword)
    
    # 创建邮件对象
    $msg = New-Object Net.Mail.MailMessage
    $msg.To.Add($user1)
    $msg.To.Add($user2)
    $msg.To.Add($user3)
    $msg.To.Add($user4)
    $msg.From = "System.Script@bbbb-ict.com"
    $msg.Subject = "邮件仲裁指定主管账号_$date"
    $msg.IsBodyHTML = $true
    $msg.Body = get-content $Output_file1
    $smtp.Send($msg)
    • 指定收件人邮箱地址,确保包含所有需要通知的人。

    • 设置SMTP服务器地址,并创建一个SmtpClient对象。

    • 输入SMTP凭据(用户名和密码),以便发送邮件。

    • 创建邮件对象,设置发件人、主题和正文内容(从之前生成的HTML文件中读取)。

    • 通过 SMTP 服务器发送邮件。

  • 重置邮件正文

    powershell
    $body = ""
    • 这一行将 $body 变量重置为空,可视为清理变量,以避免信息被覆盖或泄露。

    总结

    整段PowerShell脚本的逻辑流程如下:

    1. 导入Active Directory模块。

    2. 读取CSV文件,更新每个用户的经理信息。

    3. 生成一个包含所有用户当前状态的HTML报告。

    4. 通过SMTP服务器将生成的报告以电子邮件的形式发送给多个指定邮箱收件人。

    这个脚本是一个典型的示例,展示了如何通过PowerShell自动化管理Active Directory中的用户信息,以及如何通过电子邮件发送报告。这可以大大提高工作效率,减少人工操作的出错率。如果你需要更深入的内容或对某部分有疑问,请告诉我!


    普通分类: