HTML отформатированный отчет - электронная почта через PowerShell - PullRequest
1 голос
/ 13 января 2020

Вариант использования :

  1. Создание учетной записи AD, созданной за последние 30 дней
  2. Экспорт в формат CSV или TXT
  3. Импорт данных в html отформатированный отчет по электронной почте sysAdmin

Проблема: получено электронное письмо со всеми данными строки, отображаемыми как: System.Object [] Шаг репо: Экспорт данных:

$When = ((Get-Date).AddDays(-30)).Date
Get-ADUser -Filter {whenCreated -ge $When} -Properties Name, EmailAddress,SamAccountName, LastLogonDate,whenCreated, passwordlastset, Enabled, lockedout |
Select SamAccountName,Name,EmailAddress,LastLogonDate,whenCreated,passwordlastset,Enabled,lockedout | 
Export-Csv -Path "\iteminfo.txt" –NoTypeInformation 

Импорт для создания отчета , как описано в этой записи

$users = Get-Content "\iteminfo.txt" 

# Table name
$tabName = "Report"

#Create Table object
$table = New-Object system.Data.DataTable "$tabName"

#Define Columns
$col1 = New-Object system.Data.DataColumn "User Name",([string])
$col2 = New-Object system.Data.DataColumn "Email Adderss",([string])
$col3 = New-Object system.Data.DataColumn "Login ID",([string])
$col4 = New-Object system.Data.DataColumn "Creation date",([string])
$col5 = New-Object system.Data.DataColumn "Last logon date",([string])
$col6 = New-Object system.Data.DataColumn "Last password reset",([string])
$col7 = New-Object system.Data.DataColumn "Enabled",([string])
$col8 = New-Object system.Data.DataColumn "Locked",([string])

#Add the Columns
$table.columns.add($col1)
$table.columns.add($col2)
$table.columns.add($col3)
$table.columns.add($col4)
$table.columns.add($col5)
$table.columns.add($col6)
$table.columns.add($col7)
$table.columns.add($col8)

ForEach ($item in $users)
{
        $userdata = (Get-ADUser -identity $item -properties Name,EmailAddress,SamAccountName,LastLogonDate,whenCreated,passwordlastset,Enabled,lockedout )
        
        #Create a row
        $row = $table.NewRow()

        #Enter data in the row
        $row."User name" = ($userdata."Name")
        $row."Email Address" = ($userdata."EmailAddress")
        $row."User ID" = ($userdata."SamAccountName")
        $row."Creation date" = ($userdata."created")
        $row."Last logon date" = ($userdata."LastLogonDate")
        $row."Last password reset" = ($userdata."PasswordLastSet")
        $row."Enabled" = ($userdata."Enabled")
        $row."Locked" = ($userdata."Lockedout")

        #Add the row to the table
        $table.Rows.Add($row)

}
#Communication template
#Creating head style
$Head = @"
 
<style>
  body {
    font-family: "Arial";
    font-size: 8pt;
    color: #4C607B;
    }
  th, td { 
    border: 1px solid #e57300;
    border-collapse: collapse;
    padding: 5px;
    }
  th {
    font-size: 1.2em;
    text-align: left;
    background-color: #003366;
    color: #ffffff;
    }
  td {
    color: #000000;
    }
  .even { background-color: #ffffff; }
  .odd { background-color: #bfbfbf; }
</style>
 
"@

# Creating body
[string]$body = [PSCustomObject]$table | select -Property "User name","Email Address","User ID","Creation date","Last logon date","Last password reset","Enabled","Locked" | sort -Property "User name"  | ConvertTo-HTML -head $head -Body "<font color=`"Red`"><h4> Account(s) Created In The Last 30 Days and Status </h4></font> 

и я продолжал получать ошибку system.object [], которая, как я полагаю, вероятна из-за того, как я импортирую данные. Кто-нибудь знает, как это можно исправить? Received email

1 Ответ

1 голос
/ 13 января 2020

В вашем примере есть некоторые проблемы.

  1. Вам необходимо преобразовать содержимое в объект PSObject, используя

ConvertFrom-Csv $users = Get-Content "\iteminfo.txt" -Raw | ConvertFrom-Csv

Некоторые другие ошибки, обнаруженные между определениями / назначениями столбцов (Адрес электронной почты / Адрес электронной почты и Идентификатор для входа / Идентификатор пользователя

При выполнении ForEach ($item...) вам потребуется использовать $item.SamAccountName, который будет работать, так как ConvertFrom-csv был реализован на первом шаге.

Вам вообще не нужно использовать объект datatable / datarow для этого. Обычно вы будете использовать придется иметь дело с этим, если вы запрашиваете базу данных SQL. В вашем случае это уровень сложности, который ничего не приводит к таблице.

Вот модифицированный скрипт

$When = ((Get-Date).AddDays(-30)).Date
Get-ADUser -Filter {whenCreated -ge $When} -Properties Name, EmailAddress,SamAccountName, LastLogonDate,whenCreated, passwordlastset, Enabled, lockedout |
Select SamAccountName,Name,EmailAddress,LastLogonDate,whenCreated,passwordlastset,Enabled,lockedout | 
Export-Csv -Path "\iteminfo.txt" –NoTypeInformation 

$users = Get-Content "\iteminfo.txt" -Raw | ConvertFrom-Csv

# Table name
$tabName = "Report"

#Create Table object
$table = New-Object system.Data.DataTable "$tabName"

#Define Columns
$AddCol = {}

$col1 = New-Object system.Data.DataColumn "User Name",([string])
$col2 = New-Object system.Data.DataColumn "Email Address",([string])
$col3 = New-Object system.Data.DataColumn "Login ID",([string])
$col4 = New-Object system.Data.DataColumn "Creation date",([string])
$col5 = New-Object system.Data.DataColumn "Last logon date",([string])
$col6 = New-Object system.Data.DataColumn "Last password reset",([string])
$col7 = New-Object system.Data.DataColumn "Enabled",([string])
$col8 = New-Object system.Data.DataColumn "Locked",([string])

#Add the Columns
$table.columns.add($col1)
$table.columns.add($col2)
$table.columns.add($col3)
$table.columns.add($col4)
$table.columns.add($col5)
$table.columns.add($col6)
$table.columns.add($col7)
$table.columns.add($col8)

ForEach ($item in $users)
{
        $userdata = (Get-ADUser -identity $item.SamAccountName -properties Name,EmailAddress,SamAccountName,LastLogonDate,whenCreated,passwordlastset,Enabled,lockedout )

        #Create a row
        $row = $table.NewRow()

        #Enter data in the row
        $row."User name" = ($userdata."Name")
        $row."Email Address" = ($userdata.EmailAddress)
        $row."Login ID" = ($userdata.SamAccountName)
        $row."Creation date" = ($userdata."created")
        $row."Last logon date" = ($userdata."LastLogonDate")
        $row."Last password reset" = ($userdata."PasswordLastSet")
        $row."Enabled" = ($userdata."Enabled")
        $row."Locked" = ($userdata."Lockedout")

        #Add the row to the table
        $table.Rows.Add($row)

}
#Communication template
#Creating head style
$Head = @"

<style>
  body {
    font-family: "Arial";
    font-size: 8pt;
    color: #4C607B;
    }
  th, td { 
    border: 1px solid #e57300;
    border-collapse: collapse;
    padding: 5px;
    }
  th {
    font-size: 1.2em;
    text-align: left;
    background-color: #003366;
    color: #ffffff;
    }
  td {
    color: #000000;
    }
  .even { background-color: #ffffff; }
  .odd { background-color: #bfbfbf; }
</style>

"@

# Creating body
[string]$body = [PSCustomObject]$table | select -Property "User name","Email Address","User ID","Creation date","Last logon date","Last password reset","Enabled","Locked" | sort -Property "User name"  | ConvertTo-HTML -head $head -Body "<font color=`"Red`"><h4> Account(s) Created In The Last 30 Days and Status </h4></font>"

Дополнительные примечания относительно вашего сценария

Поскольку вы используете Get-ADUser для каждого пользователя в отчете после импорта, некоторые вещи, такие как LastLogonDate / PasswordLastSet не будут будут значения, которые вы экспортировали, но самые актуальные значения из AD.

Упрощенная версия

Во всех случаях вам не нужны таблицы данных и данные строки здесь. Вы можете упростить y используйте Выбрать, чтобы назначить пользовательские метки вашим данным и преобразовать их непосредственно в html оттуда (обратите внимание, что здесь я удалил дополнительный Get-AdUser, чтобы вместо этого использовать данные отчета CSV, но если вы захотите снова запросить AD, вы можете сделать это аналогично без дататов / datarow).

$users = Get-Content "\iteminfo.txt" -Raw | ConvertFrom-Csv

$Head = @"

<style>
  body {
    font-family: "Arial";
    font-size: 8pt;
    color: #4C607B;
    }
  th, td { 
    border: 1px solid #e57300;
    border-collapse: collapse;
    padding: 5px;
    }
  th {
    font-size: 1.2em;
    text-align: left;
    background-color: #003366;
    color: #ffffff;
    }
  td {
    color: #000000;
    }
  .even { background-color: #ffffff; }
  .odd { background-color: #bfbfbf; }
</style>

"@


# Creating body
[string]$body = $users | Sort -Property Name |
select @{Name = 'User Name';Expression = {$_.Name}},
@{Name = 'Email Address';Expression = {$_.EmailAddress}},
@{Name = 'Login ID';Expression = {$_.SamAccountName}},
@{Name = 'Creation date"';Expression = {$_.created}},
@{Name = 'Last logon date';Expression = {$_.LastLogonDate}},
@{Name = 'Last password reset';Expression = {$_.PasswordLastSet}},
Enabled,
@{Name = 'Locked';Expression = {$_.Lockedout}} | 
ConvertTo-HTML -head $head -Body "<font color=`"Red`"><h4> Account(s) Created In The Last 30 Days and Status </h4></font>"
...