Userdepartmentlist

Die Funktionalität des Druckeraccountings kann durch den zeitgesteuerten Aufruf des folgenden Powerscripts erweitert werden.
Hiermit wird aus der AD (Active Directory) eine Liste von Benutzern und der dazugehörigen Abteilung erzeugt. Durch Joinen der Tabellen miteinander besteht damit die Möglichkeit eine Auswertung des Druckaufkommens pro Abteilung zu realisieren.
Auch hier kommt wieder ein Microsoft SQL Server zu Einsatz. Die Daten werden in die gleiche Datenbank wie beim Druckeraccounting geschrieben.

Powershell script

import-module servermanager
import-module activedirectory
 
# dump user -> department list to database
 
$dbserver = 'eris.bayreuth.tk'
$dbuser = 'prnacc'
$dbpass = 'Secret2009'
$dbname = 'prnacc'
 
# load assemblies
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.Smo”) | Out-NULL;
 
# connect to SQL Server
$serverName = "ERIS"
$server = New-Object -typeName Microsoft.SqlServer.Management.Smo.Server -argumentList "$serverName"
 
# login using SQL authentication, which means we supply the username
# and password
$server.ConnectionContext.LoginSecure=$false;
$server.ConnectionContext.set_Login($dbuser)
$securePassword = ConvertTo-SecureString $dbpass -AsPlainText –Force
$server.ConnectionContext.set_SecurePassword($securePassword)
 
# clear the screen
cls
 
$conn = New-Object System.DATA.SqlClient.SqlConnection("Server=$dbserver; Database=$dbname; Integrated Security=SSPI")
$conn.Open()
 
$conn2 = New-Object System.DATA.SqlClient.SqlConnection("Server=$dbserver; Database=$dbname; Integrated Security=SSPI")
$conn2.Open()
 
$cmd = $conn.CreateCommand()
$cmd.CommandText = "SELECT distinct(username) from jobs"
 
$Reader = $cmd.ExecuteReader()
while ($Reader.READ()) {
  try {
    $san = $Reader.GetValue(0)
    $dep = (get-aduser -Properties Department "$san" )
    $department = $dep.Department
    IF ($department.length -lt 2) {
      Write-Host "User $san has no Department filled in!!!" -back red
    }
    else {
      # Write-Host "Record: $san - $department"
      $ins = $conn2.CreateCommand()
      $ins.CommandText = "IF EXISTS (SELECT * FROM [dbo].[deplist] WHERE username = '$san') UPDATE [dbo].[deplist] SET department = '$department' WHERE username = '$san' ELSE INSERT INTO [dbo].[deplist] (username, department) VALUES ('$san','$department')"
      $ins.ExecuteNonQuery() | out-NULL
    }
 
  }
  catch {
    Write-Host "Problem: $_" -back red
  }
}
$Reader.Close()
$conn.Close()

Datenbankschema

Das dazu passende Datenbankschema sieht wie folgt aus. Auf eine Indizierung habe ich bewusst verzichtet, da das Optimum stark vom Verwendungszweck abhängt.

Layout der Tabelle deplist

USE [prnacc]
GO
 
/****** Object:  Table [dbo].[deplist]    Script Date: 07/19/2012 12:31:35 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[deplist](
  [username] [nvarchar](50) NULL,
  [department] [nvarchar](50) NULL
) ON [PRIMARY]
 
GO