我们有一个以管理员权限运行的应用程序,其中(除了实际需要管理员权限的其他操作之外)用户可以发送电子邮件。
我们的电子邮件系统的工作原理如下:管理员运行的应用程序预编译电子邮件字段并启动(通过CreateProcess)我们的电子邮件应用程序,该应用程序调用实际的电子邮件发送。如果电子邮件完整并准备就绪,它将直接发送,否则它将显示 Outlook 电子邮件表单,让用户填写缺少的字段并发送。
我们的电子邮件应用程序用于TJclEmail处理电子邮件发送和显示 Outlook 电子邮件表单。我的问题是这样的:如果 Outlook 不以管理员身份运行,电子邮件应用程序将不会显示 Outlook 电子邮件表单,我猜是因为它是从管理员运行的应用程序调用的,所以它继承了权限。由于 Outlook 很少以管理员身份运行,我想找到一种CreateProcess以普通用户权限进行调用的方法,而不是从调用者那里继承管理权限。
有办法这样做吗?
/* CreateProcess initialization */
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));
si.cb = sizeof(si);
long ret;
// si.wShowWindow = SW_HIDE;
// hide process window.... // run in background..
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
if (!CreateProcess(0, exe,
0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi)) {
return;
}
//int prez = WaitForSingleObject(pi.hProcess, INFINITE);
//CloseHandle(pi.hProcess);
Run Code Online (Sandbox Code Playgroud) 我正在使用此代码启动我的程序
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
if (CreateProcess(L"C:\\test\\test.exe",NULL,
NULL,NULL,FALSE,CREATE_UNICODE_ENVIRONMENT,NULL,NULL,&cif,&pi)==TRUE)
{
cout << "process" << endl;
cout << "handle " << pi.hProcess << endl;
}
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序正常启动,但立即失败(没有响应并失败).CreateProcess返回true.当我从代码启动test.exe时,它可以正常工作.
我正在使用CreateProcess来运行我的进程/应用程序。目的是运行它,执行某些操作,等待某些指示,然后关闭它(使用TerminateProcess)。
我注意到这个应用程序/进程创建了子进程。另外,当终止创建的进程时,子进程并不会终止,仍会保留一段时间。
我想问是否有一个选项可以以某种方式杀死主进程的所有子进程。它会导致问题,因为当我再次执行CreateProcess时,会有以前进程的剩余内容,我认为它们会导致一些问题。
我真的很感谢你的帮助!
我一直在试验Haskell.我正在尝试编写一个Web爬虫,我需要使用外部curl二进制文件(由于一些代理设置,curl需要有一些特殊的参数,似乎不可能/很难在haskell代码中设置,所以我宁愿只是传递它作为命令行选项.但这是另一个故事...)
在底部的代码中,如果我更改标记的行curl而不是curl --help输出渲染正确并给出:
"curl: try 'curl --help' or 'curl --manual' for more information
"
Run Code Online (Sandbox Code Playgroud)
否则字符串为空 - 因为`curl --help'响应是多行的.我怀疑在haskell中,每个新行清除缓冲区.(同样适用于其他简单的shell命令,如ls和ls -l等)
我如何解决它?
import System.Process
import System.IO
main = do
let sp = (proc "curl --help"[]){std_out=CreatePipe} -- *** THIS LINE ***
(_,Just out_h,_,_)<- createProcess sp
out <-hGetContents out_h
print out
Run Code Online (Sandbox Code Playgroud) 我想制作一个简单的C++程序,它使用CreateProcess一次运行多个exe文件.如果exe文件无效(填充了随机数据),则会出现一个消息框,表示该文件与64位Windows不兼容,这很好,但我的程序会等到消息框关闭.有没有办法绕过这个?
所以我使用这段代码来启动带参数的控制台应用程序:
#include <iostream>
#include <windows.h>
using namespace std;
void StartProgram(char argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CreateProcess
(
TEXT("PlayerDebug.exe"),
(LPSTR)argv,
NULL,NULL,FALSE,
CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW,
NULL,NULL,
&si, &pi
);
};
int main()
{
StartProgram("sound.wav");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
"PlayerDebug.exe"显示用于调用它的参数.但是当我按照我展示的方式使用CreateProcess运行它时,它不会显示任何内容.我检查并在任务管理器中似乎出现,但仍然不显示参数.我也尝试写入cout << argv;函数void StartProgram(char argv[])并返回" sound.wav",这是正确的.但似乎这个论点没有传递给PlayerDebug.exe,我不知道为什么.我做错了什么?(我是C++编程的新手)
我使用 Windows API CreateProcess() 创建一个进程。此函数返回的进程 ID 不在任务管理器中。当我尝试使用 TerminateProcess() 终止此进程时。GetLastError() 返回 5。使用 chrome 作为示例浏览器。
我的目标是创建一个浏览器进程,然后在身份验证后关闭浏览器。
我的示例代码是这样的:
int main()
{
wstring app{L"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"};
PROCESS_INFORMATION browserProcessInfo;
STARTUPINFO browserStartupInfo;
ZeroMemory(&browserStartupInfo, sizeof(browserStartupInfo));
ZeroMemory(&browserProcessInfo, sizeof(browserProcessInfo));
wstring cmdline;
cmdline = app + wstring{ { L" --new-windows" } };
bool bProcessCreated = CreateProcess(NULL,(LPWSTR) (cmdline.c_str()), NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS , NULL, NULL, &browserStartupInfo, &browserProcessInfo);
auto handle = OpenProcess(PROCESS_TERMINATE, FALSE, browserProcessInfo.dwProcessId);
auto terminateStatus = TerminateProcess(handle, 1);
auto errorNumber = GetLastError();
CloseHandle(browserProcessInfo.hProcess);
CloseHandle(browserProcessInfo.hThread);
}
Run Code Online (Sandbox Code Playgroud) 这里有一个如何在堆栈交换上调用 CreateProcess 的示例,但是 Windows 10 似乎不再支持此功能,并且您必须使用 unicode 版本 CreateProcessW。
与 ASCI 版本类似,我正在寻找一个示例:
我创建了一个代码,使用Windows窗体应用程序来构造一个gui.我在我的代码中使用系统命令来调用外部.exe.但是,这种方法创建了一个命令行终端.我发现我可以在这里用CreateProcess函数替换系统.我该如何使用这个功能?我应该指定哪些参数才能运行?我现在的代码是:
string run_template = "a.exe -i " + s1 + " -r 10 -f image2 filename%03d.jpg";
system(run_template.c_str());
Run Code Online (Sandbox Code Playgroud)
编辑:
#include <tchar.h>
string workPath = "";
string args = "-i " + s1 + " -r 10 -f image2 vid/frames/filename%03d.jpg";
HINSTANCE hRet = ShellExecute(NULL, _T("open"), _T("a.exe"), _T(args.c_str()), _T(workPath.c_str()), SW_HIDE);
DWORD errNum = GetLastError();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
1>c\projects\first_api\first_api\Form1.h(229): error C2065: 'Largs' : undeclared identifier
1>c:\projects\first_api\first_api\Form1.h(229): error C2228: left of '.c_str' must have class/struct/union
1> type is ''unknown-type''
1>c:\projects\first_api\first_api\Form1.h(229): error C2065: 'LworkPath' : undeclared …Run Code Online (Sandbox Code Playgroud) 我运行以下C代码来创建一个进程.exe文件位于C:\ Program Files\Exes\Start\process1.exe
CreateProcessW(NULL, (char*) exePath,
NULL, NULL, TRUE,
flags,
NULL, NULL, &startupInfo, &processInformation);
Run Code Online (Sandbox Code Playgroud)
现在有些计算机随机拥有名为Program的文件位于C:\ Program,导致create process失败并显示错误:
%1不是有效的Win32应用程序.
有没有办法解决这个问题,除了重命名文件,因为有几十个Windows Vms执行此C代码.这个错误随机发生在几台机器上.
我想编写一个启动另一个应用程序的应用程序.像这样:
# This will launch another_app.exe
my_app.exe another_app.exe
# This will launch another_app.exe with arg1, arg and arg3 arguments
my_app.exe another_app.exe arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)
这里的问题是我正在进入char* argv[]我的main函数,但我需要将它合并到LPTSTR以便将其传递给CreateProcess.
有一个GetCommandLine函数,但我不能使用它,因为我从Linux移植代码并绑定argc/argv(否则,这对我来说是一个非常难看的黑客).
我不能轻易地手动合并参数,因为argv[i]可能包含空格.
基本上,我想反过来CommandLineToArgvW.有没有标准的方法来做到这一点?
[编辑]
CreateProcess创建一个过程(例如,从.exe文件)
CreateFile可以创建/打开文件。如果打开.exe文件,该执行文件将运行。在这种情况下,它等于CreateProcess吗?
在这种情况下有什么区别吗?我是新手,谢谢您!
createprocess ×13
winapi ×11
c++ ×9
windows ×5
c ×2
process ×2
c++builder ×1
delphi ×1
delphi-xe3 ×1
email ×1
haskell ×1
io ×1
subprocess ×1
system ×1
unicode ×1