Необходимо изменить/прочитать/добавить переменную Shell в реестре Windows по пути \HKEY_USERS\\Software\Microsoft\Windows NT\CurrentVersion\Winlogon для каждого пользователя. Однако в \HKEY_USERS\ находятся только пользователи, у которых выполнен вход. Если я правильно понял из статей в интернете, то нужно загружать кусты пользователей в реестр, хранящиеся в C:\Users\<Имя пользователя>\NTUSER.DAT, что я и попытался сделать:
[DllImport("advapi32.dll", SetLastError = true)]
static extern Int32 RegLoadKey(UInt32 hKey, String lpSubKey, String lpFile);
public enum HKEY : uint
{
LOCAL_MACHINE = 0x80000002,
USERS = 0x80000003
}
static void LoadUserHive()
{
string path = "C:\\Users\\Max\\NTUSER.DAT";
string SID = "S-1-5-21-2185061059-2250993091-2609513880-1001";
RegLoadKey((uint)HKEY.USERS, SID, path);
}
Код выполняется без ошибок, но куста пользователя в \HKEY_USERS\ не наблюдается.
Подскажите, что я делаю не так
В данном случае, RegLoadKey() в случае ошибки не выдает исключений. Функция RegLoadKey() возвращает ноль в случае удачи, либо код ошибки int определенный в Winerror.h (класс для расшифорвки кодов ошибок для C# можно взять отсюда http://www.pinvoke.net/default.aspx/Constants.WINERROR).
Помимо прав администратора, для выполнения функции также обязательны привилегии SE_RESTORE_NAME и SE_BACKUP_NAME. Процесс их установки описан для C++ здесь https://docs.microsoft.com/ru-ru/windows/desktop/SecAuthZ/enabling-and-disabling-privileges-in-c--. Не составит труда перевести код из данного примера в C#. Либо можно использовать уже готовый класс для C# https://pastebin.com/R5HxeHnm.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости