What is the reason for different value after reg add from within a C# application and query the value from within a cmd window? -
i have program coded in c# opens cmd console , adds/modifies registry value.
after console outputs task completed, test reg query if registry value changed. there no problem. value 0x1 expected me.
but when query registry outside current cmd window cmd executed me admin, value 0x0 on reg query.
how possible?
here c# code:
string command = @"/k reg add hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock /t reg_dword /f /v allowdevelopmentwithoutdevlicense /d 1"; process proc = process.start("cmd.exe", command); query inside executed cmd program:
reg query hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock allowdevelopmentwithoutdevlicense reg_dword 0x1 from outside:
reg query hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock allowdevelopmentwithoutdevlicense reg_dword 0x0 allowalltrustedapps reg_dword 0x0 hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock\allowdevelopmentwithoutdevlicense hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock\allowdevelopmentwithoutdevlicense=1
when 32-bit application on 64-bit windows accesses registry key
hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock it redirected windows registry redirector to
hkey_local_machine\software\wow6432node\microsoft\windows\currentversion\appmodelunlock whereby 64-bit application accesses
hkey_local_machine\software\microsoft\windows\currentversion\appmodelunlock the difference between 2 registry paths wow6432node visible default 64-bit applications on windows x64.
see microsoft developer article registry keys affected wow64.
and completeness see also
there 32-bit cmd.exe , reg.exe on windows x64 in directory %systemroot%\syswow64 being %systemroot%\system32 32-bit applications , 64-bit cmd.exe , reg.exe in %systemroot%\system32.
your c# application compiled 32-bit application , therefore calls 32-bit cmd.exe calls 32-bit reg.exe.
you workaround within 32-bit application calling explicitly %systemroot%\sysnative\cmd.exe.
but aware of fact %systemroot%\sysnative not exist on 32-bit windows , not exist 64-bit applications on 64-bit windows. (sysnative special alias, not hard link, junction or real folder.)
therefore 32-bit c# application needs first check if %systemroot%\sysnative\cmd.exe exists , use path edit 64-bit registry value using 64-bit cmd , reg. on 32-bit windows %systemroot%\system32.exe\cmd.exe must called 32-bit c# application. way: %systemroot% references value of environment variable systemroot.
see answers on:
- why can double clicked batch file not find registry value deletion?
- changing value of registry key getruntime().exec(cmd) not change registry value operation ended successfully (java, same issue)
note 1:
running cmd.exe not needed @ all. possible run directly on windows x86
%systemroot%\system32\reg.exe or on windows x64
%systemroot%\sysnative\reg.exe from 32-bit application.
note 2:
and last not least c# application not need use reg.exe @ .net framework has built-in support accessing windows registry - registry.setvalue method. microsoft added examples in example code block.
key_wow64_64key can used in 32-bit application explicitly access 64-bit registry key explained in microsoft developer network article accessing alternate registry view.
Comments
Post a Comment