Setelah program saya diinstal pada mesin klien, bagaimana cara memaksa program saya untuk berjalan sebagai administrator di Windows 7?
Setelah program saya diinstal pada mesin klien, bagaimana cara memaksa program saya untuk berjalan sebagai administrator di Windows 7?
Jawaban:
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.
Menambahkan requestedExecutionLevel
elemen 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
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
juga
IsInRole
, Anders berbicara tentang.
Langkah-langkah rinci adalah sebagai berikut.
Perhatikan bahwa menggunakan kode ini Anda harus mematikan pengaturan keamanan ClickOnce, untuk melakukan ini, masuk ke dalam Properties -> Security -> ClickOnce Security
New Item...
bukan opsi pada proyek Layanan Pemasang saya. Bagaimana cara menambahkan manifes aplikasi? Saya bisa menambahkannya ke proyek utama saya tetapi bukan installernya.
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;
}
Anda dapat menyematkan file manifes dalam file EXE, yang akan menyebabkan Windows (7 atau lebih tinggi) untuk selalu menjalankan program sebagai administrator.
Anda dapat menemukan detail lebih lanjut di Langkah 6: Membuat dan Menanamkan Manifestasi Aplikasi (UAC) (MSDN).
Saat bekerja di Visual Studio 2008, klik kanan Project -> Add New Item
dan 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.
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.
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.
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 NeedsToRunAsAdmin
ini 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);
}
runas
sebagai 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.
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.
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;
}
}
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'.