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

Skriptbasierter DomainJoin und Migration des lokalen Profils

Frage Entwicklung Batch & Shell

Mitglied: LuckyPuncher

LuckyPuncher (Level 1) - Jetzt verbinden

09.10.2009 um 01:58 Uhr, 3839 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 ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Exchange Server
Migration auf Exchange 2016 wegen Firmenübernahme (5)

Frage von IT666IT zum Thema Exchange Server ...

Windows Userverwaltung
gelöst Lokalen Administrator über das Netzwerk verteilen (7)

Frage von M.Marz zum Thema Windows Userverwaltung ...

Exchange Server
gelöst Zertifikatsfehler nach Migration von Exchange 2007 zu Exchange 2013 (2)

Frage von Tommy1983 zum Thema Exchange Server ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...