0

こんにちは、私はプログラミングがまったく初めてです。そして誰か助けてください。

サービスからプロセスを開始しようとしています。ユーザーに管理者の資格情報を入力するように求めることで、新しいプロセスを開始する必要があります。

使おうとしていCreateProcessWithLogonW()た。

私は正しい機能を使用していますか?ユーザー名、パスワード、ドメインをlocalhostとして入力しようとしました。開始する必要がある.exeファイルに完全なパスを指定しました。

これがコードの一部です。

CreateProcessWithLogonW(L"Administrator",
                        L"localhost",
                        L"password",
                        0,
                        NULL,
                        L"c:\myupdates\myapp.exe",
                        NORMAL_PRIORITY_CLASS | CREATE_CONSOLE,
                        NULL,
                        NULL,
                        &si,
                        &pi);

Si.cb = sizeof(si);
Si.lpDesktop = L"winsta0\\default";

しかし、プロセスは開始されませんでした。私が間違っていることを教えてください。また、ハードコーディングするのではなく、管理者の資格情報を入力するようにユーザーに促すにはどうすればよいですか。

4

5 に答える 5

1

CreateProcess* 関数は、プロンプトを実行しません。これらは低レベルの API であり、GUI については何も知りません。

ユーザーにプロンプ​​トを表示する場合は、ShellExecuteExwithrunasコマンドを使用します。Windows は、最初に昇格の許可を求め、次に資格情報の入力を求めます。

于 2012-11-02T17:06:39.580 に答える
1

1 つの問題は、コマンドライン引数として文字列リテラルを渡すことです。その引数は変更可能でなければならないからです。CreateProcessWithLogon()コマンドライン引数に関連して:

関数は、この文字列の内容を変更できます。したがって、このパラメーターを読み取り専用メモリー (const 変数やリテラル文字列など) へのポインターにすることはできません。このパラメータが定数文字列の場合、関数によってアクセス違反が発生する可能性があります。

バックスラッシュもエスケープする必要があります。への変更:

WCHAR cmdLine[] = L"c:\\myupdates\\myapp.exe"; /* 'cmdLine' is a
                                                  copy of the string
                                                  literal. */

代わりに渡しcmdLineます。

WINAPI 関数の失敗を確認するGetLastError()と、失敗の理由が通知されます。

于 2012-11-02T16:50:39.283 に答える
1

プログラム文字列も適切にエスケープしたい場合があります。

L"c:\myupdates\myapp.exe"

少なくとも次のようにする必要があります。

L"c:\\myupdates\\myapp.exe"

率直に言って、このコードには、SI の不適切なセットアップから API 自体に渡されるパラメーターまで、多くの問題があります。もっと読むことをお勧めします。

于 2012-11-02T16:52:06.207 に答える
0

アクセス違反は、lpCommandLine パラメータにまで及びます。これは、編集可能なメモリ、LPWSTR、および API 関数がバッファを変更するためのものです。ただし、変更不可能なメモリへのポインターを渡します。

しかし、もっと根本的な問題があります。サービスから資格情報を要求したいとします。サービスは UI を表示すべきではなく、最新バージョンの Windows では、サービスは単に UI を表示できません。設計に欠陥があり、再検討する必要があります。

于 2012-11-03T21:13:14.877 に答える