- 我有一个在本地系统下运行的服务(没有桌面交互)
- 我有一个.js脚本,可以在HKLM \ software \ ...
中进行简单的注册表更改Snipet:
try{
var WshShell = new ActiveXObject("WScript.Shell");
regvalue = WshShell.ExpandEnvironmentStrings(regvalue);
WshShell.RegWrite(regkey, regvalue, regtype);
}
- 在通过命令提示符运行并双击
时,脚本成功修改了注册表- 该脚本在完成后也会生成一个文本文件。 a" success.txt"或" error.txt"如果WshShell.RegWrite()"捕获"
这就是我在服务中调用脚本的方式(只有硬编码进行测试)
STARTUPINFO si = { sizeof(STARTUPINFO) };
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
bool bRes = false;
TCHAR appCmdLine[] = TEXT("C:\\Windows\\SysWOW64\\wscript.exe //NOLOGO C:/Test/testpatchHKLM.js");
bRes = CreateProcess(NULL, appCmdLine, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
CreateProcess返回true,成功文本文件由脚本创建,但注册表仍未修改。
注意:1)在许多其他地方提到将第一个参数发送为NULL,实际上这是我让脚本成功运行的唯一方法。 2)脚本没有UI或与用户交互 3)shellexecute产生相同的行为
我知道有一百万种更简单的方法可以实现这一目标,但我的目标是让这种方法有效
我假设wscript.exe没有权限,但我不应该得到usertoken和runas,因为服务正在创建进程...