Khi chương trình của tôi được cài đặt trên máy khách, làm cách nào để buộc chương trình của tôi chạy với tư cách quản trị viên trên Windows 7?
Khi chương trình của tôi được cài đặt trên máy khách, làm cách nào để buộc chương trình của tôi chạy với tư cách quản trị viên trên Windows 7?
Câu trả lời:
Bạn sẽ muốn sửa đổi bảng kê khai được nhúng trong chương trình. Điều này hoạt động trên Visual Studio 2008 trở lên: Project + Thêm mục mới, chọn "Tệp kê khai ứng dụng". Thay đổi thành <requestedExecutionLevel>
phần thành:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Người dùng nhận được lời nhắc UAC khi họ khởi động chương trình. Sử dụng một cách khôn ngoan; sự kiên nhẫn của họ có thể bị hao mòn nhanh chóng.
Thêm một requestedExecutionLevel
yếu tố vào bảng kê khai của bạn chỉ là một nửa trận chiến; bạn phải nhớ rằng UAC có thể bị tắt. Nếu đúng như vậy, bạn phải thực hiện kiểm tra theo cách cũ của trường và đưa ra hộp thoại báo lỗi nếu người dùng không phải là quản trị viên
(gọi IsInRole(WindowsBuiltInRole.Administrator)
theo chủ đề của bạn CurrentPrincipal
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
cũng
IsInRole
, nói về.
Các bước chi tiết như sau.
Lưu ý rằng sử dụng mã này, bạn cần tắt cài đặt bảo mật của ClickOnce, để thực hiện việc này, hãy vào bên trong Thuộc tính -> Bảo mật -> Bảo mật ClickOnce
New Item...
không phải là một tùy chọn trong dự án Dịch vụ cài đặt của tôi. Làm thế nào tôi có thể thêm về bảng kê khai ứng dụng? Tôi có thể thêm nó vào dự án chính của mình nhưng không phải là trình cài đặt.
Tôi đã triển khai một số mã để thực hiện thủ công:
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;
}
Bạn có thể nhúng một tệp kê khai trong tệp EXE, điều này sẽ khiến Windows (7 trở lên) luôn chạy chương trình với tư cách quản trị viên.
Bạn có thể tìm thêm chi tiết trong Bước 6: Tạo và nhúng Bản kê khai ứng dụng (UAC) (MSDN).
Trong khi làm việc trên Visual Studio 2008, nhấp chuột phải Project -> Add New Item
và sau đó chọn Application Manifest File
.
Trong tệp kê khai, bạn sẽ tìm thấy thẻ requestedExecutionLevel
và bạn có thể đặt cấp độ thành ba giá trị:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
HOẶC LÀ
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
HOẶC LÀ
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Để đặt ứng dụng của bạn chạy với tư cách quản trị viên, bạn phải chọn ứng dụng ở giữa.
Theo
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
bạn sẽ muốn thêm một bảng kê khai ứng dụng nếu bạn chưa có hoặc không biết cách thêm. Vì một số dự án không tự động thêm một tệp kê khai riêng biệt, trước tiên hãy chuyển đến thuộc tính dự án, điều hướng đến tab Ứng dụng và kiểm tra để đảm bảo dự án của bạn không loại trừ tệp kê khai ở cuối vòi.
Trong Visual Studio 2010, nhấp chuột phải vào tên dự án của bạn. Nhấn "Xem cài đặt Windows", thao tác này sẽ tạo và mở một tệp có tên "app.manifest". Trong tệp này thay thế "asInvoker" bằng "Yêu cầu quản trị viên" như được giải thích trong các phần nhận xét trong tệp.
Một cách khác để làm điều này, chỉ trong mã, là phát hiện nếu quá trình đang chạy với tư cách quản trị viên như trong câu trả lời của @NG. . Và sau đó mở ứng dụng một lần nữa và đóng cái hiện tại.
Tôi sử dụng mã này khi một ứng dụng chỉ cần đặc quyền của quản trị viên khi chạy trong một số điều kiện nhất định, chẳng hạn như khi cài đặt chính nó như một dịch vụ. Vì vậy, nó không cần phải chạy như quản trị viên mọi lúc như các câu trả lời khác cũng buộc nó.
Lưu ý trong đoạn mã dưới đây NeedsToRunAsAdmin
là một phương pháp phát hiện nếu trong các điều kiện hiện tại, đặc quyền quản trị viên được yêu cầu. Nếu điều này trả về false
mã sẽ không tự nâng cao. Đây là một lợi thế lớn của phương pháp này so với các phương pháp khác.
Mặc dù mã này có những ưu điểm đã nêu ở trên, nhưng nó cần phải tự khởi chạy lại như một quy trình mới không phải lúc nào cũng như bạn muốn.
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
tư cách quản trị viên từ người dùng không phải quản trị viên, nếu không, nó sẽ mở âm thầm với quyền người dùng hiện tại (được kiểm tra trên windows 7 64 bit). Theo như tôi có thể nói điều duy nhất bạn có thể làm với UAC bị vô hiệu hóa và quyền quản trị viên bị thiếu là dừng thực thi trong một thời điểm thích hợp.
Bạn có thể tạo tệp kê khai bằng Cài đặt bảo mật ClickOnce, sau đó tắt nó:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
Sau khi bạn nhấp vào nó, một tệp sẽ được tạo trong thư mục thuộc tính của Project có tên app.manifest sau khi được tạo, bạn có thể bỏ Enable ClickOnce Security Settings
chọn tùy chọn
Mở tệp đó và thay đổi dòng này:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
đến:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Điều này sẽ làm cho chương trình yêu cầu quyền quản trị viên.
Đây là phiên bản đơn giản hóa của câu trả lời này , ở trên bởi @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
Nhấp chuột phải vào tệp thực thi của bạn, đi đến Thuộc tính> Tương thích và chọn hộp 'Chạy chương trình này với tư cách quản trị viên'.
Nếu bạn muốn chạy nó với tư cách quản trị viên cho tất cả người dùng, hãy thực hiện tương tự trong 'thay đổi cài đặt cho tất cả người dùng'.