Откройте настройки реестра другого пользователя - PullRequest
2 голосов
/ 05 октября 2009

Я хочу написать приложение, которое записывает всем пользователям на локальном компьютере указанный ключ (например, я хочу установить местоположение для избранного IE для всех пользователей в одной папке)

PS кто-нибудь использовал эти функции? LoadUserProfile RegOpenCurrentUser CreateProcessAsUser

Ответы [ 2 ]

8 голосов
/ 05 октября 2009

Я делал это много раз. Идея состоит в том, чтобы обновить HKCU текущего вошедшего в систему пользователя (это достаточно просто). Затем вы должны перечислить все профили в системе и найти их файл ntuser.dat (это тоже достаточно просто).

Найдя файл ntuser.dat, вы загружаете его во временный ключ в кусте HKLM (я обычно использую 'HKLM \ TempHive'. Затем редактируем.

Если в систему вошли более 1 пользователя, их профиль будет загружен в HKEY_USERS по их SID. Просто обновите это местоположение.

Чтобы изменить настройку для любых новых пользователей, просто измените соответствующий ключ в HKEY_USERS.DEFAULT, ИЛИ используйте приведенный ниже код Delphi, который сделает это путем загрузки куста реестра HKCU пользователей по умолчанию (хранится в ntuser.dat). *

ОБНОВЛЕНИЕ : Я нашел свой код Delphi, который демонстрирует, как обновить ульи HKCU пользователей, которые не вошли в систему.

Для этого требуется компонент «Привилегия» Рассела Либби, , который доступен здесь .

//NOTE:   sPathToUserHive is the full path to the users "ntuser.dat" file.
//
procedure LoadUserHive(sPathToUserHive: string);
var
  MyReg: TRegistry;
  UserPriv: TUserPrivileges;
begin
  UserPriv := TUserPrivileges.Create;    
  try
    with UserPriv do
    begin
      if HoldsPrivilege(SE_BACKUP_NAME) and HoldsPrivilege(SE_RESTORE_NAME) then
      begin
        PrivilegeByName(SE_BACKUP_NAME).Enabled := True;
        PrivilegeByName(SE_RESTORE_NAME).Enabled := True;

        MyReg := TRegistry.Create;    
        try
          MyReg.RootKey := HKEY_LOCAL_MACHINE;
          MyReg.UnLoadKey('TEMP_HIVE'); //unload hive to ensure one is not already loaded

          if MyReg.LoadKey('TEMP_HIVE', sPathToUserHive) then
          begin
            //ShowMessage( 'Loaded' );
            MyReg.OpenKey('TEMP_HIVE', False);

            if MyReg.OpenKey('TEMP_HIVE\Environment', True) then
            begin
              // --- Make changes *here* ---
              //
              MyReg.WriteString('KEY_TO_WRITE', 'VALUE_TO_WRITE');
              //
              //
            end;

            //Alright, close it up
            MyReg.CloseKey;
            MyReg.UnLoadKey('TEMP_HIVE');
            //let's unload the hive since we are done with it
          end
          else
          begin
            WriteLn('Error Loading: ' + sPathToUserHive);
          end;
        finally
          FreeAndNil(MyReg);
        end;

      end;
      WriteLn('Required privilege not held');
    end;
  finally
    FreeAndNil(UserPriv);
  end;
end;

Недавно я также написал VBScript, который выполняет эту задачу. Я использовал его для изменения некоторых настроек Internet Explorer, но вы можете настроить его под свои нужды. Это также демонстрирует общий процесс:

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
1 голос
/ 05 октября 2009

У нас была точно такая же проблема на днях.

Мы обнаружили, что вы можете просто открыть улей HKEY_USERS и записать изменения в SID каждого пользователя.

И, если вы хотите, чтобы настройки присутствовали для любых новых пользователей, вы должны также применить настройки к клавише HKEY_USERS/.DEFAULT.

То есть просто запишите свои настройки в ...

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

Для каждого из присутствующих SID и:

HKEY_USERS\.DEFAULT\Software\...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...