Autor Téma: ShellExecute ze síťového disku  (Přečteno 6398 krát)

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
ShellExecute ze síťového disku
« kdy: 20-02-2013, 12:05:37 »
Nemáte čirou náhodou někdo vyřešený následující problém?

Ve Windows je pod písmenkem X: namapovaný nějaký síťový disk (je celkem jedno, na jakém počítači, může to být i lokální, akorát mapované přes síťové cesty):
Kód: [Vybrat]
net use x: \\localhost\applicationNa tomto disku je aplikace, řekněme aplikace.exe. Windows mají zabezpečené ve svém defaultním stavu, tzn. Internet Options pro zónu Intranet říkají, že se má automaticky zjišťovat intranetová síť. To vede k tomu, že když si v Exploreru otevřu X: a zkusím kliknutím spustit aplikace.exe, dostanu upozornění, že jde o neověřeného vydavatele a jestli opravdu chci aplikaci spustit.

Pokud se pokusím tuto aplikaci spustit pomocí ShellExecute, tak se potvrzující dialog vůbec nezobrazí, aplikace se nespustí a dostanu chybu SE_ERR_ACCESSDENIED. Ovšem když tutéž aplikaci spustím přes CreateProcess, tak všechno proběhne podle očekávání - potvrzující dialog nedostanu a aplikace se spustí. Pokud bych napřed v Možnostech internetu / Zabezpečení / Místní Intranet explicitně nastavil, že můj server patří do místního intranetu, tak zafunguje i ShellExecute.

Otázka zní: Dá se ShellExecute nebo ShellExecuteEx přimět k tomu, aby aplikaci spustil bez varování, bez SE_ERR_ACCESSDENIED a bez nastavování zóny Místní Intranet, podobně jako to dokáže CreateProcess? Když nebude zbytí, tak použiju CreateProcess, ale ShellExecute má tu obrovskou výhodu, že se dá použít i pro "spuštění" dokumentů (např. PDF soubor nebo obrázek) v defaultním prohlížeči pro ten který typ (a dokonce tomu ani nevadí to nastavení Místního Intranetu), a to bych chtěl zachovat. Musel bych testovat příponu souboru, jestli je některá ze spustitelných a potom použít CreateProcess, ale to se mi zdá jako dost velká prasárna (když to udělám jednoduše) nebo jako šílený opruz (když to budu dělat pořádně).

Offline Vrtule

  • Mladík
  • **
  • Příspěvků: 54
  • Karma: 10
    • Verze Delphi: XE2
    • Jádro systému Windows
Re:ShellExecute ze síťového disku
« Odpověď #1 kdy: 24-02-2013, 22:20:15 »
Excellent
Rated 1 time
Zdravím,

díval jsem se na dokumentaci k ShellExecuteEx a ke struktuře SHELLEXECUTEINFO a tvůj problém by možná následující příznak:
Kód: [Vybrat]
SEE_MASK_NOZONECHECKS.
Více viz http://msdn.microsoft.com/en-us/library/windows/desktop/bb759784(v=vs.85).aspx.

Jinak CreateProcess asi bude fungovat z toho důvodu, že ono nastavení internetu je implementováno až v rámci shellu, tedy nad knihovnami jako kernelbase.dll/kernel32.dll.

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1574
  • Karma: 37
    • Pepak.net
Re:ShellExecute ze síťového disku
« Odpověď #2 kdy: 25-02-2013, 08:01:04 »
Díky díky díky, tenhle flag to vážně řeší. Přidal jsem ještě pro jistotu SEE_MASK_CONNECTNETDRV a běhá to přesně podle očekávání.