4

これは「低整合性レベルのプロセスから中程度の整合性レベルのプロセスを作成する方法」に似ていますが、私は少し異なる角度から来ています。(そしてそれはとにかく答えられません。):)

ファイルが低整合性として保存されている場合(通常、ブラウザーなどの低整合性アプリから)、そのファイルには低整合性必須ラベルが付けられます。(このラベルはで適用することもできますicacls /setintegritylevel low。)このようなファイルが実行されると、当然のことながら、整合性の低いプロセスになります。

このプロセスを(同意UIを介して)中程度の整合性に戻す方法はありますか?requiresAdministratorアプリがマニフェストでマークされている場合、またはアプリが動詞で呼び出さShellExecuteれている場合は、高い整合性を実現できますrunasが、これには明らかに管理者権限も必要です。中程度の整合性に移行するために管理者権限は必要ありませんが、それでも、整合性の低いプロセスでは利用できない多くの権限のロックが解除されます。

明らかに、これを行うためのメカニズムにはユーザー同意UIが必要です(サイレントに行うことは不可能である必要があります。そうでない場合、ポイントは何ですか?)が、それをどのように呼び出すことができますか?

私が見つけたこのトピックに関する唯一の議論は、元々は中程度の整合性のプロセスを独自に持ち、それから低整合性のプロセスをスピンオフすることです。これにより、中程度の整合性のプロセスに戻って通信し、それを起動させることで昇格が可能になります。ただし、最初に整合性の低いプロセスを開始するのがOS自体である場合、これは役に立ちません。

4

2 に答える 2

1

プロセスを低から中程度の整合性に引き上げるというユーザーの同意を得る方法を見たり聞いたりしたことはありません。私はあなたが運が悪いと言うでしょう。

参照用にこのブログ記事も参照してください:保護モードのInternet Explorer –低整合性環境の作成方法

于 2011-11-30T20:09:37.043 に答える
1

Internet Explorer(およびChrome)が行うことを行う必要があります。ブラウザのタブ自体は、必須の整合性レベルが低いレベルで実行される個別のプロセスです。ただし、中レベルの親プロセスはまだあります。

クライアントプロセスは、名前付きパイプを介して「親」プロセスに通信し、親に何らかのアクションを実行するように要求します。親は中程度なので、中程度で何かを起動できます。


更新:これは、低整合性プロセスから中整合性プロセスを作成できない方法の例です。

void CreateLowProcess(String szProcessName; String IntegritySid)
{
    hToken: THandle;
    hNewToken: THandle;
    szIntegritySid: WideString;
    pIntegritySid: PSID;
    TIL: TOKEN_MANDATORY_LABEL;
    ProcInfo: PROCESS_INFORMATION;
    startupInfo: TStartupInfo;

    const int SE_GROUP_INTEGRITY = 0x00000020;
    const int TokenIntegrityLevel = 25;

    const String SLowIntegritySid = "S-1-16-4096";
    const String SMediumIntegritySid = "S-1-16-8192";
    const String SHighIntegritySid = "S-1-16-12288";
    const String SSystemIntegritySid = "S-1-16-16384";

    /*
        Designing Applications to Run at a Low Integrity Level
        http://msdn.microsoft.com/en-us/library/bb625960.aspx
    */

    // Low integrity SID
    if IntegritySid == ""
       IntegritySid = SMediumIntegritySid;

    pIntegritySid = null;

    ZeroMemory(@startupInfo, sizeof(startupInfo));


    if (!OpenProcessToken(GetCurrentProcess(), 
          TOKEN_DUPLICATE or TOKEN_ADJUST_DEFAULT or TOKEN_QUERY or TOKEN_ASSIGN_PRIMARY, 
          ref hToken))
    RaiseLastWin32Error;
    try
        if (not DuplicateTokenEx(hToken, 0, nil, SecurityImpersonation, TokenPrimary, {var}hNewToken)) then
            RaiseLastWin32Error;
        try
            if (not ConvertStringSidToSidW(PWideChar(szIntegritySid), {var}pIntegritySid)) then
                RaiseLastWin32Error;
            try
                TIL._Label.Attributes := SE_GROUP_INTEGRITY;
                TIL._Label.Sid := pIntegritySid;

                // Set the process integrity level
                if (not SetTokenInformation(hNewToken, TTokenInformationClass(TokenIntegrityLevel), @TIL,
                        sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid))) then
                    RaiseLastWin32Error;

                //Create the new process at Low integrity
                Result := CreateProcessAsUserW(
                        hNewToken,
                        nil,
                        PWideChar(szProcessName),
                        nil, //ProcessAttributes
                        nil, //ThreadAttributes
                        False, //bInheritHandles
                        0, //dwCreationFlags
                        nil, //lpEnvironment
                        nil, //lpCurrentDirectory
                        startupInfo,
                        ProcInfo);
            finally
                LocalFree(Cardinal(pIntegritySid));
            end;
        finally
            CloseHandle(hNewToken);
        end;
    finally
        CloseHandle(hToken);
    end;
end;

そして、残りをパスカルからC#へのトランスコーディングをあきらめます。とにかくそれを行うことはできません、それが答えです。

于 2012-03-05T03:46:50.537 に答える