Jump to content

Recommended Posts

Posted (edited)

I am trying to write a program to restore the user directory location to it's correct local location upon a change having happened in the location that needs fixing. But every time I try, even though it "appears" that it should work, I always get an error code 2 from RegWrite

The key looks something like this:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileListS-1-5-21-5567327821-1832712073-2531187684-1000

The value I need to change the data for is "ProfileImagePath" which by default contains something like c:usersUserNameHere

I have tried to figure this out for the past 30 minutes without success. I have tried checking permissions in the registry, trying compiling as 32 bit, 64 bit, using HKLM64. Nothing appears to be working. 

#NoTrayIcon
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Run_Tidy=y
#AutoIt3Wrapper_Run_Au3Stripper=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

Global $SearchKey = 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList', $FinalPath, $FinalValue = 'ProfileImagePath'

GatherUserSpecifics()
NormalizeProfile()

Func NormalizeProfile()
    ConsoleWrite($FinalPath & @CRLF & $FinalValue & @CRLF)
    If @Compiled Then RegWrite($FinalPath, $FinalValue, 'REG_EXPAND_SZ', @HomeDrive & '\Users\' & @UserName)
    If @error Then MsgBox(0, @error, @extended)
EndFunc   ;==>NormalizeProfile

Func GatherUserSpecifics()
    $keys = GetAllRegKeys(0, $SearchKey)
    For $a In $keys
        $value = RegRead($SearchKey & '\' & $a, $FinalValue)
        $sections = StringSplit($value, '\', 2)
        If @UserName = $sections[UBound($sections) - 1] Then
            $FinalPath = $SearchKey & '\' & $a
        EndIf
    Next
EndFunc   ;==>GatherUserSpecifics

Func GetAllRegKeys($_mode, $_input)
    Local $RegKeySearchPosition = 1, $_results[0], $_chosenmode = RegEnumKey
    If $_mode = 1 Then $_chosenmode = RegEnumVal
    While 1
        $initiallist = $_chosenmode($_input, $RegKeySearchPosition)
        If @error Then
            ExitLoop
        EndIf
        ReDim $_results[UBound($_results) + 1]
        $_results[UBound($_results) - 1] = $initiallist
        $RegKeySearchPosition += 1
    WEnd
    If UBound($_results) < 1 Then Return SetError(1, 0, '')
    Return $_results
EndFunc   ;==>GetAllRegKeys

Can you see something wrong with what I have so far? I have verified I am able to write the value and data to one key backwards to the ProfileList key, but when I try and write the correct path to the correct value in the correct key it fails every time. I would appreciate a fresh set of eyeballs on this problem. It may be something really stupid, but I am just at a loss. Thanks.

Edited by Morthawt
Posted

It works for me.

But I don't really understand the goal of your script. You want to change the profile location, in order to have c:users<username> instead of the existing path ?

Don't you thing that you will have some acl problems ?

If it can help you, here is a function to create a profile for the specified SID and user/folder name.

Func _WinAPI_CreateProfile($sUserSid, $sUserName)
    Local $ret = DllCall("Userenv.dll", "long", "CreateProfile", "wstr", $sUserSid, "wstr", $sUserName, "wstr", "", "dword", 255)
    If @error Then Return SetError(1, @extended, @error)
    
    Return $ret[3]
EndFunc
Posted

 

It works for me.

But I don't really understand the goal of your script. You want to change the profile location, in order to have c:users<username> instead of the existing path ?

Don't you thing that you will have some acl problems ?

If it can help you, here is a function to create a profile for the specified SID and user/folder name.

Func _WinAPI_CreateProfile($sUserSid, $sUserName)
    Local $ret = DllCall("Userenv.dll", "long", "CreateProfile", "wstr", $sUserSid, "wstr", $sUserName, "wstr", "", "dword", 255)
    If @error Then Return SetError(1, @extended, @error)
    
    Return $ret[3]
EndFunc

I have been trying my script the whole time in VMware. You are saying it was working for you? How come I am receiving an error code of 2?

Posted (edited)

 

It works for me.

But I don't really understand the goal of your script. You want to change the profile location, in order to have c:users<username> instead of the existing path ?

Don't you thing that you will have some acl problems ?

If it can help you, here is a function to create a profile for the specified SID and user/folder name.

Func _WinAPI_CreateProfile($sUserSid, $sUserName)
    Local $ret = DllCall("Userenv.dll", "long", "CreateProfile", "wstr", $sUserSid, "wstr", $sUserName, "wstr", "", "dword", 255)
    If @error Then Return SetError(1, @extended, @error)
    
    Return $ret[3]
EndFunc

I just tried it on my actual computer and it did not alter the path and I also saw the error informing me that RegWrite errored with code 2.

Edit: I think I may have gotten too excited about my new usage of functions being first class objects and forgotten to actually add the function which makes the other choice... lol. I will investigate this.

EDIT

Ok. I was originally planning to use one function for both gathering keys and values but realised since there was only 1 value I cared about that was not worth the time. The problem was the remote directory I was testing did not have the full username exactly. Once I altered the code to check for the existence of the username then it worked. Thanks.

Edited by Morthawt

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...