borob14
Goto Top

AD auslesen und in Variable speichern (VBS und HTA)

Hallo zusammen,

ich benötige einen Script der zu einem angegebenen User ein AD-Attribut ausliest und dieses in einer Variable speichert.
Ich habe bereits mehrere Skripte gefunden, allerdings lesen diese immer nur den angemeldeten User aus.
Hat eventuell schon jemand ein passendes Skript? Vielleicht bin ich einfach nur blind bei der Suche.

Bitte wenn möglich in VBS da ich das Script in eine HTA einbauen will und mit der Variable weitermachen will.

Zweck des ganzen: Ich bastle gerade an einem Laufwerksmapper der den Loginscript (scriptPath) des eingetragenen Users ausführen soll.
Das ist nötig, da die User nicht mit Ihrem Account angemeldet sind.

Das HTA mit Eingabe Feld ist bereits schon fertig, nur fehlt mir die Möglichkeit an die Variable "Scriptpath" und "homeDirectory" zu kommen, um diese dann auszuführen bzw. zu Mappen.

Danke

Mit freundlichen Grüßen Rob


EDIT:
Habe einen Code gefunden, welcher allerdings nur die OU Users ausliest, vielleicht ist es nicht all zu schwer den umzubauen?
' Öffnet eine Messagebox und frägt nach einem Usernamen  
name = InputBox("Name des auszulesenden AD Kontos?")  
Set objKonto = FindAccount(name)

Beschreibung = objkonto.description

' Öffnet eine Messagebox und gibt den Inhalt des Users (Feld Beschreibung) aus.  
Msgbox Beschreibung


Function FindAccount(ByVal strName)
Set RootDSE = GetObject("LDAP://RootDSE")  
path = "LDAP://" & RootDSE.get("DefaultNamingContext")  
sql = "SELECT ADsPath FROM '" & path & "' WHERE objectClass='User' and name='" & strName & "'"  

Set objconn = CreateObject("ADODB.Connection")  
Set objcomm = CreateObject("ADODB.Command")  
objconn.Provider = "ADsDSOObject"  
objconn.open "Active Directory Provider"  

Set objcomm.ActiveConnection = objconn

objcomm.CommandText = sql
objcomm.Properties("Page Size")=50  
objcomm.Properties("Searchscope") = 2  

Set rs = objcomm.Execute

If rs.eof Then
Set FindAccount = Nothing
Else
Set FindAccount = GetObject(rs("ADsPath"))  
End If
End Function

Content-Key: 254334

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

Printed on: April 19, 2024 at 10:04 o'clock

Member: Xaero1982
Xaero1982 Nov 10, 2014 at 10:34:04 (UTC)
Goto Top
Moin,

irgendwie unklar was du vor hast.

User Hans meldet sich trotz AD nicht mit Hans an sondern mit User01?
Dann willst du was von Hans auslesen? Und dann das Laufwerk von Hans mappen?

Dir ist aber klar, dass es hier abgesehen von diversen NTFS Sicherheitseinstellungen die du bearbeiten musst damit das geht ein riesiges Datenschutzloch aufreißt?

Welcher Sinn steckt dahinter?
Wenns ein AD mit den Nutzern gibt sollen sie sich doch damit anmelden?

Grüße
Member: colinardo
Solution colinardo Nov 10, 2014, updated at Nov 11, 2014 at 07:42:31 (UTC)
Goto Top
Hallo Bob,
da gebe ich Xaero absolut recht, du müsstest die Rechte im AD so anpassen das jeder User die Attribute der anderen lesen darf.
Ansonsten geht das auslesen eines bestimmten Users z.B. so (ausreichende AD Rechte vorausgesetzt)
Set objUser = GetObject("LDAP://cn=maxmuster,ou=management,dc=domain,dc=com")  
Wscript.Echo "Profile Path: " & objUser.ProfilePath  
Wscript.Echo "Script Path: " & objUser.ScriptPath  
Wscript.Echo "Home Directory: " & objUser.HomeDirectory  
Wscript.Echo "Home Drive: " & objUser.HomeDrive  
-edit- oder so
strName = InputBox("Bitte Usernamen eingeben")  
set objUser = FindAccount(strName)
if not objUser is nothing then
	msgbox "HomeDirectory des Users: " & objUser.HomeDirectory  
else
	msgbox "Kein User mit diesem Loginnamen gefunden"  
End if

Function FindAccount(strUserName)
	On Error Resume Next
	Dim adoCommand, adoConnection
	Dim varBaseDN, varFilter
	Dim objRootDSE, varDNSDomain, strQuery, adoRecordset

	Set adoCommand = CreateObject("ADODB.Command")  
	Set adoConnection = CreateObject("ADODB.Connection")  
	adoConnection.Provider = "ADsDSOObject"  
	adoConnection.Open "Active Directory Provider"  
	Set adoCommand.ActiveConnection = adoConnection
	
	' Search entire Active Directory domain.  
	Set objRootDSE = GetObject("LDAP://RootDSE")  
	
	varDNSDomain = objRootDSE.Get("defaultNamingContext")  
	varBaseDN = "<LDAP://" & varDNSDomain & ">"  
	
	' Filter for user objects.  
	varFilter = "(&(objectCategory=person)(objectClass=user)(SamAccountName=" & strUserName & "))"  
	
	' Construct the LDAP syntax query.  
	adoCommand.CommandText = varBaseDN & ";" & varFilter & ";ADSPath;Subtree"  
	adoCommand.Properties("Page Size") = 2  
	adoCommand.Properties("Timeout") = 20  
	adoCommand.Properties("Cache Results") = False  
	Set adoRecordset = adoCommand.Execute
	adoRecordset.MoveFirst

	If adoRecordset.RecordCount > 0 Then
		set FindAccount = GetObject(adoRecordset("ADSPath"))  
	else
		set FindAccount = Nothing
	End If
	
	adoRecordset.Close
	adoConnection.Close
End Function
Grüße Uwe
Member: Borob14
Borob14 Nov 10, 2014 updated at 11:47:14 (UTC)
Goto Top
Zu Erklärung warum,

wir haben diverse Leihnotebooks und Präsentations-PCs auf diesen wird ein Nutzer zur Anmeldung genommen der keine Rechte hat.
Das HTA Tool ist nur dafür da, dass jemand trotzdem an seine Daten kommt. Er muss dazu sein Kürzel und verdecktes Passwort eingeben und sobald das Tool geschlossen wird, werden alle LW wieder entfernt. In unserem Loginscript werden nur Laufwerke gemappt nichts anderes.

Die Grundlage ist im Prinzip, das nicht 100erte Profile auf den Geräten angelegt werden müssen und nur ein Profil gepflegt werden muss.

@uwe werde deinen Script mal testen danke.

Mit freundlichen Grüßen Rob


EDIT: @uwe dein Script bedingt das alle User in der gleichen OU sind -> ist aber nicht der Fall (wir haben sehr viele OUs Standdort bezogen also auch nicht nutzbar)
Member: Borob14
Borob14 Nov 10, 2014 at 12:44:25 (UTC)
Goto Top
Hab selber was gefunden und angepasst:

Option Explicit

Const title = "Eigenschaften Benutzerkonto"

DIM oDomain, oUser
DIM user, domain, UserFlags
DIM txt, tmp
Dim Message

domain = "//test"
user = "t01"

Message = "Bitte Benutzername eingeben " & vbCRLF & _
"oder Abbrechen anklicken" & vbCRLF & _
"Verbindung mit " & domain & "/" & user

' Hole Benutzername
user = GetUser (user, Message, title)

' Binde an User-Objekt in Domain (über aktuellen Account)
Set oUser = GetObject("WinNT:" & domain & "/" & user)

' Init Text
txt = "Domäne: " & domain & vbCRLF

' Lese Eigenschaften
txt = txt & "Benutzername: " & oUser.Name & vbCRLF
txt = txt & "Vollständiger Name: " & oUser.FullName & vbCRLF
txt = txt & "Beschreibung: " & oUser.Description & vbCRLF & vbCRLF

' Hole Benutzerflags:
' uFlags = oUser.Get("UserFlagser Kurzform
UserFlags = oUser.UserFlags

txt = txt & "Laufwerk:" & oUser.HomeDirDrive & ":" & oUser.homeDirectory & vbCRLF
txt = txt & "Anmeldescript:" & oUser.LoginScript & vbCRLF

MsgBox txt, vbOKOnly + vbInformation, Title

' ### Helfer
Function GetUser (Value, Message, Title)
Dim tmp
' Domainname abfragen
tmp = inputbox (Message, Title , Value)
If tmp = "" Then
GetUser = Value
Else
GetUser = tmp
End if
End Function
' Ende
<\code>