2011-01-03 6 views
4

Wie programmgesteuert Dateizuordnung ändern, wenn der Benutzer nicht Administrator/erhöhte Rechte (Win XP, Vista, 7) hat? Irgendwelche Ideen, wie man das umgeht? Grundsätzlich möchte ich meine Anwendung so lite beibehalten, wie sie jetzt ist (sie benötigt keine erhöhten Rechte zum Installieren und Ausführen). Im Moment biete ich eine GUI-Schnittstelle an, wo der Benutzer die Dateizuordnung ändern kann, aber wenn der Benutzer eingeschränkte Rechte hat, zeigt er nur eine Meldung an, dass er das nicht tun kann und erklärt ihm, wie er das "Run this" aktiviert Programm als Administrator "und starten Sie das Programm neu. Wenn der Benutzer die Rechte hat, ändere ich einfach die Zuordnung.Wie Dateizuordnung programmgesteuert ändern, ohne Erhöhung erforderlich

Es gibt einen besseren Weg, es zu tun und 'Lite' zu bleiben?

Antwort

10

In Windows (seit Windows 2000) dürfen Sie eine systemweite Dateizuordnung haben, für die erhöhte Berechtigungen festgelegt werden müssen, und pro Benutzerdateizuordnungen.

Wenn Sie bleiben möchten lite, erstellen Sie eine per_user Dateizuordnung und das war's.

Werfen Sie einen Blick auf diesen Artikel: Changes in File Types and File Association Features in Windows 2000 and Windows Server 2003.

+1

+1 Wenn Sie nicht möchten, dass eine Operation eine Erhöhung erfordert, bleiben Sie einfach bei den Benutzerprofileinstellungen. –

+0

"per_user file association" - - - Ich wusste nicht, dass Sie das tun können. Klingt gut. Dies ist der Mittelweg zwischen "global gehen" und "bleiben". +1 (es könnte die Antwort sein, die ich gesucht habe) – Ampere

+1

** Dies ist ** die Antwort, die Sie suchen. Sie können nicht zulassen, dass ein nicht privilegierter Benutzer globale Änderungen vornimmt (was sich wiederum auf privilegierte Benutzer auswirkt), da dies eine Sicherheitsverletzung darstellen würde - es gibt einen Grund, wenn Windows dies nicht zulässt. Versuchen Sie nicht, die Sicherheit zu umgehen - schreiben Sie sich artige Anwendungen. –

1

Meine Lösung (für bessere Alternativen zu warten):

Es sieht aus wie nur der Administrator kann global die Zuordnung ändern. In diesem Licht ist der beste Weg, den ich mir jetzt vorstellen kann (aber nicht bei weitem perfekt), ein kleines externes Dienstprogramm zu erstellen, das implizit mit erhöhten Rechten läuft. Dieses Tool wird dann die Zuordnung ändern. Natürlich können die Benutzer ohne erhöhte Rechte die Zuordnung nicht ändern.

+0

Ich verstehe das nicht. Was meinst du mit "implizit läuft mit erhöhten Rechten"? –

+0

Sie können ein Manifest erstellen, das besagt, dass erhöhte Rechte erforderlich sind. Der Benutzer wird dennoch zur Eingabeaufforderung aufgefordert, wenn die Benutzerkontensteuerung nicht deaktiviert ist. –

+0

@Andrew Ich wollte @Altar erklären, wenn er das meinte. Es würde die Frage nicht wirklich beantworten, da das OP eine Erhöhung vermeiden möchte. EDIT: Und ich sehe jetzt, dass dies die Antwort des OP auf seine eigene Frage ist !! –

2

Sie können das ShellExecute verwenden, um Ihr externes Dienstprogramm zu erstellen. Stellen Sie sicher, dass das Shield-Symbol in Ihrer Aktion enthalten ist, um anzuzeigen, dass dafür erhöhte Berechtigungen erforderlich sind. Es wird dann den Benutzer auffordern und ihnen mitteilen, dass es spezielle Berechtigungen benötigt.

Eine Sache, die Sie tun könnten, ist, Flags zu Ihrer eigenen Anwendung hinzuzufügen, die anzeigt, dass es Berechtigungen ändern wird. Und dann führen Sie Ihre Anwendung erneut mit den speziellen Flags aus.

Zum Beispiel, wenn Ihre Anwendung

MyApplication.exe

ist Sie

MyApplication.exe/setfiles

, die nur die Dateizuordnungen setzen würde laichen können dann beenden. Auf diese Weise müssen Sie nur eine ausführbare Datei versenden.

function RunAsAdmin(hWnd: HWND; filename: string; Parameters: string): Boolean; 
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; 
+0

Das Verb 'runas' ist ein spezieller undokumentierter Trick, um eine Erhöhung anzufordern; vermutlich funktioniert es nicht auf XP, wo UAC nicht existiert. Und was passiert unter Vista/7, wenn der Benutzer ein Standardbenutzer ist und keine Administratorrechte hat (müsste also über die Schulter gehen)? Ein Edit, um zu erweitern, was "runas" tut, wäre hilfreich. –

0

Sie eine Lösung an dieser Stelle finden können die Registrierung mit (OS ist Windows XP) - so kann es nicht auf Ihre Anfrage anwendbar: http://volvox.wordpress.com/2006/06/02/extensions-101/ - leider ist es in französisch ... Vollständige Quellen (gut dokumentiert) und ausführbar zum Herunterladen.

+0

+1, weil ich hasse leise Downvoting ... – Remko

+0

Wie Sie sagten, es hilft nicht. Zuerst muss ich verstehen, was es tut. – Ampere