ostseebenni
Goto Top

Benutzerdaten per Batch oder VB aus AD auslesen

Hallo liebe Leute,

Nun Google ich schon seid 4h im Inet rum und finde einfach keine eindeutige Antwort.
Folgendes Problem:

Ein Benutzer ist mit seinem Clientpc an einem Active Directory angemeldet der seine gesamten benutzerdaten herausfindet.
Die Benutzerrechte liegen so dass der Benutzer keine Mails verschicken kann.
Er hat jedoch auch nicht die Möglichkeit einen Drucker anzuschließen um Dateien zu drucken.
Hierfür hab ich mir den PDFmailer heruntergeladen der die zu druckende Datei als Pdf speichert.
Nun soll per Batch oder VB oder ähnlichem eine Mail via CMD verschickt werden.
Und zwar an den angemeldeten User. Bei der nächsten Sitzung ist dies aber vll wieder ein ganz anderer User mit einer anderen Emailadresse sodass keine feste adresse als parameter angegeben kann.

Wie also lese ich aus den Userprofilen einer Ad einzelne Komponenten aus und speichere sie zur weiterverarbeitung in Variablen?

LG
Benni

Content-ID: 59601

Url: https://administrator.de/contentid/59601

Ausgedruckt am: 26.11.2024 um 08:11 Uhr

gemini
gemini 23.05.2007 um 12:32:38 Uhr
Goto Top
Sorry, aber so ganz verstanden hab ich nicht, was du willst. Nur das eine Mail an unterschiedliche Adressaen per CMD versandt werden soll.
Evtl. solltest du die Satzstellung deines Postings nochmals überdenken.

Nun, ein Script das u.a. die Mailadresse ausliest:
List User Account General Page Properties

Zwei Scripte, das Mails verschicken können einmal mit, einmal ohne SMTP
Send Email from a Script
Send Email without Installing the SMTP Service
(Quellen: Microsoft TechNet Script Repository)

Blat, ein commandline mailer

HTH,
gemini
ostseebenni
ostseebenni 23.05.2007 um 13:12:40 Uhr
Goto Top
also eigentlich will ich nur die emailadresse des angemeldeten user auslesen und diese als empfängeradresse an den blat anhängen
Biber
Biber 23.05.2007 um 22:32:20 Uhr
Goto Top
Moin ostseebenni,
also eigentlich will ich nur die emailadresse des angemeldeten user auslesen und diese als empfängeradresse an den blat anhängen
Aber gemini wollte Dich auch gar nicht zwingen, die Beispielskripte en bloc zu übernehmen....
Lösungsvorschlag:
Dann lies doch einfach nur die Mail-Adresse des angemeldeten Users aus, hänge diese als Empfängeradresse an das Blat an... und ignorier die anderen Infos einfach.

Oder besser: poste den Schnipsel, den Du Dir jetzt zusammengeCopy&Paste't hast und lass es uns gegenprüfen.

Gruß
Biber
ostseebenni
ostseebenni 24.05.2007 um 10:26:10 Uhr
Goto Top
strLDAP = SAM2ADInfo("NilsK", "mail")  

function SAM2ADInfo(strSAMName, strField)
' Funktion: Übersetzt den übergebenen SAMAccountName per ADS-Abfrage in ein beliebiges ADS-Feld  
' Eingabeparameter: strSAMName: Der NT-Anmeldename; strField: ADSI-Name des erwarteten Feldes  
' Rückgabewert: Der gefundene Wert oder ein Leerstring  

    Dim objConn
    Dim objCommand
    dim objArgs

    On Error Resume Next


    'Create ADO connection object for Active Directory  
    Set objConn = CreateObject("ADODB.Connection")  
    objConn.Provider = "ADsDSOObject"  
    objConn.Open "Active Directory Provider"  
    if checkit("Fehler beim ADO-Zugriff auf Active Directory!") then exit function  

    'Create ADO command object for the connection.  
    Set objCommand = CreateObject("ADODB.Command")   
    objCommand.ActiveConnection = objConn
    if checkit("Fehler beim Definieren des ADO-Kommandos!") then exit function  

    'Get the ADsPath for the domain to search.  
    Set objRoot = GetObject("LDAP://rootDSE")  
    strDomain = objRoot.Get("defaultNamingContext")  
    Set objDomain = GetObject("LDAP://" & strDomain)  
    if checkit("Fehler beim Ansprechen des Active Directory!") then exit function  

    'Abfrage  
    strSQL = "SELECT " & strField & " FROM '"  
    strSQL = strSQL & "LDAP://" & strDomain & "' WHERE sAMAccountName = '" & strSAMName & "'"  

    'Assemble the commandtext.  
    objCommand.CommandText = strSQL
    if checkit("Fehler beim Übergeben des Kommandos!") then exit function  

    'Execute the query.  
    Set objRS = objCommand.Execute
    if checkit("Fehler beim Ausführen der Suche im Active Directory!") then exit function  

    strOutput = ""  
    strOutput = objRS.Fields(0).value

    on error goto 0

    SAM2ADInfo = strOutput

end function


' Fehlerprüfung  
function checkit(Nachricht)
	checkit = false
	if err.number <>0 then
		Nachricht = Nachricht & " [" & err.description & " (" & err.number & ")]"  
                wscrip.echo Nachricht
		err.clear
		checkit=true
	end if
end function
Dieses Script habe ich aus einem andere Forum.
Meines eractens nach soll dies die Mailadresse auslesen.
Der Name des DC ist ctpdc in der domain ct.local, der wie ich denke bei Active Directory Provider eingetragen werden soll. Wo aber noch???
Zudem habe ich versucht das Script auszuführen jedoch die Rückmeldung eines Scriptfehler gleich am Anfang bekommen wie also führe ich dies aus und wie wird die VAriable an die Batch-Datei übergeben???
Biber
Biber 24.05.2007 um 20:58:40 Uhr
Goto Top
Moin ostseebenni,

okay, dann lass uns aber bitte schrittweise vorgehen.
Wir haben nun zweieinhalb Tage gebraucht, um vom Thema "Benutzerdaten aus AD auslesen" im Bereich "Windows Server" wieder runterzukommen auf "Mailadresse des angemeldeten Users ermitteln".... da kommt es jetzt auf zwei Minuten mehr auch nicht an.

Zu "in anderen Foren gefundenen Scripten", die "Scriptfehler gleich am Anfang bekommen" möchte ich eigentlich jetzt nichts schreiben... das überlass ich mal Deiner Phantasie, was mir jetzt vielleicht auf der Zunge liegen könnte.

Eine kurzer biooptical scan, wie es in meiner Branche heißt, lässt zumindest zwei Sachen rot aufleuchten bei diesem Findelscript:

1.
In der Function checkit() ist die Zeile
....
wscrip.echo Nachricht
...etwas, was scho früher zu DOS-Interrupt-Zeiten bei M$ eine eigene Fehlernummer hatte:
"Error in the Errorhandler"
Ergänze dort mal das fehlende "t", also schreib "wscrip.echo Nachricht".
Dann bekommst Du auch einige der Fehler angezeigt.

2.
Is' sich ja schon fein, dass die ermittelte Mailaddy nun 5x von Variable zu Variable umkopiert wird, aber vielleicht solltest Du nach dem ermitteln auch irgendetwas damit machen....
Sogar einfach nur Anzeigen wäre schon eine Verbesserung.

Einmal grob durchgeharkt sieht der Schnipsel dann so aus:
wscript.echo  SAM2ADInfo("NilsK", "mail")  
' später mal:  wscript.echo  SAM2ADInfo(wscript.arguments(0), "mail")  
'------  
function SAM2ADInfo(strSAMName, strField)
' Funktion: Übersetzt den übergebenen SAMAccountName per ADS-Abfrage   
'                in ein beliebiges ADS-Feld  
' Eingabeparameter: strSAMName: Der NT-Anmeldename;   
'                                strField: ADSI-Name des erwarteten Feldes  
' Rückgabewert: Der gefundene Wert oder ein Leerstring  

Dim objConn, objRS, objCommand
Dim objRoot, objDomain
On Error Resume Next

'Create ADO connection object for Active Directory  
Set objConn = CreateObject("ADODB.Connection")  
objConn.Provider = "ADsDSOObject"  
objConn.Open "Active Directory Provider"  
if checkit("Fehler beim ADO-Zugriff auf Active Directory!") then exit function  

'Create ADO command object for the connection.  
Set objCommand = CreateObject("ADODB.Command")   
objCommand.ActiveConnection = objConn
if checkit("Fehler beim Definieren des ADO-Kommandos!") then exit function  

'Get the ADsPath for the domain to search.  
Set objRoot = GetObject("LDAP://rootDSE")  
strDomain = objRoot.Get("defaultNamingContext")  
Set objDomain = GetObject("LDAP://" & strDomain)  
if checkit("Fehler beim Ansprechen des Active Directory!") then exit function  

'Abfrage  
strSQL = "SELECT " & strfield & " FROM '"  
strSQL = strSQL & "LDAP://" & strDomain & "' WHERE sAMAccountName = '" & strSAMName & "'"  
wscript.echo "[Debug1] " & StrSQL  
'Assemble the commandtext.  
objCommand.CommandText = strSQL
if checkit("Fehler beim Übergeben des Kommandos!") then exit function  

'Execute the query.  
Set objRS = objCommand.Execute
if checkit("Fehler beim Ausführen der Suche im Active Directory!") then exit function  

Wscript.echo "[Debug2] " & objRS.Fields(strfield).value  
SAM2ADInfo = objRS.Fields(strfield).value
on error goto 0

end function

' Fehlerprüfung  
function checkit(Nachricht)
checkit = false
if err.number <>0 then
    Nachricht = Nachricht & " [" & err.description & " (" & err.number & ")]"  
    wscript.echo Nachricht
    err.clear
   checkit=true
end if
end function

3.
...wobei die erste Zeile eigentlich später nicht heißen sollte..
wscript.echo  SAM2ADInfo("NilsK", "mail")  
' ...sondern...   
wscript.echo  SAM2ADInfo(wscript.arguments(0), "mail")  

denn dann kannst Du den Schnipsel aus einem Batch heraus aufrufen mit
cscript //nologo getUsersMail.vbs %username%
:: ... und das Ganze noch mal einwickeln in eine FOR /F-Anweisung.
for /f %%i in ('cscript //nologo getUsersMail.vbs %username%') do set usersmail=%%i  

Aber so weit sind wir noch nicht, bitte schau mal, wie weit Du jetzt mit der angepassten Skizze kommst und poste ggf. die Fehlermeldung.

Dann machen wir weiter.

Grüße
Biber