Uruchomienie CMD z prawami administratora

0

Witajcie

Zapytam króciutko mam coś takiego:

ShellExecute(Application.Handle, nil, 'cmd', PWideChar('/K mklink /d '+FileName+' '+Docelowy), nil, SW_SHOW);

Konsola się otwiera ale operacja nie zostaje wykonana ponieważ potrzebne są uprawnienia administratora. Moje pytanie jak uruchomić samą konsole z prawami admina? Nie bardzo interesuje mnie uruchamianie całej aplikacji ponieważ jak teraz uruchamiam ją na sztywno jako admin to nie działa mi "drak and drop" zrobiony przy pomocy tej instrukcji:

Drag and drop - przeciąganie plików

0

Jest na google chyba jakiś sposób pod Delphi z procedurą RunAsAdmin czy coś w tym stylu. Takie tricki i kombinacje z UAC, to ma opanowane chyba najlepiej na forum Opi. Natomiast kompletna bzdura dla mnie, że bez praw Admina nie działa Tobie Drag & Drop. Specjalnie włączyłem UAC pod Windows 7, zrestartowałem komputer i uruchomiłem mój program do tagowania plików MP3, który kiedyś napisałem i przeciąganie mp3ek działa (zbliżoną metodą jak z tego arta, co podałeś link, bo to chyba najprostszy sposób óbsługi pod VCL) bez problemów. Zresztą przeanalizuj sobie kod z załacznika. Dodam ,że oczywiście uruchomiałem specjalnie "męcząć się" bez Total Commandera tylko z pod Exploratora bez praw admina. A z uruchomieniem jako admin to może ktoś inny Tobie pomoże. Bo na ogół najprostszym sposobem to odpowiedni plik manifestu (ale wtedy bez komponentu i modułu XPMan). Przykładowo taki plik zapisany u mnie jako rr_downloader.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
          manifestVersion="1.0"> 
<dependency> 
    <dependentAssembly> 
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0" 
            processorArchitecture="X86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        /> 
    </dependentAssembly> 
</dependency> 
<v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
  <v3:security>
    <v3:requestedPrivileges>
      <v3:requestedExecutionLevel level="requireAdministrator" />
    </v3:requestedPrivileges>
  </v3:security>
</v3:trustInfo>
</assembly>

I dodany następująco do zasobów w pliku rr_downloader_manifest.rc:
1 24 "rr_downloader.manifest"
Wystarczy tylko po skompilowaniu pliku *.rc przy użyciu brcc32.exe do postaci pliku *.res dodać do pliku *.dpr taki wpis:

{$R rr_downloader_manifest.res}

To najskuteczniejszy sposób używania programu na prawach admina z włączonym UAC. Program sam się zapyta o to czy ma się uruchomić na prawach admina. Kliknięcie na "Nie" zamyka program. Oczywiście powyższy manifest obsługuje również rzeczy znane z XPManifest, czyli ostrzeżenie o włączonym Caps Locku w kontrolkach edycyjnych przy ustawionym PasswordChar i inne.

0

Dzięki kolego za odpowiedź ALE:

  • Tak na prawdę uruchamiając jako admin nie działa Drag and Drop, może ty to inaczej okodowałeś ja użyłem rozwiązania z linka:
    Drag and drop - przeciąganie plików
    Z tą różnicą że wykrywam upuszczenie na TPanelu jednak zdecyduje się na dodanie manifestu tak aby program zawsze odpalał się jako admin tylko dlaczego do diabła to Drag and Drop na adminie mi nie działa;/

BTW

  • Znalazłem funkcję uruchamiania tylko jednego programu jako admin ale wywołuje błąd jak w załączniku:
procedure TDragForm.UruchomProgram(Plik, Param: String);
var
 Sei: TShellExecuteInfoA;
begin
 {Jeśli nie jest to Win9x}
 if Win32Platform <> VER_PLATFORM_WIN32_WINDOWS then
   begin
    FillChar(Sei, SizeOf(Sei), 0);
    Sei.cbSize := SizeOf(Sei);
    Sei.Wnd    := Application.Handle;
    Sei.fMask  := SEE_MASK_IDLIST or SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;

    {Jeśli jest to Vista}
    if Win32MajorVersion >= 6 then Sei.lpVerb := 'runas'
    else Sei.lpVerb := 'open';

    Sei.lpFile := PAnsiChar(Plik);
    Sei.lpParameters := PAnsiChar(Param);
    Sei.nShow  := SW_SHOWNORMAL;
    if not ShellExecuteEx(@Sei) then RaiseLastOSError;
   end
 else ShellExecute(Application.Handle, 'open', pChar(Plik), pChar(Param), nil, SW_SHOWNORMAL);
end;

Wywołanie:

UruchomProgram('C:\Windows\System32\cmd', PWideChar('/K mklink /d '+FileName+' '+Docelowy));
0

Parametru już nie musisz konwertować. Jest on przetwarzany wewnątrz procedury UruchomProgram.
Wywołaj samo "cmd", gdyż jest to zarejestrowana zmienna globalna w systemie tak jak notepad, explorer, msconfig.

UruchomProgram('cmd', '/K mklink /d ' + FileName + ' ' + Docelowy);

A tak poza tym, jeśli Twoja aplikacja zostanie uruchomiona z uprawnieniami administratora, to każdą aplikację jaką uruchomisz przejmie te uprawnienia.
Oczywiście Twoja aplikacja będzie wymagała zezwolenia ze strony UAC przy każdym jej uruchomieniu.

0

@Opi (goście goście?) Wiem i bez zawahania bym zrobił aby uruchamiała się z prawami admina ale D&D mi nie działa na prawach admina, najpierw to muszę przeskoczyć:) thx za odp.

0

THX

BTW Rozwiązałem problem uruchamiania danego programu z prawami admina i u mnie na win 7 działa:

ShellExecute(Application.Handle, 'runas', 'NazwaProgramu', 'Parametr' nil, SW_SHOW);

Ważny był drugi parametr "runas"

1

Kod podany w opisie z filmiku na: działa z UAC i na prawach Admina. Swoją drogą pierwszy wynik jak wpiszemy w google delphi drag and drop uac - dzięki Tobie dowiedziałem się w ogółe, że drag and drop może nie działac z włączonym UAC, o czym nie miałem pojęcia. Ale na przyszłość zawsze googluj, a tym bardziej jak widzisz, że faktycznie winne jest UAC. Jakby Ci się nie chciało ściągać pliku z ruskich stron to dołączyłem na szybko kod do tego posta. Kluczowa tutaj jest funkcja ChangeWindowMessageFilter, która jak wynika z MSDN'a jest wprowadzona dopiero od Windows Vista, także trzeba dorobić sprawdzanie wersji systemu i wywoływac tę funkcję dopiero kiedy stwierdzona wersja systemu to Vista lub wyższa.

0

Wielkie dzięki dodanie:

function ChangeWindowMessageFilter(msg : cardinal; action : word) : bool; stdcall; external user32;

procedure TDragForm.FormCreate(Sender: TObject);
const
  Msg_Add = 1;
  WM_COPYGLOBALDATA = $49;
begin
  if not ChangeWindowMessageFilter(WM_DROPFILES, Msg_Add) then
    RaiseLastOSError;
  if not ChangeWindowMessageFilter(WM_COPYGLOBALDATA, Msg_Add) then
    RaiseLastOSError;
    DragAcceptFiles(Self.Handle, True);
end;

spowodowało że D&D działa na prawach admina, jesteś wielki!

0

Pewnie to banalne pytanie ale jak mogę odczytać nazwę katalogu?

Teram mam np w zmiennej:

c:\test\test2\costam

I z tego potrzebuje:

costam

Czyli nazwę katalogu który upuszczamy na program.

==========EDIT==============
Rozwiązanie znalezione i było bardzo łatwe:

http://stackoverflow.com/questions/2783164/delphi-7-get-folder-name-from-path

ExtractFileName(FileName)

1 użytkowników online, w tym zalogowanych: 0, gości: 1