например в ОС: win 8, 8.1
UAC включен.
Программа всегда запускается от имени Администратора.
Команды работают, если вручную от имени Администратора запустить Командную строку и вводить:
Код:
bcdedit /set {current} safeboot minimal
bcdedit /deletevalue {current} safeboot
Но не работают, если из программы вызывать.
Пример вызова:
Код:
procedure TForm1.ONBtnClick(Sender: TObject);
var
batFile :TStringList;
batPath :string;
begin
ONBtn.Enabled := False;
batFile := TStringList.Create;
try
try
// batFile т.к. 'version 1' не сработал
batPath := AppPath + 'bcdedit_safeboot_ON.bat';
batFile.Add('bcdedit /set {current} safeboot minimal');
batFile.Add('del /f /q bcdedit_safeboot_ON.bat');
batFile.SaveToFile(batPath);
finally
FreeAndNil(batFile);
end;
if FileExists(batPath) then
ShellExecute(0, 'open', PWideChar(batPath),'','', SW_SHOWNORMAL); // v4
// StartProcess('cmd /C "' + batPath + '"', SW_SHOWNORMAL); // v2
// runasAdmin(Handle, batPath); // v3
// StartProcess('cmd /C "bcdedit /set {current} safeboot minimal"', SW_SHOWNORMAL); // version 1
finally
ONBtn.Enabled := True;
end;
end;
Для запуска файлов, программ:
Код:
uses Windows, SysUtils, ShellAPI;
function StartProcess(FileName: string; ShowWindowMode :Word=SW_SHOW):Cardinal;
procedure runasAdmin(hWnd: HWND; exeFileName: string);
implementation
// StartProcess('cmd /C del /q /f updatelist.txt', SW_HIDE);
function StartProcess(FileName: string; ShowWindowMode :Word): Cardinal;
var
zAppName: array[0..512] of char;
zCurDir: array[0..255] of char;
WorkDir: string;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin // старт процесса с ожиданием завершения
StrPCopy(zAppName, FileName);
GetDir(0, WorkDir);
StrPCopy(zCurDir, WorkDir);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := ShowWindowMode;
if not CreateProcess(nil,
zAppName, { указатель командной строки, путь к проге + аргументы }
nil, { указатель на процесс атрибутов безопасности }
nil, { указатель на поток атрибутов безопасности }
false, { флаг родительского обработчика }
CREATE_NEW_CONSOLE or { флаг создания }
NORMAL_PRIORITY_CLASS,
nil, { указатель на новую среду процесса }
nil, { указатель на имя текущей директории }
StartupInfo, { указатель на STARTUPINFO }
ProcessInfo) { указатель на PROCESS_INF }
then Result := Cardinal(-1)
else
begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
end;
end;
procedure runasAdmin(hWnd: HWND; exeFileName: string);
var
SEI: TShellExecuteInfo;
lpExitCode: DWORD;
begin // запустить программу от имени Администратора
if not FileExists(exeFileName) then Exit;
ZeroMemory(@SEI, SizeOf(SEI));
SEI.cbSize := SizeOf(TShellExecuteInfo);
SEI.Wnd := hWnd; // Handle App
SEI.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
SEI.lpVerb := PChar('runas');
SEI.lpFile := PChar(exeFileName); // App path
SEI.nShow := SW_SHOWNORMAL;
SEI.lpParameters:= '';
if ShellExecuteEx(@SEI) then
GetExitCodeProcess(SEI.hProcess, lpExitCode);
end;