Top-Themen

Aktuelle Themen (A bis Z)

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

Skriptbasierter DomainJoin und Migration des lokalen Profils

Mitglied: LuckyPuncher

LuckyPuncher (Level 1) - Jetzt verbinden

09.10.2009 um 01:58 Uhr, 3881 Aufrufe, 8 Kommentare

Hallo Community, bisher war ich nur begeisterter Leser der Tips und Tricks. Nun brauche ich selbst das Wissen und die Erfahrung die sich hier im Forum wiederfindet

ich stehe gerade vor der Herausforderung, etwa 40zig NT 4 (!) Workstations in die Domäne aufzunehmen und dabei sicherzustellen, dass bereits installierte Software danach noch weiter tut.
einige Sachen habe ich schon als CMD-Skripte gebaut (Domainjoin, DNS Eintrag ändern mit reg.exe, DNS-Suffixsuchliste ändern).

Es befinden sich mehrere Benutzerprofile auf den Clients. Die Profile sollen nach dem Domänenbeitritt weiterhin lokal bleiben.
Da ich nicht jeden einzelnen Benutzer anmelden will, sollen alle Schritte, die bei einer ersten Anmeldung eines Benutzers mit seinem Domänenkonto am Rechner ausgeführt werden, per Skript ausgelöst werden.
Das blosse kopieren des BenutzerProfils von C:\Winnt\profiles\username nach C:\winnt\profiles\username.000 reicht dabei ja nicht aus um ordentlich zu funktionieren.
Zusätzlich muss ich die ntuser.dat sowie die userclass.dat laden und hierin die SIDs (localuser - domainuser) tauschen.

ich habe mir folgendes Vorgehen vorgestellt:

1. Profile auf C:\winnt\profiles auslesen und nur diejenigen in eine Datei (proflist.txt) schreiben die relevant sind. z.B. System gibt es in der AD nicht.

@echo off
set domain=000
cd /d C:\winnt\profiles
dir /B /A:D | findstr /r /v ^.*00.$>profile.txt

for /f "tokens=* delims=" %%i in (proflist.txt) do call :process %%i
goto :eof

:process
set profname=%1
if /I %profname%==system goto :cancel
if /I %profname%==other goto :cancel
xcopy %profroot%\%profname%\*.* %profroot%\%profname%.%domain%\*.* /S /C /H /E /R /K
goto :eof

:Cancel
@echo %profname%>>notmigrated.txt
goto :eof
2. die Datei profile.txt nochmals verwenden um neue einträge für jeden Domänenbenutzer unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<USER> anzulegen. Dabei jeweils mittels psgetsid prüfen ob es für den Benutzeraccount bereits eine Entsprechung in der Domäne gibt.

@echo off
setlocal enableextensions

set adjoinUN=administrator
set adjoinPW=password
set dcname=DCNAME
set domainnb=ADSDOMAIN

set regspath="HKlm\software\microsoft\windows nt\currentversion\profilelist"
for /f "tokens=* delims=" %%i in ('reg.exe query %regspath%') do call :profimg %%i
goto :eof

:profimg
set foundsid=%1
set "usersid=%foundsid:[=%"
set "usersid=%usersid:]=%"
psgetsid -accepteula %usersid% >nul
set sidcheck=psgetsid.exe \\%dcname% -u %domainnb%\%adjoinUN% -p %adjoinPW% %usersid%
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
echo %errorlevel%
)
goto :eof

:end
und hier komme ich nicht weiter: die Ausgabe des Errorlevels entspricht nicht dem was ich erwarte. Egal ob ein aus der profilelist.txt abgearbeiteter User in der Domäne ist (Errorlevel sollte 0 sein) oder nicht ise (Errorlevel NOT 0): Der Errorlevel ist immer gleich.?!

Im Anschluss wollte ich wie folgt weitermachen.
- wenn errorcode =1 dann sid/user auslassen und weitermachen
- wenn errorcode =0 dann mittels 'reg add' die DomänenSID unter HKlm\software\microsoft\windows nt\currentversion\profilelist eintragen.
- dann darunter den Reg_Expand_Sz Eintrag 'Profilimagepath' mit dem Wert: %SystemDrive%\Winnt\Profiles\<domainuser> eintragen.
- jeweiligen Domänenbenutzer auf HKlm\software\microsoft\windows nt\currentversion\profilelist\<SID von Domänenbenutzer> rekursiv berechtigen

Vielleicht könnt Ihr mir weiterhelfen.

Danke schon einmal
JPLC
Mitglied: TsukiSan
09.10.2009 um 04:23 Uhr
Hallo LuckyPuncher,

ändere doch mal:
01.
echo %errorlevel%
in:
01.
echo Errorlevel :%sidcheck%
und nimm mal in
(''%sidcheck%')
die " und ' raus.
Die gehören da IMHO nicht nicht.?!

Den Rest machst du dann mit einer IF-Auswertung:

01.
If Errorlevel = 1 then goto Bedingung1 
02.
If Errorlevel = 0 then goto Bedingung0
Gib mal Bescheid.

Gruß
Tsuki
Bitte warten ..
Mitglied: LuckyPuncher
09.10.2009 um 10:57 Uhr
Hallo TsukiSan

Danke für die Rückmeldung.

ändere doch mal:
01.
> echo %errorlevel% 
02.
> 
in:
01.
> echo Errorlevel :%sidcheck% 
02.
> 

habe ich, bringt bei mir ledglich eine Ausgabe.

01.
Errorlevel :psgetsid.exe \\DCNAME -u ADSDOMAIN\administrator -p password S-1-5-21-... 
02.
 
M.E muss die umgebungsvariable Errorlevel immer mit %errorlevel% angesprochen werden um nicht als normale Abfolge von Zeichen interpretiert zu werden.

Mein Problem ist, dass der Wert von %errorlevel% immer true ist, egal ob die Ausführung von PSGETSID.exe samt Paramtern zu einem Fehler geführt hat. Z.B. SID gibt es nicht.

Erst wenn %errorlevel% als solche richtig gesetzt wird, macht eine weitere Auswertung Sinn.

Gruß
LuckyPuncher
Bitte warten ..
Mitglied: TsukiSan
09.10.2009 um 15:28 Uhr
Hi LuckyPuncher,

dann könnte es eventuell dem Programm "PSGETSID.exe" liegen, dass es keine vernünftige Fehlerauswertung ausgibt.
Müßte man mal googeln oder nachfragen. Wenn der Entwickler von solchen Programmen die Fehlerauswertung nicht "so ernst" nimmt, dann kann man gleichen Effekt haben.

Gruß
Tsuki
Bitte warten ..
Mitglied: rubberman
09.10.2009 um 16:35 Uhr
Hallo LuckyPuncher,

warum eigentlich die ganzen Umwege über Variable und FOR-Schleife?
Sollte psgetsid einen Errorlevel zurückgeben (vovon ich eigentlich bei allen PS-Tools ausgehe), ist das relativ einfach über eine Zeile abzufangen
01.
psgetsid.exe \\%dcname% -u %domainnb%\%adjoinUN% -p %adjoinPW% %usersid% &&goto Erfolg ||goto Fehler
Grüße
rubberman
Bitte warten ..
Mitglied: LuckyPuncher
09.10.2009 um 17:01 Uhr
Hallo rubberman!

der blosse Aufruf von Psgetsid.exe samt Parametern bringt in der Tat Errorlevels zurück. Das habe ich schon getesetet. in Kombination mit For klappts leider nicht mehr.
Die For Schleife brauche ich jedoch um weitere Aktionen mit der Rückgabe der PSGetsid.exe- Anfrage:
die DomänenuserSIDs weiterzuverwenden. Also lediglich der Errorlevel reicht leider nicht aus.

das sollte etwa weiter gemacht werden.
- wenn %errorcode% =1 dann sid/user auslassen, Eintrag in Logfile o-ä. und weitermachen in der Schleife
- wenn %errorcode% =0 dann mittels 'reg add' die DomänenSID unter HKlm\software\microsoft\windows nt\currentversion\profilelist eintragen.

Gruß
LuckyPuncher
Bitte warten ..
Mitglied: Biber
09.10.2009 um 19:34 Uhr
Moin LuckyPuncher,

die Abfrage des Errorlevels klappt bei dir nicht, weil für den CMD-Interpreter diese optisch auf Zeilen auseinadergezogene <u>Befehls<u>zeile
...
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
echo %errorlevel%
)
..
....... eben nur EINE Zeile ist, die der alle dort benötigten Variablen eben auch nur einmal (beim Loslaufen) aufgelöst werden.
Ergo: Hast du VOR dem Ausführen der ersten FOR-Anweisung bzw des ersten PsGetSID ein ErrorLevel 0 drin, hast du es auch 200 Aufrufe lang.
War das Errorlevel vorher auf 77, dann wird dich eben diese 77 bis nach dem Klammer-Zu der DO-Anweisung begleiten.

Lies dir mal am CMD-Prompt [bei SetLocal /?] und/oder hier im Forum ein bisschen was an zum Thema "DelayedExpansion" und ändere (nachdem du es verstanden hast) die Mimik so ab:

[in deinem Batch:
  • Ganz am Anfang, wo sicherlich ein "echo off (o.ä.)" steht--->eine Zeile tiefer: "Setlocal EnableDelayedExpansion"

Die FOR-Anweisung:
...
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
echo Aktuelles Errorlevel: !errorlevel!
IF !errorlevel! 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl
)
..
-- ODER ohne verzögerte Variablenauflösung--
...
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
IF ErrorLevel 1 echo Aktuelles Errorlevel: 1 oder größer
IF ErrorLevel 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl
)
..
Schönes Wochenende
Biber
Bitte warten ..
Mitglied: LuckyPuncher
12.10.2009 um 19:04 Uhr
Habe die Ehre Biber,

Vielen Dank für das Feedback.
das mit den delayedexpansion habe ich mir zu Gemüte geführt: macht Sinn und wäre schön, leider aber in NT4 nicht möglich. Es geht lediglich: setlocal enableextensions
also:
den Code von ODER ausprobiert: Leider hat das so nicht geklappt: Er bringt jedesmal den selben Errorcode (0).
Daher habe ich die Problematik umgangen und das Skript anders aufgebaut.
Jetzt fange ich in der For-Schleife nur SIDs mit Entsprechung ab. Diese übergebe ich an find um weiter zu filtern, Dann passe ich die Registry Profilliste um die zu migrierenden Benutzer an.

Naja, vielleicht kann das ja noch jemand mal ausser mir brauchen.

01.
for /f %%i in ('dir /B /A:D C:\winnt\profiles ^| findstr /r /v ^.*00.$') do call :process %%i 
02.
goto :eof 
03.
 
04.
:process 
05.
set username=%1 
06.
if /I %username%==system         goto :cancel 
07.
if /I %username%==administrator  goto :cancel  
08.
@for /f %%m in ('"psgetsid \\%dcname% -u %domainnb%\%adjoinUN% -p %adjoinPW% %username% 2>NUL |find /i "s-1-5-2""') do ( 
09.
if errorlevel = 1 (echo failure 
10.
) else ( 
11.
REM The processed User must not be logged on  
12.
REG ADD "HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\%%m\profileimagepath"=%username%.000>>C:\regedited.txt 
13.
14.
15.
goto :eof 
16.
 
17.
:cancel 
18.
@echo user %username% will not be migrated 
19.
 
20.
:end
Gruß
LuckyPuncher
Bitte warten ..
Mitglied: Biber
12.10.2009 um 19:53 Uhr
Uppps, sorry, LuckyPuncher,

mein Fehler.
Ich habe ein Gleichheitszeichen unterschlagen

Ich schrieb:
- entweder mit SetLocal EnableDelayedExpansion
IF !errorlevel! 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl

was Bullshit ist, denn es muss lauten
IF !errorlevel! == 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl

... während die andere Syntax bei "ohne DelayedExpansion"/nur "Setlocal" richtig genannt wurde:

...
for /f "tokens=* delims=" %%a in (''%sidcheck%') do (
IF ErrorLevel 1 echo Aktuelles Errorlevel: 1 oder größer
IF ErrorLevel 1 ( machFehlerMeldung) ELSE machBissinessAsUhschl
)

--> hier als "IF ERRORLEVEL 1 " ohne die doppelten Gleichheitszeichen und ohne %- oder !-Zeichen um die Variable Errorlevel (also NICHT %errorlevel% und auch nicht !errorlevel!

Tut mir leid, dass Du da ganz umsonst so eine Schleife geflogen bist.
Dafür hast du bei Gelegenheit einen Oneliner gut bei mir.

Zerknirscht
Biber
Bitte warten ..
Ähnliche Inhalte
Windows Server
Migration Fileserver - TS Profile
gelöst Frage von BellociWindows Server3 Kommentare

Guten Tag liebe Admins, Anleitungen, wie man am geschicktesten eine Migration von Fileservern hinbekommt, gibt es zuhauf Daraus resultiert ...

Windows 7
Lokale Profile einfrieren
Frage von Lebowski23Windows 73 Kommentare

Hallo, gibt es eine Möglichkeit eine lokales Profil unter Win 7 einzufrieren. Also keine Änderungen zuzulassen oder diese nach ...

Batch & Shell

Batch zum Zurücksetzen eines lokalen Profils

Tipp von Mr.ErrorBatch & Shell

Ahoi! Mir ist in diesem Forum schon sehr oft geholfen worden und daher wollte ich auch mal was zurück ...

Windows 7

Lokale Profile werden nicht gelöscht

gelöst Frage von Michel73Windows 74 Kommentare

Hallo zusammen, wir arbeiten bei uns mit Servergespeicherten Profilen. Bei jeder Anmeldung wird auf den Rechnern ein lokales Profil ...

Neue Wissensbeiträge
Sicherheit

Zero Day-Schwachstelle im Internet Explorer - wird von APT bereits ausgenutzt

Information von kgborn vor 1 StundeSicherheit

Im Kernel des Internet Explorer scheint es eine Zero Day-Lücke zu geben, die von staatlichen Akteuren (APT) im Rahmen ...

Microsoft
Folder Security Viewer-Lizenzen zu gewinnen
Information von kgborn vor 1 StundeMicrosoft

Ich nehme das Thema mal in Absprache mit Frank hier auf, da es für den einen oder anderen Administrator ...

Hardware

Feueralarm killt Festplatten in Rechenzentrum - führt zu größerem Ausfall

Information von kgborn vor 1 StundeHardware2 Kommentare

Noch ein kleiner Beitrag für Administratoren, die in Rechenzentren aktiv sind - so als Fingerzeig. Denn es gibt Szenarien, ...

MikroTik RouterOS

Mikrotik Advisory: Vulnerability exploiting the Winbox port

Information von colinardo vor 1 StundeMikroTik RouterOS

Brand aktuell: Eine Schwachstelle im Winbox-Port bei Mikrotik Routern erlaubt das Auslesen der User-Datenbank der Router. Patch ist aktuell ...

Heiß diskutierte Inhalte
Linux
Linux Server oder Windows Server - lohnt eine Umstellung auf Linux und ebenso basierende SW bei einer langfristigen Planung?
Frage von motus5Linux22 Kommentare

Wir brauchen bei uns einen neuen Server. Dieser wird als Fileserver, Domäne Controller sowie Exchange Server verwendet. Wir versuchen ...

Netzwerkgrundlagen
VLAN - Offene Fragen
Frage von KnettenbrechNetzwerkgrundlagen17 Kommentare

Hallo zusammen, ich befasse mich derzeit mit dem Thema VLAN. Hierzu habe ich schon einige Guides gelesen, einschließlich des ...

Windows Server
Domänencontroller trennen
Frage von Akit57Windows Server13 Kommentare

Hallo, ich hoffe das mir hier jemand meine Frage trotz der spärlichen Informationen die ich geben kann beantworten kann: ...

DSL, VDSL
ISP Wechsel auf Vodefone Koax, Gebäudeverkabelung nur per Cat 7
gelöst Frage von wusa88DSL, VDSL13 Kommentare

Hallo Zusammen, ich bin momentan bei Mnet als Glasfaser Kunde und möchte Preis/Leistungs-Technisch zu Kabel Deutschland / Vodafone wechseln. ...