Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Per Powershell eine Verbindung zum SQL Server und AD Benutzer anlegen

Frage Entwicklung Batch & Shell

Mitglied: pixel0815

pixel0815 (Level 1) - Jetzt verbinden

04.08.2014 um 12:35 Uhr, 2499 Aufrufe, 3 Kommentare

Moin moin zusammen,

momentan steh ich vor folgendem Problem:

01.
Import-Module ActiveDirectory 
02.
 
03.
######## Edit Here ######## 
04.
 
05.
# Path to create users in 
06.
$path="OU=_Benutzer-Import,DC=xx,DC=xx" 
07.
$user="pinneberg" 
08.
$PWD="12345" 
09.
$database="Pinneberg" 
10.
$dataSource="S070" 
11.
 
12.
# Connection string to SQL Server database 
13.
#$connectionString = "Server=s070;Initial Catalog=AdventureWorks2012;Integrated Security=SSPI;" 
14.
$connectionString = “Server=$dataSource;uid=$user; pwd=$pwd;Database=$database;Integrated Security=False;” 
15.
 
16.
# Select statement to return new user accounts 
17.
# Needs to return "sAMAccountName" & "Password" columns 
18.
# Note: Other columns names should match AD attribute name 
19.
$sql="SELECT LEFT (REPLACE(Vorname + '.' + Nachname,' ',''),20)  as sAMAccountName, 
20.
		Vorname + '.' + Nachname + '@kit.pi' as userPrincipalName, 
21.
		Vorname as givenName, 
22.
		Nachname as sn, 
23.
		Berufsbezeichnung as title, 
24.
		Telefon as telePhoneNumber, 
25.
		Strasse + ISNULL(CHAR(13) + CHAR(10) + Hausnummer,'') as streetAddress, 
26.
		Stadt as l, 
27.
		Bundesland as st, 
28.
		Postleitzahl as postalCode, 
29.
		Emailadresse as mail, 
30.
		Firma as company, 
31.
		Abteilung as department, 
32.
	    Land as co, 
33.
		Webseite as wWWHomePage, 
34.
		Kennwort as Password 
35.
FROM [Pinneberg].[dbo].[vEmployee]" 
36.
 
37.
########################### 
38.
 
39.
$cn = new-object system.data.sqlclient.sqlconnection 
40.
$cn.ConnectionString = $connectionString 
41.
$cn.Open() 
42.
$cmd = New-Object System.Data.SqlClient.SqlCommand 
43.
$cmd.CommandText = $sql 
44.
$cmd.connection = $cn 
45.
$dr = $cmd.ExecuteReader() 
46.
 
47.
$colCount = $dr.FieldCount 
48.
$sAMAccountNameOrdinal = $dr.GetOrdinal("sAMAccountName") 
49.
$PasswordOrdinal = $dr.GetOrdinal("Password") 
50.
 
51.
while ($dr.Read()) { 
52.
	# Get value of sAMAccountName column 
53.
	$sAMAccountName = $dr.GetValue($sAMAccountNameOrdinal) 
54.
	# Get value password column (converted to secure string for New-ADUser Cmdlet) 
55.
	$password = ConvertTo-SecureString -AsPlainText $dr.GetValue($PasswordOrdinal) -Force 
56.
		 
57.
	write-host "Creating user account..." $sAMAccountName 
58.
 
59.
	$otherAttributes = New-Object System.Collections.HashTable 
60.
 
61.
	# Create a hash table of attribute names and attribute values 
62.
	# Used to populate other attributes.  
63.
	for($i=0;$i -le $colCount-1;$i++) 
64.
65.
		$attribute = $dr.GetName($i) 
66.
 
67.
		switch ($attribute) 
68.
69.
			"Password"{} 		#Ignore 
70.
			"SAMAccountName" {} 	#Ignore 
71.
			default{ 
72.
				$otherAttributes.Add($attribute,$dr.GetValue($i)) 
73.
74.
75.
76.
	# Create Active Directory User Account 
77.
	New-ADUser -sAMAccountName $sAMAccountName -Name $sAMAccountName -Path $path -otherAttributes $otherAttributes -Enable $true -AccountPassword $password  
78.
 
79.
80.
 
81.
$dr.Close() 
82.
$cn.Close()
Ich habe hier http://www.wisesoft.co.uk/scripts/powershell_create_ad_user_accounts_fr ... etwas gefunden was mir echt gut gefällt. Allerdings habe ich folgendes Problem

Fehler:

Ausnahme beim Aufrufen von "ExecuteReader" mit 0 Argument(en): "Die SELECT-Berechtigung wurde für das 'vEmployee'-Objekt, 'Pinneberg'-Datenbank, '
dbo'-Schema verweigert."
Bei C:\Erstelle Benutzer aus SQL Datenbank.ps1:45 Zeichen:25

$dr = $cmd.ExecuteReader <<<< ()

+ CategoryInfo : NotSpecified: ( [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

Die SQL Abfrage läuft Fehlerfrei im SQL Manager. Der Benutzer pinneberg ist ein SQL Benutzer mit eigentlich allen Rechten die man anhaken kann im SQL Manager.
Gibts da noch einen Tip?

Lieber Gruß
Heiko

Mitglied: colinardo
04.08.2014, aktualisiert um 14:04 Uhr
Hallo Heiko,
du musst dem Benutzer auf deine Datenbank mindestens folgende Datenbankrollen freigeben: db_datareader
Die Vorgehensweise im MSSQL Management Studio:
Server > Sicherheit > Anmeldungen > Benutzer > Eigenschaften > Benutzerzuordnung: Datenbank auswählen und darunter die Datenbankrollen wählen.
mit eigentlich allen Rechten die man anhaken kann im SQL Manager.
wenn du da alles angehakt hast du hoffentlich nicht diese ausgewählt: db_denydatareader/-writer , denn diese bewirken genau das Gegenteil, nämlich die Verweigerung dieser Rechte.

Grüße Uwe
Bitte warten ..
Mitglied: pixel0815
04.08.2014, aktualisiert um 14:57 Uhr
Das hatte ich nicht aktiviert, habe jetzt einen anderen Benutzer genommen, nun funktioniert es fast.

Ich erhalte so eine Fehlermeldung:

Creating user account... Heiko.Test 
New-ADUser : Der Typ "System.DBNull" ist ungültig. 
Parametername: userPrincipalName 
Bei C:\Users\heiko.wellendorf\Desktop\Erstelle Benutzer aus SQL Datenbank.ps1:77 Zeichen:12 
+     New-ADUser <<<<  -sAMAccountName $sAMAccountName -Name $sAMAccountName -Path $path -otherAttributes $otherAttributes -Enable $true -AccountPa 
ssword $password  
    + CategoryInfo          : InvalidArgument: (CN=Heiko.Test,O...rt,DC=kit,DC=pi:String) [New-ADUser], ArgumentException 
    + FullyQualifiedErrorId : Der Typ "System.DBNull" ist ungültig. 
Parametername: userPrincipalName,Microsoft.ActiveDirectory.Management.Commands.NewADUser''

Das Problem ist, dass die Daten vom SQL Server irgendwie Mist sind, ich weiß aber nicht wie ich das hinbiegen soll. Ist nicht mein Streckenpferd.
Ich glaube das Problem ist das die Felder im SQL Table zuviele Zeichen enthalten die ich aber selbst nicht setze.

Hier das Skript mit dem ich die Tabelle erstellt habe


01.
  
02.
USE [Pinneberg] 
03.
GO 
04.
/****** Objekt:  Table [dbo].[vEmployee]    Skriptdatum: 08/04/2014 14:28:33 ******/ 
05.
SET ANSI_NULLS ON 
06.
GO 
07.
SET QUOTED_IDENTIFIER ON 
08.
GO 
09.
SET ANSI_PADDING ON 
10.
GO 
11.
CREATE TABLE [dbo].[vEmployee]( 
12.
	[Vorname] [char](100) NOT NULL, 
13.
	[Nachname] [char](100) NOT NULL, 
14.
	[Berufsbezeichnung] [char](150) NOT NULL, 
15.
	[Telefon] [char](50) NOT NULL, 
16.
	[Strasse] [char](100) NOT NULL, 
17.
	[Hausnummer] [char](10) NOT NULL, 
18.
	[Stadt] [char](100) NOT NULL, 
19.
	[Bundesland] [char](100) NOT NULL, 
20.
	[Emailadresse] [char](100) NOT NULL, 
21.
	[Abteilung] [char](100) NOT NULL, 
22.
	[Land] [char](10) NOT NULL, 
23.
	[Webseite] [char](50) NOT NULL, 
24.
	[Postleitzahl] [char](50) NOT NULL, 
25.
	[Firma] [char](50) NOT NULL, 
26.
) ON [PRIMARY] 
27.
 
28.
GO 
29.
SET ANSI_PADDING OFF
Wenn ich dann über den SQL Manager die Daten eintippe zum t esten, dann hab ich immer ganz viele Leerschritte hinter meinem eigentlichen Text und dann kann das Skript natürlich nix damit anfangen.

Beispiel das zusammensetzen von userPrincipalName ergibt das hier mit vielen Blanks dazwischen. Wieso?

Heiko .Test @domain.loc

Edit: Ich glaub die Blanks sind das nicht. Ich hab keine Ahnung warum ein Attribut nicht im zulässigen Bereich ist
Bitte warten ..
Mitglied: colinardo
04.08.2014, aktualisiert um 23:26 Uhr
Wenn ich dann über den SQL Manager die Daten eintippe zum t esten, dann hab ich immer ganz viele Leerschritte hinter meinem eigentlichen Text und dann kann das Skript natürlich nix damit anfangen.
Logisch weil du den Datentyp [char] mit einer festen Anzahl Zeichen verwendest anstatt z.B. [nvarchar] mit einer variablen Anzahl und Unicode-Support. http://msdn.microsoft.com/de-de/library/ms186939.aspx

In Powershell müsstest du jetzt diese zusätzlichen Blanks mit Trim() vorher eliminieren. Zusätzlich solltest du Felder auf Vorhandensein überprüfen, wenn du also keinen Wert in einer Spalte stehen hast, und du das dann an New-ADUser übergibst ist die Fehlermeldung klar System.DBNull = Kein Wert in der Spalte !
Da ich hier den Inhalt deiner DB nicht sehen kann und wie Ihr die Werte in die Datenbank geschrieben habt, kann ich nur vermuten das ihr dabei einen Fehler gemacht habt vermutlich falsche Kollation(Zeichenformat) verwendet.
Nehme also zu aller erst mal das new-aduser aus dem Script heraus, und lass dir alle Spalten in der Shell ausgeben, und überprüfe sie, erst wenn hier alles korrekt ist kannst du es wieder mit new-aduser versuchen.
ich weiß aber nicht wie ich das hinbiegen soll. Ist nicht mein Streckenpferd.
dann lass diesen Part jemand anderes übernehmen.

Ich persönlich lasse mir den Inhalt einer SQL-Tabelle immer mit folgender Funktion als Datatable zurückgeben:
01.
function Get-SQLTableContents($query,$server,$database,$username,$password){ 
02.
    $conn = new-object System.Data.SqlClient.SqlConnection 
03.
    $conn.ConnectionString = “Server=$server;Database=$database;Integrated Security=False;UID=$username;PWD=$password” 
04.
        try{ 
05.
            $conn.Open() 
06.
            $cmd = $conn.CreateCommand() 
07.
            $cmd.CommandText = $query 
08.
            $cmd.Connection = $conn 
09.
 
10.
            $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
11.
            $SqlAdapter.SelectCommand = $cmd 
12.
            $dt = New-Object System.Data.DataTable 
13.
            $SqlAdapter.Fill($dt) | out-null 
14.
            $conn.close() 
15.
            return $dt 
16.
17.
        catch{ 
18.
            echo "Fehler: $($_.Exception.Message)" 
19.
            $conn.close() 
20.
            return $false 
21.
22.
23.
 
24.
$data = Get-SQLTableContents "Select * from TestTabelle" "SERVERNAME" "DATENBANKNAME" "USERNAME" "PASSWORD" 
25.
$data | ft -AutoSize -Wrap
Grüße Uwe
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Mehrere AD Benutzer aus CSV Datei mit PowerShell erstellen (1)

Frage von windelterrorist zum Thema Batch & Shell ...

Windows Server
gelöst SQL-Server Datenbanksicherung inkl. Benutzerberechtigungen dafür? (4)

Frage von 1410640014 zum Thema Windows Server ...

Windows 10
gelöst Installationsproblem sql server 2014 auf windos 10 rechner (23)

Frage von jensgebken zum Thema Windows 10 ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...