PDA

View Full Version : Vista/7 - Batch unattended modifica immagine account predefinita e xcopy Preferiti


djgusmy85
20-11-2010, 10:53
NB: vedi post successivi e n.13 soprattutto per modifica img account

*****

Ciao a tutti,
per settare le impostazioni che utilizzo in Windows Vista/7 ho creato un batch, ma ho un paio di problemi che non riesco a risolvere :(

- Il primo:
Se copio un file all'interno della cartella utente, perdo sia l'icona che il nome originale. Ad esempio, se eseguo:
xcopy /Y "Sito.url" "%userprofile%\Favorites\"
xcopy /Y "Sito.url" "%userprofile%\Favorites\Links\"
La cartella "Preferiti" diventa "Favorites" e l'icona diventa quella standard di Windows. E anche la "Barra preferiti" diventa "Links". Lo stesso vale per Immagini, Documenti, Musica, ecc...

- Il secondo è l'impostazione automatica dell'immagine del mio account. Con XP era sufficiente:
xcopy /Y Utente.bmp "%allusersprofile%\Dati applicazioni\Microsoft\User Account Pictures\"
Mentre con Vista/7 l'equivalente:
xcopy /Y Utente.bmp "%programdata%\Microsoft\User Account Pictures\"
non funziona :(

Qualcuno ha qualche suggerimento?
Grazie in anticipo :)

ezio
20-11-2010, 14:36
Allora, il primo problema deriva dal fatto che xcopy va a modificare l'attributo di sola lettura della cartella PREFERITI.
Se infatti, da cmd, dai questo comando:
attrib +R "C:\Users\NOMEUTENTE\Favorites"
in modo da reimpostare la sola lettura, il collegamento e l'icona verranno ripristinati.
Potresti mettere questo comando nel batch subito dopo l'xcopy, in modo da farlo in automatico ;)

Per la seconda domanda, ora controllo :D

ezio
20-11-2010, 14:50
Per la questione dell'immagine, hai provato a chiamare il file User.bmp anzichè Utente.bmp?

djgusmy85
20-11-2010, 15:01
Per la questione dell'immagine, hai provato a chiamare il file User.bmp anzichè Utente.bmp?
No, "Utente" sta ad indicare il nome dell'utente (es. "ezio.bmp"), con XP almeno funzionava così :D
Dalle prove che ho fatto, "user.bmp" è l'immagine predefinita per i nuovi account, a me serviva modificare un account che già esiste. In quella cartella ho visto che i file si chiamano "Utente.dat" e sono vuoti, ma non capisco come vanno modificati :(

djgusmy85
20-11-2010, 15:14
Allora, il primo problema deriva dal fatto che xcopy va a modificare l'attributo di sola lettura della cartella PREFERITI.
Se infatti, da cmd, dai questo comando:
attrib +R "C:\Users\NOMEUTENTE\Favorites"
in modo da reimpostare la sola lettura, il collegamento e l'icona verranno ripristinati.
Potresti mettere questo comando nel batch subito dopo l'xcopy, in modo da farlo in automatico ;)
Niente, non funziona :(
Maledette cartelle anglo-italiane :D

ezio
20-11-2010, 15:18
Uè come no, ho appena provato :D ;)
Controlla bene i percorsi, esegui i comandi prima da cmd (non dal batch) e vedi se da lì sortiscono effetti.

Intanto stavo provando a cercare il percorso in cui viene salvata l'immagine dell'account (avevi ragione tu, users.bmp è quella applicata di default ai nuovi).

ezio
20-11-2010, 15:21
PS: attenzione al percorso per il comando attrib, non:
"%userprofile%\Favorites\"
ma
"%userprofile%\Favorites"
senza lo slash finale ;)

ezio
20-11-2010, 15:55
Allora, non ho trovato il percorso in cui viene salvata l'immagine dell'account (sempre che non venga caricata da qualche dll, vedi shell32, tramite chiave di registro), ma puoi aggirare il problema con un passaggio in più :cool:
Gpedit.msc infatti dà questa possibilità:
http://www.pctunerup.com/up/results/_201011/th_20101120164918_Cattura.JPG (http://www.pctunerup.com/up/image.php?src=_201011/20101120164918_Cattura.JPG)

Impostando la voce su ATTIVATA, costringi il sistema ad usare per tutti gli account il file C:\ProgramData\Microsoft\User Account Pictures\user.bmp come immagine.
Quella voce di gpedit non fa altro che modificare questa chiave:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"UseDefaultTile"=dword:00000001

Di conseguenza, puoi procedere come di seguito:
- crei un file reg con quella stringa e quel valore dword;
- chiami l'immagine che vuoi utilizzare con il nome user.bmp
- nel batch utilizzi xcopy per copiare il tuo user.bmp personalizzato in "%programdata%\Microsoft\User Account Pictures\" e nella riga successiva del batch fai applicare il .reg con il comando regedit.exe /s PERCORSO\NOME.REG
EDIT: invece di creare il .reg e applicarlo con regedit \s puoi inserire direttamente questa stringa nel batch, fa tutto lei:
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /t REG_DWORD /v UseDefaultTile /d 1
;)

djgusmy85
20-11-2010, 17:42
L'attrib non funzionava proprio per quello slash. Ora sembra a posto :ave:

Per l'altra soluzione, avevo tentato una strada simile, il problema è che va a toccare tutti gli account. A me serviva modificarne solo uno. Quello che ho chiamato "Utente" per l'appunto :D
Dovrei capire che ruolo hanno quei .dat, ho provato a cacciarci dentro il percorso del .bmp ma non ha funzionato. Mi sa che non è possibile farlo :(

Sei di una gentilezza indescrivibile :D

ezio
20-11-2010, 18:35
L'attrib non funzionava proprio per quello slash. Ora sembra a posto :ave:
Spesso gli slash in più fregano anche me :D
Per l'altra soluzione, avevo tentato una strada simile, il problema è che va a toccare tutti gli account. A me serviva modificarne solo uno. Quello che ho chiamato "Utente" per l'appunto :D
Dovrei capire che ruolo hanno quei .dat, ho provato a cacciarci dentro il percorso del .bmp ma non ha funzionato. Mi sa che non è possibile farlo :(
Sei di una gentilezza indescrivibile :D
Esagerato :D
Stavo notando una cosa. Supponendo che l'account si chiami HWUP, se imposti un'immagine personalizzata nel pannello di controllo viene automaticamente creato il file HWUP.bmp qui:

C:\Users\HWUP\AppData\Local\Temp

Ci dev'essere per forza una chiave che fa caricare questo file, non riesco a trovarla :doh:

djgusmy85
20-11-2010, 19:04
Stavo notando una cosa. Supponendo che l'account si chiami HWUP, se imposti un'immagine personalizzata nel pannello di controllo viene automaticamente creato il file HWUP.bmp qui:

C:\Users\HWUP\AppData\Local\Temp

Ci dev'essere per forza una chiave che fa caricare questo file, non riesco a trovarla :doh:
Sì, quell'immagine la crea ogni volta che accedi a Pannello di controllo --> Account utente, ho provato a cambiarla ma non succede nulla perchè non viene letta ma solo scritta.

:muro:

ezio
21-11-2010, 14:16
Sì infatti, ne parla anche una kb di msdn: http://msdn.microsoft.com/en-us/library/bb776892(VS.85).aspx
Però non ci sono riferimenti utili a modificare manualmente il percorso per il caricamento dell'immagine.

EDIT: qui c'è qualche dettaglio in più, sembra che l'immagine sia caricata dal kernel nel database SAM:
http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/c720975f-e8cd-4e33-983e-58269ad33f6c
Un casino insomma, mi fa pensare che non sia possibile mettere mani con batch e chiavi di registro per il singolo utente...

Qualche dettaglio in più:
The occurs because of the following behavior, when a user changes his default picture it writes the bitmap to a .dat file in the user account pictures directory under the name {domain}+{username}.dat. When explorer starts it checks whether this file exists for the logged on user and, if it does, copies the bitmap part of the file into memory. If it doesn’t find it or the policy “Apply the default user logon picture to all users” is applied, it will use the user.bmp or guest.bmp (depending on the user) that are also in the same directory. Its where these files are copied into memory that the problem occurs. We do a check on whether the policy is applied and if it isn’t we’ll copy the bitmap into memory. If it is applied we don’t copy anything into memory and this is why we get a empty frame.

ezio
21-11-2010, 15:13
Trovato un modo :D
http://deployment.xtremeconsulting.com/2010/06/23/usertile-automation-part-1/
Consiste nell'avviare uno script che però non è in grado di caricare la bitmap dell'immagine, ma solo la chiave di registro estrapolata da HKEY_LOCAL_MACHINE\SAM\SAM (bisogna aprire regedit come utente SYSTEM con psexec.exe della SysInternals altrimenti la chiave non è accessibile e risulta vuota) dopo aver settato un'immagine personalizzata per l'account tramite il pannello di controllo su un PC "modello".
Ecco l'infame :D (nota il file AudiNuvolari.bmp evidenziato):
http://img811.imageshack.us/img811/148/catturaj.th.jpg (http://img811.imageshack.us/i/catturaj.jpg/)

In pratica la procedura è questa:
- impostare un'immagine personalizzata per l'account tramite l'apposita funzione del pannello di controllo di Windows;
- scaricare psexec (http://live.sysinternals.com/psexec.exe) della SysInternals e da cmd avviare il comando psexec -s -i regedit.exe per avviare regedit come se si agisse tramite l'account SYSTEM
- esportare la chiave in HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\ dove si trova il valore dword UserTile in cui è caricata l'immagine personalizzata (meglio salvare in C, altrimenti è possibile ricevere errori di percorso in quanto si sta agendo come detto sopra con l'account SYSTEM e non uno normale)
- aprire il file reg esportato e cancellare tutti i valori salvo la parte relativa a UserTile ottenendo qualcosa di simile (successivamente salvare il file con altro nome e non sovrascrivere, in quanto non sarà possibile perchè il proprietario dello stesso è SYSTEM, non l'account con cui si sta operando):
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003E9]
"UserTile"=hex:01,00,00,00,03,00,00,00,01,00,00,00,58,7c,00,00,42,4d,58,7c,00,\
e una sfilza infinita di numeri e lettere

- inserire nel batch una riga di xcopy che copi psexec sul disco (in system32?)
- inserire nel batch un'ulteriore riga che permetta di accettare il contratto di licenza di psexec in modalità silenziosa:
reg add HKEY_CURRENT_USER\Software\Sysinternals\PsExec /t REG_DWORD /v EulaAccepted /d 1
- inserire nel batch l'avvio dello script per impostare l'immagine desiderata caricandola dalla chiave di registro ricavata come detto sopra:
cscript SetUserTile.vbs "NOMEACCOUNT" CHIAVEREGISTRO
Questo è il contenuto (fisso) dello script:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Title: User Tile Change Script
' Author: Micah Rowland (Xtreme Consulting)
' Date: 07/14/2010
' Desc: This script is designed to programatically replace
' a single local user's User Tile on Windows Vista
' and above.
' Prereq: This script requires the use of PSExec available
' from http://live.sysinternals.com/psexec.exe
' Usage: UserTile.vbs USERNAME USERTILEFILE
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
CONST FORREADING = 1
CONST FORWRITING = 2

set objShell = CreateObject("Wscript.Shell")
set objFSO = CreateObject("Scripting.FileSystemObject")
set objArgs = Wscript.Arguments
set objShell = CreateObject("Wscript.shell")
if CheckArgs() <> "" then
Wscript.echo Checkargs() & vbcrlf
wscript.echo "Arguments Invalid. Usage: ChangeUserPicture.vbs USERNAME UserTileFile"
wscript.quit()
end if

strUsername = objArgs(0)
strUserTileFile = objArgs(1)
strUserIndex = GetUserIndex()
set objFile = objFSO.GetFile(strUserTileFile)
set objTS = objFile.OpenAsTextStream(1)
strUserTile = objTS.ReadAll
wscript.echo strUserTile
strRegFile = objShell.ExpandEnvironmentStrings("%temp%") & "\UserIndexes2.reg"
set objRegFile = objFSO.OpenTextFile(strRegFile, ForWriting, true)
contents = "Windows Registry Editor Version 5.00" & vbcrlf & vbcrlf & "[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\" & strUserIndex & "]" & vbcrlf & strUserTile
objRegFile.Write contents
objRegFile.Close

strImport = "PSEXEC -S -I reg import " & strRegFile
objShell.Run strImport

Function GetUserIndex

' This function exports the Names key of the SAM from the registry to determine a match between the user account provided
' and its hex ID for use in creating the new registry file for import. Because the .reg file is exported in Unicode format
' we use the type command to pipe it from stdout to a new text file.

strUsername = objArgs(0)
strUserTileFile = objArgs(1)
objShell.run "cmd /c reg export HKLM\SAM\SAM\Domains\Account\Users\Names %temp%\UserIndexes.reg /y"
wscript.sleep(500)
objShell.run "CMD /C type %temp%\userindexes.reg > %temp%\userindexes.txt"
wscript.sleep(500)
set objFile = objFSO.GetFile(objShell.ExpandEnvironmentStrings("%temp%") & "\userindexes.txt")
set objRegExport = objFile.OpenAsTextStream(FORREADING)
curLine = objRegExport.ReadLine()
do until instr(lcase(curLine), lcase(strUserName)) or objRegExport.atendofStream
curLine = objRegExport.ReadLine
loop
if objRegExport.AtEndOfStream then
wscript.echo "Username not found."
wscript.quit()
else
curLine = ObjRegExport.ReadLine
tmpGetUserIndex = mid(curLine, instr(curLine, "(") + 1, len(curline) - instr(curline, "(") - (len(curLine) - instr(curline, ")")+1))
do until len(tmpGetUserIndex) = 8
tmpGetUserIndex = "0" & tmpGetUserIndex
loop
GetUserIndex = tmpGetUserIndex
end if
End Function

Function CheckArgs()
' This function makes sure that 2 arguments were provided and that the filename provided exists
if objArgs.Count <> 2 then
CheckArgs = "Exactly 2 arguments must be specified."
elseif not objFSO.FileExists(objArgs(1)) then
CheckArgs = "File not found."
else
CheckArgs = ""
end if
End Function

Mo' vedi tu se ti conviene fare tutta questa pappardella :sofico:

UtenteSospeso
23-03-2011, 22:48
PSexec non serve basta dare i permessi al ramo SAM, come per le directory, quindi riaprire regedit.

ezio
24-03-2011, 09:54
Psexec permette di agire con privilegi elevati temporaneamente, senza toccare le autorizzazioni standard introducendo possibili problemi di sicurezza ;)

UtenteSospeso
24-03-2011, 23:08
Non mi piacciono i software che fanno cose che posso fare facilmente.
In ogni caso dopo aver operato si rimette a posto.

ezio
25-03-2011, 09:00
E' della Sysinternals, ora di Microsoft :D