Bagaimana cara memaksa aplikasi .NET saya berjalan sebagai administrator?

876

Setelah program saya diinstal pada mesin klien, bagaimana cara memaksa program saya untuk berjalan sebagai administrator di Windows 7?

Emas
sumber
3
Selain apa yang ditulis oleh Binary Worrier, Anda mungkin ingin menulis beberapa kode untuk diuji jika Anda memiliki hak admin .. (apakah itu yang Anda minta?)
lexu
39
Saya tidak akan menganggap enteng tugas ini, Anda harus memastikan apa yang sebenarnya dibutuhkan admin dan melihat apakah Anda dapat mengatasinya. Tidak ada pelanggan yang senang menjalankan aplikasi dalam mode admin sepanjang waktu. Banyak pelanggan yang lebih besar bahkan tidak akan mempertimbangkan aplikasi seperti itu, dan jika pengujian logo penting bagi Anda itu tidak akan berlalu seperti itu.
Alex
2
Alex sangat tepat. Jika mungkin, hanya meningkat jika perlu, jika tidak, Kebijakan Grup, UAC dan sejumlah variabel lainnya ikut bermain. Paling tidak, dengan UAC, pengguna harus mengotorisasi pada setiap proses sebagai lawan hanya ketika tindakan pengguna tertentu dilakukan.
Anthony Mason
Cara yang benar adalah dengan menanamkan file manifes ke dalam aplikasi Anda.
Elmue

Jawaban:

1145

Anda ingin memodifikasi manifes yang tertanam dalam program. Ini berfungsi pada Visual Studio 2008 dan lebih tinggi: Proyek + Tambah Item Baru, pilih "File Manifest Aplikasi". Ubah <requestedExecutionLevel>elemen menjadi:

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Pengguna mendapatkan prompt UAC ketika mereka memulai program. Gunakan dengan bijak; kesabaran mereka bisa cepat habis.

Hans Passant
sumber
33
Jika Anda mendapatkan kesalahan ClickOnce ketika mencoba mengkompilasi, lihat jawaban ini: stackoverflow.com/questions/11023998/…
SSS
17
Proyek Anda harus diatur untuk menggunakan manifes aplikasi juga - di Project Properties, periksa tab "Aplikasi" dan pastikan "Manifest:" di bawah 'Resources "diatur ke app.manifest (atau apa pun yang Anda beri nama. manifes file)
Victor Chelaru
7
Saya harus memuat ulang proyek sebelum VS akan meminta saya untuk memulai kembali dalam mode admin.
Jon
3
@Alejandro - Ya, UAC dapat dinonaktifkan, tetapi ketika itu terjadi, aplikasi akan secara otomatis berjalan sebagai administrator (dengan asumsi pengguna Anda memiliki hak administrator), karena menonaktifkan UAC berarti semuanya berjalan pada hak istimewa tertinggi yang diizinkan oleh pengguna. Ini seperti mengeluh bahwa jika Anda memasang kunci mewah di pintu, itu tidak akan berfungsi jika pintu dilepas.
Erik Funkenbusch
4
@ErikFunkenbusch Ini tidak akan "secara otomatis berjalan sebagai administrator", itu akan berjalan di bawah izin normal pengguna (admin jika pengguna adalah admin, atau standar jika pengguna standar). Mengandalkan kasus tertentu, bahkan jika itu adalah default, adalah program yang baik akan menghindari seperti wabah. Mengikuti analogi Anda, kunci yang bagus itu bagus dan semuanya, tetapi peranti lunak yang dirancang dengan baik harus mengantisipasi kasus bahwa seluruh pintu dilepas, bahkan jika itu jarang terjadi.
Alejandro
155

Menambahkan requestedExecutionLevelelemen ke manifes Anda hanya setengah dari pertempuran; Anda harus ingat bahwa UAC dapat dimatikan. Jika ya, Anda harus melakukan pemeriksaan dengan cara lama dan memasang dialog kesalahan jika pengguna bukan administrator
(panggil IsInRole(WindowsBuiltInRole.Administrator)utas Anda CurrentPrincipal).

Anders
sumber
22
Anda juga bisa menggunakan <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> juga
Mark Kram
18
@MarkKram: Apa hubungan tertinggiAvailable dengan ini? Pertanyaannya adalah tentang pemaksaan admin, tertinggiTersedia lebih ketat daripada mengharuskanAdministrator dan akan membiarkan pengguna non-admin memulai aplikasi un-elevated tanpa UAC prompt, hanya admin yang akan diminta ...
Anders
3
Berikut adalah contoh MSDN tentangIsInRole , Anders berbicara tentang.
Uwe Keim
Saya tidak ingat detail pastinya lagi, tetapi saya pikir ini tergantung pada apa yang Anda maksud dengan disabilitas. Meletakkan "slider UAC" sepenuhnya ke bawah tidak sama dengan menonaktifkan UAC (kecuali pada Vista). Jika UAC sepenuhnya dinonaktifkan, seluruh mekanisme tingkat integritas dinonaktifkan dan hanya fitur runas.exe klasik dari 2000 / XP yang tersedia. Pemeriksaan peran admin menangani kasus runas.exe.
Anders
1
Saya telah menetapkan EnableLUA ke 0 pada Server 2008 R2 dan menghapus diri saya dari grup Administrators, reboot, dan sekarang exe yang menentukan level = "memerlukanAdministrator" berjalan tanpa prompt
Tal Aloni
87

Langkah-langkah rinci adalah sebagai berikut.

  1. Tambahkan file manifes aplikasi ke solusi
  2. Ubah pengaturan aplikasi ke "app.manifest"
  3. Perbarui tag "dimintaExecutionLevel" untuk memerlukanAdministrator.

Menambahkan file dalam Solusi

Pilih File Manifes Aplikasi

Pilih opsi Manifest

Perbarui file Manifes

Perhatikan bahwa menggunakan kode ini Anda harus mematikan pengaturan keamanan ClickOnce, untuk melakukan ini, masuk ke dalam Properties -> Security -> ClickOnce Security

Hassan Rahman
sumber
New Item...bukan opsi pada proyek Layanan Pemasang saya. Bagaimana cara menambahkan manifes aplikasi? Saya bisa menambahkannya ke proyek utama saya tetapi bukan installernya.
HackSlash
61

Saya menerapkan beberapa kode untuk melakukannya secara manual:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}
NG.
sumber
45
Ini hanya mendeteksi jika konteksnya berjalan sebagai Admin, itu tidak meramalkan aplikasi untuk berjalan sebagai Admin seperti yang diminta oleh OP
Matt Wilko
5
Saya tidak berpikir ada cara terprogram untuk memaksa aplikasi untuk meningkatkan perms sendiri. Jika ada, itu akan menjadi risiko keamanan yang cukup, bukan?
Mark Richman
6
Meskipun solusi Anda bagus tetapi pertanyaannya berbeda. ;)
Yash
lihat versi refactored dari metode ini di sini stackoverflow.com/a/50186997 (subyektif)
Hakan Fıstık
Ini tidak menjawab pertanyaan!
Elmue
19

Saat bekerja di Visual Studio 2008, klik kanan Project -> Add New Itemdan kemudian pilihApplication Manifest File .

Di file manifes, Anda akan menemukan tag requestedExecutionLevel, dan Anda dapat mengatur level ke tiga nilai:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

ATAU

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

ATAU

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Untuk mengatur aplikasi agar dijalankan sebagai administrator, Anda harus memilih yang di tengah.

Rashad Maqsood
sumber
Ini bekerja. Namun, itu membuat jendela cmd kosong muncul ketika menjalankan aplikasi CMD (menggunakan aplikasi c # cmd untuk menjalankan beberapa exe di latar belakang).
WM
13

Sesuai

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

Anda akan ingin menambahkan manifes aplikasi jika Anda belum memilikinya atau tidak tahu cara menambahkannya. Karena beberapa proyek tidak secara otomatis menambahkan file manifes terpisah, pertama-tama buka properti proyek, navigasikan ke tab Aplikasi dan periksa untuk memastikan proyek Anda tidak mengecualikan manifes di bagian bawah keran.

  • Selanjutnya, klik kanan proyek
  • Tambahkan Item baru
  • Terakhir, temukan dan klik File Manifes Aplikasi
Justin Mcconnell
sumber
12

Di Visual Studio 2010 klik kanan nama proyek Anda. Tekan "Lihat Pengaturan Windows", ini menghasilkan dan membuka file yang disebut "app.manifest". Di dalam file ini ganti "asInvoker" dengan "requireAdministrator" seperti yang dijelaskan di bagian komentar dalam file.

Berkembang
sumber
6
Jawaban ini adalah tentang VB.NET :-), bukan VS 2010 secara umum. Jawaban "Tambahkan Item Baru" adalah tentang C #. Di C ++ Anda dapat melakukannya di pengaturan proyek.
Philm
12

Cara lain untuk melakukan ini, hanya dalam kode, adalah untuk mendeteksi jika proses berjalan sebagai admin seperti dalam jawaban oleh @NG.. Dan kemudian buka aplikasi lagi dan tutup yang sekarang.

Saya menggunakan kode ini ketika aplikasi hanya membutuhkan hak admin ketika dijalankan dalam kondisi tertentu, seperti ketika menginstal sendiri sebagai layanan. Jadi itu tidak perlu dijalankan sebagai admin sepanjang waktu seperti jawaban lain memaksanya juga.

Catatan dalam kode di bawah NeedsToRunAsAdminini adalah metode yang mendeteksi jika dalam kondisi saat ini, hak istimewa admin diperlukan. Jika ini kembalifalse kode tidak akan naik sendiri. Ini adalah keuntungan utama dari pendekatan ini dibandingkan yang lain.

Meskipun kode ini memiliki kelebihan yang disebutkan di atas, kode ini perlu diluncurkan kembali sebagai proses baru yang tidak selalu seperti yang Anda inginkan.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
TheLethalCoder
sumber
1
+1 untuk pendekatan hanya kode. Perhatikan bahwa Anda perlu UAC diaktifkan untuk memiliki kesempatan untuk meluncurkan apa pun dengan runassebagai administrator dari pengguna non-admin, jika tidak maka akan terbuka secara diam-diam dengan izin pengguna saat ini (diperiksa pada windows 7 64 bit). Sejauh yang saya tahu satu-satunya hal yang dapat Anda lakukan dengan UAC dinonaktifkan dan hak admin hilang adalah menghentikan eksekusi pada saat yang tepat.
reallynice
9

Anda dapat membuat manifes menggunakan Pengaturan Keamanan ClickOnce, dan kemudian menonaktifkannya:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

Setelah Anda mengkliknya, sebuah file akan dibuat di bawah folder properti Project bernama app.manifest setelah ini dibuat, Anda dapat menghapus centang padaEnable ClickOnce Security Settings opsi

Buka file itu dan ubah baris ini:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

untuk:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

Ini akan membuat program membutuhkan hak administrator.

Yochai Timmer
sumber
7

Ini adalah versi sederhana dari jawaban ini , di atas oleh @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
Hakan Fikst
sumber
1
Ini tidak menjawab pertanyaan!
Elmue
@ Ende, lebih logis untuk menambahkan komentar Anda ke jawaban asli yang baru saja saya refactored, Anda dapat menemukan tautan ke jawaban itu di tambang.
Hakan Fıstık
-3

Klik kanan executable Anda, pergi ke Properties> Compatibility dan centang kotak 'Jalankan program ini sebagai admin'.

Jika Anda ingin menjalankannya sebagai admin untuk semua pengguna, lakukan hal yang sama di 'ubah pengaturan untuk semua pengguna'.

SlickJayD
sumber
4
Ini tidak menjawab pertanyaan. "Setelah program saya diinstal pada mesin klien", bukan "bagaimana saya".
Joe
Maaf karena tidak jelas. Setelah program Anda diinstal, ubah pengaturan ini di properti yang dapat dieksekusi (program utama Anda, bukan installer). Dia memang ingin memaksa programnya dijalankan sebagai admin.
SlickJayD
2
Lebih baik mengatur persyaratan admin dalam manifes. Saya berpendapat itu menjawab pertanyaan, tetapi hanya nyaris.
BradleyDotNET
3
@Jo Agar adil, jawaban yang diterima tidak menjawab pertanyaan OP karena mengharuskan Anda menginstal ulang aplikasi exe. Itu bukan solusi untuk "Setelah program saya diinstal". Jika ada jawaban yang dijatuhkan ini lebih benar daripada jawaban yang diterima, jadi saya tidak mengerti mengapa jawaban itu memiliki lebih dari 400 suara.
NickG
Sebenarnya, itu menjawab kedua pertanyaan dengan sempurna. Tidak banyak peluang untuk mengubah manifes setelah diinstal dan program tidak boleh mencoba untuk meningkatkan izin mereka sekali berjalan - di banyak lingkungan - itu adalah jalan yang baik untuk disebut malware. Di sebagian besar perusahaan - jawaban ini adalah yang terbaik karena menempatkan tanggung jawab pada pengguna dan izin mereka. Saya menulis banyak kode yang saya tidak bisa "melihat" atau menjalankannya setelah produksi. Cobalah untuk tidak menjadi lebih pintar daripada masalah keamanan Anda sendiri.
jinzai