응용 프로그램이 정말 관리자 액세스
을 필요로하는 일부 일을 할 않으며 그 경우 정말 큰 경우; 거의 아무도는
후 가장 좋은 방법은 당신이 먹고 싶어 조치 명령 줄 스위치의 말을 전달 자신의 상승 된 사본을 시작하는 것입니다 필요가 없습니다.
는 서비스을 시작하고 싶은 말은 수 있습니다. 당신은 그것에 UAC의 방패 버튼을 만들 : 도우미와
procedure TForm1.StartService(Sender: TObject);
begin
if IsUserAnAdmin then
begin
//no need to elevate, we're already an admin
StartService();
Exit;
end;
//We're a standard user, relaunch elevated to start the service
RunAsAdmin(0, ParamStr(0), '/StartService');
end;
:
그런 다음 클릭 이벤트에 당신이 /StartService
명령 줄 매개 변수를 전달, 자신의 높은 사본을 실행 기능을 사용하여 관리자 권한이 있는지 확인하십시오 :
///This function tells us if we're running with administrative permissions.
function IsUserAdmin: Boolean;
var
b: BOOL;
AdministratorsGroup: PSID;
begin
{
This function returns true if you are currently running with admin privelages.
In Vista and later, if you are non-elevated, this function will return false (you are not running with administrative privelages).
If you *are* running elevated, then IsUserAdmin will return true, as you are running with admin privelages.
}
b := AllocateAndInitializeSid(
SECURITY_NT_AUTHORITY,
2, //2 sub-authorities
SECURITY_BUILTIN_DOMAIN_RID, //sub-authority 0
DOMAIN_ALIAS_RID_ADMINS, //sub-authority 1
0, 0, 0, 0, 0, 0, //sub-authorities 2-7 not passed
AdministratorsGroup);
if (b) then
begin
if not CheckTokenMembership(0, AdministratorsGroup, b) then
b := False;
FreeSid(AdministratorsGroup);
end;
Result := b;
end;
관리자 권한으로 앱을 시작하는 트릭 r은 에서 runas 동사와 에게에서 ShellExecute을 사용하는 것입니다. 당신은 단지 응용 프로그램 시작에 /StartService
명령 줄 스위치를 감시 할 필요가 이제
function RunAsAdmin(hWnd: HWND; filename: string; Parameters: string): Boolean;
{
See Step 3: Redesign for UAC Compatibility (UAC)
http://msdn.microsoft.com/en-us/library/bb756922.aspx
}
var
sei: TShellExecuteInfo;
begin
ZeroMemory(@sei, SizeOf(sei));
sei.cbSize := SizeOf(TShellExecuteInfo);
sei.Wnd := hwnd;
sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
sei.lpVerb := PChar('runas');
sei.lpFile := PChar(Filename); // PAnsiChar;
if parameters <> '' then
sei.lpParameters := PChar(parameters); // PAnsiChar;
sei.nShow := SW_SHOWNORMAL; //Integer;
Result := ShellExecuteEx(@sei);
end;
: 나는 이제까지 편리한 래퍼를 만들었습니다. 이 빠르고 깨끗한 코드에서 FormActivate에 넣습니다. 현실에서 당신은 Application.Run하기 전에, 프로젝트 파일에 넣어 것 :
procedure TForm1.FormActivate(Sender: TObject);
begin
if FindCmdLineSwitch('startService', True) then
begin
//If we're not an admin, then use ShellExecute to launch ourselves as one
if not IsUserAdmin then
begin
//Relaunch ourselves as an admin
Toolkit.RunAsAdmin(0, ParamStr(0), '/StartService'); //don't forget to pass the command option
Application.Terminate;
Exit;
end;
//We are an admin; do the updates.
StartOurService();
MessageDlg('Service started!', mtInformation, [mbOk], 0);
Application.Terminate;
Exit;
end;
end;
주 : 퍼블릭 도메인으로 공개 코드를. 기여가 필요하지 않습니다.
당신은 UAC 프롬프트를 우회 할 수 없으며, 이것은 의도적으로 설계된 동작입니다. 일반적인 방법은 응용 프로그램 매니페스트를 응용 프로그램에 추가하여 응용 프로그램을 시작할 때 UAC 프롬프트가 한 번만 표시되도록하는 것입니다. 이 방법으로 앱이 관리자 권한으로 실행되며 더 이상 UAC 프롬프트가 표시되지 않습니다. (별도의 질문 : 앱이 처음에 관리자 권한을 필요로 무엇을하고) –
내 프로그램은 윈도우 시작시 실행 및 매니페스트 추가 할 때 프로그램이 시작 느 베르. – Rahul
그러면 관리자 권한이 필요한 응용 프로그램에서 작업하지 않는 것이 좋습니다. UAC 프롬프트를 무시할 수 없으며 이것은 의도적으로 설계된 것입니다. –