Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menentukan dengan Boleh Dipercayai sama ada Proses Berjalan dengan Keistimewaan Ditingkatkan?

Bagaimanakah Saya Boleh Menentukan dengan Boleh Dipercayai sama ada Proses Berjalan dengan Keistimewaan Ditingkatkan?

DDD
DDDasal
2025-01-13 08:19:43922semak imbas

How Can I Reliably Determine if a Process is Running with Elevated Privileges?

Menentukan Pentadbir dan Keistimewaan Ditinggikan Dengan Tepat

Coretan kod yang disediakan dengan tepat mengenal pasti status pentadbir, tetapi tidak mempunyai keupayaan untuk membezakan antara hak pentadbir standard dan keistimewaan yang dinaikkan. Peningkatan ini menangani had itu.

Penyelesaian melibatkan pendekatan yang diperhalusi untuk penentuan status ketinggian:

Diperbaiki IsProcessElevated Kaedah:

Kaedah yang dipertingkatkan ini memanfaatkan fungsi GetTokenInformation untuk memastikan secara langsung tahap ketinggian proses, mengambil kira tetapan Kawalan Akaun Pengguna (UAC):

<code class="language-csharp">public static bool IsProcessElevated
{
    get
    {
        // Check UAC status
        if (UacHelper.IsUacEnabled)
        {
            // Obtain process token
            IntPtr tokenHandle;
            if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
            {
                throw new ApplicationException($"Failed to retrieve process token. Win32 Error Code: {Marshal.GetLastWin32Error()}");
            }

            // Retrieve elevation type
            TOKEN_ELEVATION_TYPE elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault;
            int elevationResultSize = Marshal.SizeOf((int)elevationResult);
            uint returnedSize = 0;
            IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize);

            bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, out returnedSize);
            if (success)
            {
                elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr);
                return elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
            }
            else
            {
                throw new ApplicationException("Elevation status determination failed.");
            }
        }
        else
        {
            // Fallback to standard administrator check if UAC is disabled
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
    }
}</code>

Kaedah ini mengendalikan kedua-dua senario yang didayakan UAC dan dilumpuhkan UAC dengan mantap, memberikan penentuan keistimewaan tinggi yang boleh dipercayai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan dengan Boleh Dipercayai sama ada Proses Berjalan dengan Keistimewaan Ditingkatkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn