こんにちは、これは、スタックオーバーフロー 上の私の最初の質問です開くことができます(イムジュニアプログラマ:私が作るgramatical間違いを事前に謝罪だから...あまりにもPとフランス語)どのように私は別のコンソールに出力テキストすでにC++
をImはここでは、その出力
(ノークラッシュエラーがない単なる虚無)
を書くために戻って、親のコンソールに接続する昇格プロセスを開始しようとしているが、私のコードです:
int main(int argc, char *argv[])
{
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
if (UAC::IsAppRunningAsAdminMode())
{
printf("Process Already elevated\nChecking if self invocated from unprevileged previous run...\n");
if (argc > 1)
{
std::string consoleTextOutputBuffer("Elevated privileges session started...\n");
WriteConsoleA((HANDLE)argv[2], consoleTextOutputBuffer.c_str(), consoleTextOutputBuffer.size(), NULL, NULL);
}
}
else
{
printf("Process need elevation...\n");
if (UAC::BeginPrivilegeElevationPrompt(consoleHandle))
{
printf("Elevation succesfull!\n");
}
else
{
printf("Elevation failed\n");
system("pause>nul");
exit(-1);
}
}
}
そして、私が書いたクラスUACから:
BOOL BeginPrivilegeElevationPrompt(const HANDLE& oldConsoleHandle)
{
wchar_t szPath[MAX_PATH];
if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
{
// Launch itself as admin
std::string oldConsoleHandleToString = std::to_string((int)oldConsoleHandle);
std::wstring wsConsoleString(oldConsoleHandleToString.begin(), oldConsoleHandleToString.end());
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.lpVerb = L"runas";
sei.lpFile = szPath;
sei.hwnd = NULL;
sei.lpParameters = wsConsoleString.c_str();
sei.nShow = SW_NORMAL;
if (!ShellExecuteEx(&sei))
{
DWORD dwError = GetLastError();
if (dwError == ERROR_CANCELLED)
{
// The user refused to allow privileges elevation.
printf("User did not allow elevation.\n");
return false;
}
return false;
}
else
{
return true;
_exit(1); // Quit itself
}
}
printf("Could not load module name.\n");
return false;
};
の助けを
感謝はあなたのタイトルは質問ですが、私はそれがあなたのコードにどのように関連するかわかりません。何が働いていないのですか? –
コンソール・スクリーン・バッファ・ハンドル値は、上昇プロセスでは意味がありません。議論としてそれを渡すことは無意味です。あなたは、出力を書き込むために親のコンソールに戻ってくる上昇したプロセスを探していますか?それは可能です。 – eryksun
文字列をどこに変換してハンドルに戻しますか?結果は何ですか?それはまったく動作しない、何かが間違って印刷される、クラッシュするか? –