Purpose of this PowerShell script
With this script you can create a CSV file from the Management Center’s SQL database to import it in AutoConnect’s Map Additional Printers table. (See also how to create a CSV file for Dynamic Printer Matrix and how to import CSV files with AutoConnect).
- Before running the script open it using an editor and enter values for the following varables:
- $csvpath (path to the CSV file to be created; this can be exported from Map Additional Printers beforehand but don’t have to)
- $sql_server (name of the SQL server instance)
- $sql_db (database name on the SQL server)
PowerShell script
##### ThinPrint Management Center script for creating or supplementing CSV files for AutoConnect's Map Additional Printers table (MAP) #####
##### Run this PowerShell script on the SQL server as an administrator #####
##### Fill in values to the variables $csvpath (path to the CSV file to be created), $sql_server (SQL server instance), $sql_db (Management Center database name) #####
$csvpath = "C:\temp\MapAdditionalPrinters.csv"
$sql_server = "server-name\SQLEXPRESS"
$sql_db = "ManagementCenter"
# further variables
$sql_table1 = "CONPRINTER"
$sql_table2 = "CONNECTION"
$sql_table3 = "CLUSTER"
$sql_table4 = "SOURCEPRINTER"
$sql_table5 = "SOURCE"
$sql_Con = New-Object Data.SqlClient.SqlConnection
$targetIDs = @()
$types = @()
$serveraddresses = @()
$tpclientIDs = @()
$clientaddresses = @()
$counter = @()
# reads the data from the SQL table dbo.CONPRINTER
$output = "............... Reading the database .............."
$output
$output = "number of rows (per table):"
$output
$sql_Con.ConnectionString = "Data Source=$sql_server;Integrated Security=True;Initial Catalog=$sql_db"
$sql_Con.open() # opens the connection to the database
$sql_Cmd1 = New-Object Data.SqlClient.SqlCommand
$sql_Query1 = "select * from "+$sql_table1 # SQL query
$sql_Cmd1.CommandText = $sql_Query1 # defines the SQL query
$sql_Adapter1 = New-Object System.Data.SqlClient.SqlDataAdapter # creates a query adapter
$sql_Adapter1.SelectCommand = $Sql_Cmd1
$sql_Cmd1.Connection = $sql_Con # dbo.CONPRINTER connection
$sql_Data1 = New-Object System.Data.DataSet # creates an object for storing the SQL data
$sql_Adapter1.Fill($sql_Data1) # writes the data to this object
$sql_Con.Close() # closes the connection to the database
# the same with dbo.CONNECTION
$sql_Con.open()
$sql_Cmd2 = New-Object Data.SqlClient.SqlCommand
$sql_Query2 = "select * from "+$sql_table2
$sql_Cmd2.CommandText = $sql_Query2
$sql_Adapter2 = New-Object System.Data.SqlClient.SqlDataAdapter
$sql_Adapter2.SelectCommand = $Sql_Cmd2
$sql_Cmd2.Connection = $sql_Con
$sql_Data2 = New-Object System.Data.DataSet
$sql_Adapter2.Fill($sql_Data2)
$sql_Con.Close()
# the same with dbo.CLUSTER
$sql_Con.open()
$sql_Cmd3 = New-Object Data.SqlClient.SqlCommand
$sql_Query3 = "select * from "+$sql_table3
$sql_Cmd3.CommandText = $sql_Query3
$sql_Adapter3 = New-Object System.Data.SqlClient.SqlDataAdapter
$sql_Adapter3.SelectCommand = $Sql_Cmd3
$sql_Cmd3.Connection = $sql_Con
$sql_Data3 = New-Object System.Data.DataSet
$sql_Adapter3.Fill($sql_Data3)
$sql_Con.Close()
# the same with dbo.SOURCEPRINTER
$sql_Con.open()
$sql_Cmd4 = New-Object Data.SqlClient.SqlCommand
$sql_Query4 = "select * from "+$sql_table4
$sql_Cmd4.CommandText = $sql_Query4
$sql_Adapter4 = New-Object System.Data.SqlClient.SqlDataAdapter
$sql_Adapter4.SelectCommand = $Sql_Cmd4
$sql_Cmd4.Connection = $sql_Con
$sql_Data4 = New-Object System.Data.DataSet
$sql_Adapter4.Fill($sql_Data4)
$sql_Con.Close()
# the same with dbo.SOURCE
$sql_Con.open()
$sql_Cmd5 = New-Object Data.SqlClient.SqlCommand
$sql_Query5 = "select * from "+$sql_table5
$sql_Cmd5.CommandText = $sql_Query5
$sql_Adapter5 = New-Object System.Data.SqlClient.SqlDataAdapter
$sql_Adapter5.SelectCommand = $Sql_Cmd5
$sql_Cmd5.Connection = $sql_Con
$sql_Data5 = New-Object System.Data.DataSet
$sql_Adapter5.Fill($sql_Data5)
$sql_Con.Close()
# reads share names, connection IDs, client printer IDs and selections from CONPRINTER
$output = "................. Processing data ................."
$output
$sharenames = $sql_Data1.Tables.SHARENAME
$connIDs = $sql_Data1.Tables.FK_CONNECTION
$srcprinterIDs = $sql_Data1.Tables.FK_SRCPRINTER
$actionflags = $sql_Data1.Tables.ACTIONFLAG
$output = "number of all printers:"
$output
$number = $sharenames.length
$number = ($number/2)
$number
# reads connection IDs, target server IDs and client types from CONNECTION
$connectionIDs = $sql_Data2.Tables.CONNECTION_ID
$serverIDs = $sql_Data2.Tables.CLUSTER_ID
$clienttypes = $sql_Data2.Tables.CLIENTTYPE
# reads target server IDs and target server addresses from CLUSTER
$targetserverIDs = $sql_Data3.Tables.CLUSTER_ID
$servers = $sql_Data3.Tables.NAME
# reads client IDs from SOURCEPRINTER
$clientIDs = $sql_Data4.Tables.SOURCE_ID
$printerIDs = $sql_Data4.Tables.SOURCEPRINTER_ID
# reads client printer IDs and client addresses from SOURCE
$sourceIDs = $sql_Data5.Tables.SOURCE_ID
$clients = $sql_Data5.Tables.NAME
# indentifies print server IDs and client types using connection IDs from CONNECTION
$connIDs | Foreach {
For($j = 0; $j -lt $connectionIDs.Count; $j += 1){
If( $_ -eq $connectionIDs[$j]){
$targetIDs += $serverIDs[$j]
$types += $clienttypes[$j]
}
}
}
# indentifies central print server addresses using print server IDs from CLUSTER
$targetIDs | Foreach {
For($j = 0; $j -lt $targetserverIDs.Count; $j += 1){
If( $_ -eq $targetserverIDs[$j]){
$serveraddresses += $servers[$j]
}
}
}
# indentifies client IDs using client printer IDs from SOURCEPRINTER
$srcprinterIDs | Foreach {
For($j = 0; $j -lt $printerIDs.Count; $j += 1){
If( $_ -eq $printerIDs[$j]){
$tpclientIDs += $clientIDs[$j]
}
}
}
# indentifies client addresses using client printer IDs from SOURCE
$tpclientIDs | Foreach {
For($j = 0; $j -lt $sourceIDs.Count; $j += 1){
If( $_ -eq $sourceIDs[$j]){
$clientaddresses += $clients[$j]
}
}
}
# prepares the Map Additional Printers CSV file
$output = "................. Writing CSV file ................"
$output
If( [system.io.file]::Exists($csvpath) -eq $True){ # checks whether the specified CSV file exists
$mapold = Get-Content $csvpath -readcount 0 # reads the current CSV file
Set-Content $csvpath -value $mapold # adds a linefeed after the paragraph sign ("¶")
}
Else{
Add-Content -path $csvpath -value "DefaultPrinter,UserGroup,IPRange,ClientName,Destination" # writes the table head if file doesn't already exist
}
# adds a row per share name to the Map Additional Printers CSV file
For($o = 0; $o -lt $sharenames.Count; $o += 2){
$entry0 = $clientaddresses[$o]
$entry1 = $serveraddresses[$o]
$entry2 = $sharenames[$o]
If( $actionflags[$o] -eq 2){
$counter += 1
$match = $types[$o] -match "(^[1].*$)"
If( $match -eq $True){
$match = $clientaddresses[$o] -match "(^[0-9].*$)"
If( $match -eq $True){
$mapnew = ([string]::Format("True,*,{0},*,\\{1}\{2}", $entry0,$entry1,$entry2))
}
Else{
$mapnew = ([string]::Format("True,*,*,{0},\\{1}\{2}", $entry0,$entry1,$entry2))
}
}
Else{
$mapnew = ([string]::Format("True,*,*,*,\\{0}\{1}", $entry1,$entry2))
}
Add-Content $csvpath -Value $mapnew
}
}
$output = "number of lines:"
$output
$number = $counter.length
$number
$output = ".................... Finished ....................."
$output