System() function using SysWOW instead of System32 - c

I've spent the last I don't even know how long troubleshooting this, and I finally found it out. I've been trying to run this line of code:
system("C:\\Users\\Public\\automate.bat");
But instead of executing the script once, it repeatedly executed the first line of my script (in an infinite loop). I found that the path it was using for windows CMD was C:\Windows\SysWOW64\cmd.exe while the windows default is C:\Windows\System32\cmd.exe. I went to the SysWOW cmd and ran my script and the looping issue happened, while the same script worked flawlessly on the System32 CMD. (I suspect because of some incompatibility in my code that caused the SysWOW cmd to fail). I would like to know how to change the cmd.exe path on C so that it points to windows' default cmd, and not the one in SysWOW.
Currently, the only thing I've tried is:
system("C:\\Windows\\System32\\cmd.exe /c C:\\Users\\Public\\automate.bat");
Which is not working.
EDIT: The first action of my BAT file is to ask for administrator perms, which is where the window seems to close, and reopen itself:
#echo off
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
)
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
:--------------------------------------
cd "C:\Users\Public"
:: more stuff here

Finally found a solution to this! After tinkering around with my environment variables, I found that there was a conflict between user and system variables with different ComSpec paths. After changing them both to the system32 folder, they worked flawlessly. Thanks for all the helpful comments everyone!

Related

Store the current directory in a variable to be used later

I have a program that asks for admin privileges, stops some services, deletes a few files that couldn't be deleted if the services were running, restarts the services, and goes to a hard coded address where I have a vbs script I want to run next.
My problem is I'm about to put it on more computers, and I don't want to edit the hard coded address each time I set it up. I know that when you open a batch file, it starts at the directory where its located. I would like to save that in a variable so i can come back to it later to run the vbs script. Is there any way to do this?
Here is my code:
problem is at the bottom of the script
#echo off
REM --> Check for permissions
IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
)
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
#echo off
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
#echo off
net stop wuauserv
net stop bits
---save directory here--
cd /
cd Windows
echo To clean Windows Update, we need to wipe a folder. Wiping
rd /s SoftwareDistribution
mkdir SoftwareDistribution
echo The folder has been wiped.
pause
echo.
cd /
net start wuauserv
net start bits
---go to saved directory---
popup <-- VBS Script
pause
exit
A big thank you to #Compo for suggesting to me the use of ‘’’%~dp0’’’
It fixed pretty much everything.

How to create a service to run an application in admin mode or how can we configure an application to run in admin mode always using batch script?

I faced this problem, my task to delete some folder and some service and to change system environment variable automatically after some days of installation. So I created a .exe file which will do all above requirements. But I faced this problem for deleting service, changing environment variable we need administrator privilege.
My .exe file contains below codes
sc stop LaptopAudit
sc delete LaptopAudit
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V MYPROJECT
start cmd /k "#RD /S /Q %projectFolder% & exit"
my Service creation coding is here
nssm install LaptopAuditDestruct "%FolderPath%\selfdestr.exe"
I need to execute this selfdestr.exe file after some days automatically also in administrator mode. Is it Possible? Please Help me. Thank You. Also tried to create task scheduler there also same problem administrator mode required.
To run programs in admin using a batch-file you must have admin permissions on your script first, if it's the same as C++. Here's something I've been using that I found somewhere on this website. Put it at the begining of your script and tell me if it worked!
rem Checking permissions
if "%PROCESSOR_ARCHITECTURE%" == "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) else (
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
)
rem If error then no admin permissions
if %errorlevel% NEQ 0 (
echo Catching admin permissions
timeout /t 2 /nobreak >nul
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
) else (
pushd "%CD%"
CD /D "%~dp0"
)

Batch scripting with silent admin access to install applications

Im having trouble with a script to silently install 2 files without getting an admin prompt. The first file changes an ini to a program can upgrade. The second installs the new application.
The script will then remove the old icon on the users desktop and replace it with a new link to the new application.
Every time I try to run it I get the dreaded UAC Prompt.
I tried to incorporate the batchgotadmin snippet at the top of my file but I cant seem to get it to work right as I still get a admin prompt and I need it to install the application silently with admin rights to the users machine.
Here is my code I'm working with now:
#echo off
:: BatchGotAdmin (Run as Admin code starts)
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
:: Installs refresh
"\\server\share\program1.exe /VERYSILENT /LOG="c:\REFRESH.TXT"
:: Installs v8
"\\server\share\program2.exe" /VERYSILENT /LOG="C:\INSTALL.TXT" /NORESTART
:: Removes old applicationshortcut
del /Q "%allusersprofile%\desktop\program.lnk"
:: Adds new application shortcut
xcopy "c:\programfiles(x86)\program.exe" "%userprofile%\desktop"
What am I missing to make this work properly?

Running batch file using Shell with VB6 causes loop

I have a bat file that checks if UAC admin is required, if so, prompts UAC and then copies some dll files:
#echo off
:-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
cd /d %~dp0
if /i "%PROCESSOR_IDENTIFIER:~0,3%"=="X86" (
echo system is x86
copy .\*.dll %windir%\system32\
regsvr32 /s /c %windir%\system32\filetoregister.dll
) else (
echo system is x64
copy .\*.dll %windir%\SysWOW64\
regsvr32 /s /c %windir%\SysWOW64\filetoregister.dll
)
This works fine when run from windows explorer, if UAC is required, it prompts etc, does exactly what I want, however, if I try to run the batch file from a VB6 programme thus:
Dim FilePath As String
FilePath = App.Path & "\setup\install.bat"
ShellVal = Shell(FilePath, vbNormalFocus)
It works fine if UAC not required but if it is, it asks for permission, after selecting an admin account it then goes into a loop of opening and closing the cmd window. Shutting down the computer is often the only way to kill it
I have tried just using the UAC part of the bat file, still same problem
Really stuck on this one, any help appreciated!
RESOLVED
I sorted this problem by removing the admin request from the batch file and using ShellExecute in the
VB6 programme to get admin rights (if required) and then run the batch file
Dim FilePath As String
FilePath = App.Path & "\setup\install.bat"
ShellExecute 0, "runas", FilePath, Command & "/admin", vbNullString, SW_SHOWNORMAL

How to create a batch file to run cmd as administrator

I need to run a batch file which needs to register a DLL. The DLL registration is failing because the Batch file is not starting the command prompt as "administrator".
Is there any way to start the "Command Prompt" as administrator through the batch file.
Environment: Win7/Vista
This script does the trick! Just paste it into the top of your bat file. If you want to review the output of your script, add a "pause" command at the bottom of your batch file.
This script is now slightly edited to support command line args.
#echo off
:: BatchGotAdmin
::-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"="
echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
::--------------------------------------
::ENTER YOUR CODE BELOW:
You might have to use another batch file first to launch the second with admin rights.
In the first use
runas /noprofile /user:mymachine\administrator yourbatchfile.bat
Upon further reading, you must be able to type in the password at the prompt. You cannot pipe the password as this feature was locked down for security reasons.
You may have more luck with psexec.
Press Ctrl+Shift and double-click a shortcut to run as an elevated process.
Works from the start menu as well.
(This is based on #DarkXphenomenon's answer, which unfortunately had some problems.)
You need to enclose your code within this wrapper:
if _%1_==_payload_ goto :payload
:getadmin
echo %~nx0: elevating self
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:payload
echo %~nx0: running payload with parameters:
echo %*
echo ---------------------------------------------------
cd /d %2
shift
shift
rem put your code here
rem e.g.: perl myscript.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
goto :eof
This makes batch file run itself as elevated user. It adds two parameters to the privileged code:
word payload, to indicate this is payload call, i.e. already elevated. Otherwise
it would just open new processes over and over.
directory path where the main script was called. Due to the fact that Windows always
starts elevated cmd.exe in "%windir%\system32", there's no easy way of knowing what
the original path was (and retaining ability to copy your script around without
touching code)
Note: Unfortunately, for some reason shift does not work for %*, so if you need
to pass actual arguments on, you will have to resort to the ugly notation I used
in the example (%1 %2 %3 %4 %5 %6 %7 %8 %9), which also brings in the limit of
maximum of 9 arguments
To prevent the script from failing when the script file resides on a non system drive (c:) and in a directory with spaces.
Batch_Script_Run_As_Admin.cmd
#echo off
if _%1_==_payload_ goto :payload
:getadmin
echo %~nx0: elevating self
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:payload
::ENTER YOUR CODE BELOW::
::END OF YOUR CODE::
echo.
echo...Script Complete....
echo.
pause
You can use a shortcut that links to the batch file. Just go into properties for the shortcut and select advanced, then "run as administrator".
Then just make the batch file hidden, and run the shortcut.
This way, you can even set your own icon for the shortcut.
This Works for me in Windows 7 to 10 with parameters, when kick starting app or file from anywhere (including browser) and also when accessing file from anywhere. Replace (YOUR BATCH SCRIPT HERE anchor) with your code. This solution May Help :)
#echo off
call :isAdmin
if %errorlevel% == 0 (
goto :run
) else (
echo Requesting administrative privileges...
goto :UACPrompt
)
exit /b
:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b
:run
<YOUR BATCH SCRIPT HERE>
exit /b
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
Maybe something like this:
if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else (
echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
)
As user2549366 suggested before, "You can use a shortcut that links to the batch file." but in the Properties->Compatibility tab of the shortcut, run as administrator may be disabled.
So instead You just right click on your "file.bat - shortcut" then go to ->Properties->Shortcut tab -> Advanced and there you can click Run as administrator. After that, You can execute the shortcut.
Here's a more simple version of essentially the same file.
#echo off
break off
title C:\Windows\system32\cmd.exe
cls
:cmd
set /p cmd=C:\Enter Command:
%cmd%
echo.
goto cmd
Make a text using notepad or any text editor of you choice. Open notepad, write this short command "cmd.exe" without the quote aand save it as cmd.bat.
Click cmd.bat and choose "run as administrator".

Resources