2009-10-05 12 views
2

Je veux écrire une application qui écrit à tous les utilisateurs sur une machine locale une clé spécifiée (par exemple: je veux définir l'emplacement pour IE Favoris pour tous les utilisateurs dans le même dossier)Ouvrir un autre paramètres de registre utilisateur

PS quelqu'un a utilisé ces fonctions? LoadUserProfile RegOpenCurrentUser CreateProcessAsUser

+0

Pourquoi souhaitez-vous que tous les utilisateurs partagent le même dossier? Cela va ennuyer beaucoup d'utilisateurs s'ils finissent par écraser les favoris de l'autre. –

+3

D'accord - ne changez pas l'emplacement. Utilisez plutôt les favoris communs: Favoris pour tous les utilisateurs: C: \ Documents and Settings \ tous les utilisateurs \ Favoris Favoris pour un utilisateur spécifique: C: \ Documents and Settings \ \ Favorites – DmitryK

+0

Oui, Remus, les gens ont utilisé ces fonctions . S'il vous plaît, posez simplement la question que vous vouliez vraiment poser à leur sujet. Oui/non, des questions comme ça ne sont pas utiles. –

Répondre

8

Je l'ai fait plusieurs fois. L'idée est de mettre à jour le HKCU de l'utilisateur actuellement connecté (c'est assez facile). Ensuite, vous devez énumérer chaque profil sur le système et trouver leur fichier ntuser.dat (c'est assez facile aussi).

Avec le fichier ntuser.dat trouvé, vous chargez dans une clé temporaire dans la ruche HKLM (je l'habitude d'utiliser « HKLM \ TempHive ». Vous pouvez alors modifier loin.

S'il y a plus de 1 utilisateur connecté , leur profil sera chargé sous HKEY_USERS, par leur SID, il suffit de mettre à jour cet emplacement

Pour modifier le paramètre pour les nouveaux utilisateurs, il suffit de modifier la clé appropriée sous HKEY_USERS.DEFAULT, OU utilisez le code Delphi ci-dessous qui fera l'objet En chargeant la ruche de registre HKCU des utilisateurs par défaut (stockée dans ntuser.dat),

UPDATE: J'ai trouvé mon code Delphi qui montre comment mettre à jour les ruches HKCU des utilisateurs qui ne sont pas connectés au système.

Cela nécessite le composant 'Privilege' de Russell Libby, which is available here. J'ai également écrit un VBScript il y a un certain temps qui accomplit cette tâche. Je l'ai utilisé pour modifier certains paramètres d'Internet Explorer, mais vous pouvez le personnaliser selon vos besoins. Il illustre également le processus général:

Option Explicit 

Dim fso 
Dim WshShell 
Dim objShell 
Dim RegRoot 
Dim strRegPathParent01 
Dim strRegPathParent02 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set WshShell = CreateObject("WScript.shell") 


'============================================== 
' Change variables here 
'============================================== 
' 
'This is where our HKCU is temporarily loaded, and where we need to write to it 
RegRoot = "HKLM\TEMPHIVE" 
' 
strRegPathParent01 = "Software\Microsoft\Windows\CurrentVersion\Internet Settings" 
strRegPathParent02 = "Software\Microsoft\Internet Explorer\Main" 
' 
'====================================================================== 



Call ChangeRegKeys() 'Sets registry keys per user 

Sub ChangeRegKeys 
'Option Explicit 
On Error Resume Next 

Const USERPROFILE = 40 
Const APPDATA = 26 

Dim iResult 
Dim iResult1 
Dim iResult2 
Dim objShell 
Dim strUserProfile 
Dim objUserProfile 
Dim strAppDataFolder 
Dim strAppData 
Dim objDocsAndSettings 
Dim objUser 
Set objShell = CreateObject("Shell.Application") 
Dim sCurrentUser 

sCurrentUser = WshShell.ExpandEnvironmentStrings("%USERNAME%") 

strUserProfile = objShell.Namespace(USERPROFILE).self.path 
Set objUserProfile = fso.GetFolder(strUserProfile) 
Set objDocsAndSettings = fso.GetFolder(objUserProfile.ParentFolder) 

'Update settings for the user running the script 
'(0 = default, 1 = disable password cache) 
WshShell.RegWrite "HKCU\" & strRegPathParent01 & "\DisablePasswordCaching", "00000001", "REG_DWORD" 
WshShell.RegWrite "HKCU\" & strRegPathParent02 & "\FormSuggest PW Ask", "no", "REG_SZ" 


strAppDataFolder = objShell.Namespace(APPDATA).self.path 
strAppData = fso.GetFolder(strAppDataFolder).Name 

' Enumerate subfolders of documents and settings folder 
For Each objUser In objDocsAndSettings.SubFolders 
    ' Check if application data folder exists in user subfolder 
    If fso.FolderExists(objUser.Path & "\" & strAppData) Then 
    'WScript.Echo "AppData found for user " & objUser.Name 
    If ((objUser.Name <> "All Users") and _ 
    (objUser.Name <> sCurrentUser) and _ 
    (objUser.Name <> "LocalService") and _ 
    (objUser.Name <> "NetworkService")) then 
    'Load user's HKCU into temp area under HKLM 
    iResult1 = WshShell.Run("reg.exe load " & RegRoot & " " & chr(34) & objDocsAndSettings & "\" & objUser.Name & "\NTUSER.DAT" & chr(34), 0, True) 
    If iResult1 <> 0 Then 
    WScript.Echo("*** An error occurred while loading HKCU: " & objUser.Name) 
    Else 
    WScript.Echo("HKCU loaded: " & objUser.Name) 
    End If 

    WshShell.RegWrite RegRoot & "\" & strRegPathParent01 & "\DisablePasswordCaching", "00000001", "REG_DWORD" 
    WshShell.RegWrite RegRoot & "\" & strRegPathParent02 & "\FormSuggest PW Ask", "no", "REG_SZ" 

    iResult2 = WshShell.Run("reg.exe unload " & RegRoot,0, True) 'Unload HKCU from HKLM 
    If iResult2 <> 0 Then 
    WScript.Echo("*** An error occurred while unloading HKCU: " & objUser.Name & vbcrlf) 
    Else 
    WScript.Echo(" unloaded: " & objUser.Name & vbcrlf) 
    End If 
    End If 

    Else 
    'WScript.Echo "No AppData found for user " & objUser.Name 
    End If 
Next 

End Sub 
+0

Salut, cela ressemble à ce que je veux :) Je suis en train de tester maintenant, mais j'obtiens une erreur [Erreur DCC] Privilege.pas (646): E2251 Appel surchargé ambigu à 'StrLen' –

+0

nouvelle erreur: projet .. . EPrivilegdError élevé de classe d'exception avec le message « le privilège SeBackupPrivilege n'est pas tenu par l'utilisateur » (je suis membre des administrateurs) –

+0

Voici une réponse de l'auteur de la composante de privilège sur cette question ======== - Le compte utilisateur doit ......... (a) maintenir les privilèges de SE_RESTORE_NAME et SE_BACKUP_NAME ======== (b) doit avoir les privilèges activés. ======== ======== Peu importe si son administrateur, utilisateur de puissance, ou un compte utilisateur ordinaire. L'administrateur * tient * les privilèges, mais dans la plupart des cas, ils sont * NON * activés. Avoir (détenir) le privilège n'est pas la même chose que d'avoir le privilège activé. ======== Regedit permet aux privilèges Reqd, comme tout autre programme doit avant de tenter l'opération désirée. – Mick

1

Nous avons eu exactement le même problème l'autre jour.

Nous avons découvert que vous pouviez simplement ouvrir la ruche HKEY_USERS et écrire les modifications dans le SID de chaque utilisateur. Et, Si vous souhaitez que les paramètres soient présents pour les nouveaux utilisateurs, vous devez également appliquer les paramètres à la clé HKEY_USERS/.DEFAULT.

C'est-à-dire, il suffit d'écrire vos paramètres ...

HKEY_USERS\S-1-5-XX-XXXXXXXX-XXXXXXXXX-XXXXXXXX-XXXX\Software\... 

Pour chacun des présents et SIDs:

HKEY_USERS\.DEFAULT\Software\... 
+7

Seuls les SID des utilisateurs actuellement connectés seront là. Si un utilisateur n'est pas connecté, le système d'exploitation ne charge pas la ruche de registre de cet utilisateur et il n'y a donc pas de sous-clé pour cet utilisateur. –

+0

Ceci est une solution incomplète pour la raison que Rob décrit. Ma réponse résout ce problème. – Mick

+0

J'ai attribué +1 à votre solution. –

Questions connexes