Batch datei öffnen und als Admin ausführen

jonasxxmoe

Mitglied
Hallihallo, ich öffne in meinem Java Programm eine Batch-Datei, welche die Druckerwarteschlange löscht. Dazu muss diese aber als Administrator ausgeführt werden, weiß jemand ob es dafür ein Parameter gibt? Oder eine andere Lösung?
Java:
try {
  Runtime.getRuntime().exec("cmd /c start C:\\Test\\Test\\printstop.bat");
} catch(Exception ex) {
  System.out.println(ex);
}
So rufe ich die Batchdatei zzT auf.
Danke im Voraus
 
Zuletzt bearbeitet von einem Moderator:
So lange du Java nicht im Administratormodus ausführst, kannst du auch die Rechte innerhalb von Java nicht erhöhen (wäre ja auch grob fahrlässig).
 
gibt es denn irgendeine andere möglichkeit? der druckauftrag sollte bei openoffice bzw. abgebrochen werden, ohne dass der andwender administrator sein muss oder das eine meldung kommt, welche das abfragt.
 
Äquivalentes Beispiel: Kannst du dich an deinem Computer als Administrator anmelden, ohne jemals das Passwort dafür einzugeben?

Also deine Frage ist sicherheitskritisch. Es gibt Mittel und Wege, wie man den Benutzer zu Administratoren erhebt, aber nicht ohne Passwort!
 
Ich verstehe schon, ich habe mich gerade falsch ausgedrückt. Meine Frage war, ob es einen anderen Weg gäbe, die Druckerwarteschlange von Windows (oder direkt OpenOffice) zu löschen (eventuell gibt es ja eine Funktion in Java).
 
Also du startest deinen PrintJob in OpenOffice. Hast du irgendeinen Einfluss darauf, wie der PrintJob gestartet wird? Wenn du die Möglichkeit hast irgendwie daran zu kommen könnte ein CancelablePrintJob helfen. Sonst fällt mir jetzt nichts auf die Schnelle ein.
 
Also Situationsbschreibung 😀 :
Ich schreibe eine Extension für OpenOffice (mit eigener Toolbar usw.), eine Funktion soll sein, dass der Benutzer (mit einem Makro) den Druckvorgang abbrechen kann. Hab es mit einer Batch-Datei gemacht (hat auch funktionier), jedoch muss man dafür Administratorrechte haben und das soll vermieden werden. Also muss ich an den Druckauftrag von OpenOffice kommen und diesen mit Java stoppen.
 
Hey @jonasxxmoe,
wenn du deine *.jar als Administrator ausführen möchtest, lässt du das ganz einfach deine Batch machen, indem du folgendes rein schreibst:
Code:
start %~dp0[DEIN PROGRAMM]
 
Dann entweder mit meinem Inhalt einfach mit Doppelklick starten, ODER einfach Rechtsklick auf die normale Batch und dann als Administrator starten 😉

-> dann wird deine Applikation, die du mit der Batch gestartet hast als Admin ausgeführt 🙂
 
Mich würde noch interessieren, was in der printstop.bat überhaupt für Befehle stehen. Falls es nur um den eigenen Printjob geht, hätte ich eigentlich erwartet, dass gar keine Admin-Rechte erforderlich sind. Wie identifizierst du den Printjob denn? Oder löschst du einfach die gesamte Queue? Das wäre ja etwas rabiat.😉

EDIT: Sehe gerade, dass oben bereits steht, dass die gesamte Queue gelöscht wird. War also ein überflüssiges Posting von mir.
 
Zuletzt bearbeitet:
Vielleicht funktioniert es mit der WMI-Kommandozeile besser. Da hat man die Möglichkeit, nach diversen Kriterien zu filtern. Man müsste es ja zumindest auf den eigenen Benutzernamen beschränken können. Dann richtet man nicht gleich ganz so viel Schaden an, falls sich mal Hunderte von Aufträgen gestaut haben, weil sich keiner die Mühe machen wollte, Papier nachzufüllen.😉
Mit folgender Zeile in der Batch-Datei, müssten beispielsweise alle Aufträge des Benutzers user gelöscht werden:
Code:
wmic printjob where owner='user' delete
 
Also das berechtigen des Druckers ist nicht die Lösung, da es an allen möglichen Druckern funktionieren muss.
Am liebsten würde ich es gar nicht mit einer Batch datei machen, sondern mit einer Funktion aus Java um nur diesen speziellen Druckauftrag zu stoppen. Weiß jedoch wirklich nicht wie ich an diesen kommen soll..
 
Es würde mich schon interessieren, wie du zu löschen versuchst. Da es bisher um das Löschen der gesamten Queue ging, vermute ich, dass du einfach den Spooler-Dienst stoppen und danach die Aufträge auf Dateisystemebene löschen wolltest. Da wären natürlich ganz andere Rechte nötig.

Ich kenne leider auch keinen Weg, um die Druckaufträge mit Java zu löschen, aber falls du genug Informationen hast, kannst du meinen Vorschlag aus #17 vielleicht so anpassen, dass du das Dokument gezielt löschen kannst. Falls du nicht an die Job-ID kommst, wird die Kombination aus Druckername, Dokumentname und Benutzer für die Praxis meistens eindeutig genug sein. Die Infos hast du ja wahrscheinlich. Du könntest auch vorher mittels wmic die passenden Druckaufträge ermitteln und falls es mehr als einen gibt, einen Auswahldialog anbieten, in dem der Benutzer den Job selektiert.
 
Du kannst ohne Admin rechte nicht Dinge machen die nur ein Admin kann. Wenn doch hättest du eine Lücke in windows gefunden.

Um den spooler service zu beenden sind auch admin rechte nötig + um im verzeichnis zu löschen auch.
 
wmic funktioniert nicht, bekomme jedes mal die Meldung "keine Instanzen verfügbar", obwohl ein Auftrag in der Warteschlange ist.
Also wenn wmic wirklich nicht funktioniert, hast du wahrscheinlich ein grundlegendes Problem und solltest vielleicht das Betriebssystem neu installieren.😉
Die Meldung "keine Instanzen verfügbar" erscheint normalerweise, wenn keine Aufträge zur Filterbedingung existieren. Also kann es doch eigentlich nur bedeuten, dass die Druckaufträge zu dem Zeitpunkt schon weg waren, dass die Filterbedingung fehlerhaft war oder dass du keine Rechte an deinen eigenen Druckaufträgen hast (was ungewöhnlich wäre). Oder sollen die Druckaufträge von einem Benutzer gelöscht werden, der sie nicht erstellt hat? Kannst du die Druckaufträge denn überhaupt ganz normal manuell aus der Druckwarteschlange löschen? Dann sollte es über WMI doch auch gehen (Bei mir tut es das übrigens auch). Was zeigt wmic denn an, wenn du es ohne Filterbedingung eingibst, also so: wmic printjob? Es müssen natürlich Druckaufträge existieren, also am besten die Druckwarteschlange vorher anhalten und eine Testseite erzeugen.
 
Ich würde einen Umweg wählen.
1. schreibe ein kleine Programm (entweder in Java oder was anderem, deine Entscheidung), welches eine Batch-Datei startet.
2. die .exe dieses Programms muss Admin-Rechte anfordern (kannst du für Java durch launch4J erreichen, wenn du das Manifest entsprechend gestaltest).
Ruf dann dieses Windows-Programm von deinem Java-Programm aus auf, es wird den User um Admin-Rechte fragen.

Aber ich denke, es muss gerade für Druckaufträge noch eine andere Möglichkeit geben ohne Admin-Rechte, sonst könnten die meisten User mit ihrem Rechner nicht viel anfangen.
 
Richtig, das ist nicht klar. Deswegen darf man die Frage auch nicht auf die Aufträge anderer beschränken, es geht nur um Aufträge allgemein.
 
Deswegen darf man die Frage auch nicht auf die Aufträge anderer beschränken
Er könnte uns auch sagen was er will. Und wenn er es allgemein will führt kein Weg daran vorbei dass er sich auf dem ein oder anderen Weg Admin-Rechte verschafft. Einer davon ist der den du beschrieben hast. Aber ich hatte das Gefühl er will sich um genau das rummogeln.
 
Er könnte natürlich auch einen unter Admin laufenden PrintJobDeletionServer programmieren, der Löschaufträge von PrintJobDeletionClients annimmt.😉
Falls es momentan wirklich daran scheitert, dass der User zwar Löschen soll, aber nicht die nötigen Rechte hat, sollte man die Rechte eben erteilen (müssen ja keine Admin-Rechte sein) oder die Anforderung ganz fallen lassen. Wie oben geschrieben vermute ich aber eher, dass er die nötigen Rechte zwar hat, aber "falsch" löscht, so dass er zusätzliche Rechte braucht.
Ich glaube nicht, dass er die Chance hat, mittels Java an den PrintJob zu kommen, um den Vorschlag von @Flown umzusetzen, es sei denn, er kann bereits bei der Erzeugung eine Referenz darauf speichern.
Deshalb würde ich zunächst mit den Standardfunktionen testen, ob die Rechte ausreichen. Außerdem würde ich mittels wmic einen Löschbefehl entwickeln, der wenigstens im simpelsten Szenario funktioniert (lokaler Drucker, Admin-Rechte, eigenes Dokument). Dann würde ich schrittweise testen, ob es mit fremden Dokumenten, normalen Usern und Netzwerkdruckern immer noch funktioniert. Danach klappt es entweder oder man weiß zumindest wo es hakt und kann entsprechend weiter nachfragen, wobei dann unter Umständen Windows-Administratoren bessere Ansprechpartner sind als Java-Programmierer.
 
Entschuldigung für die späte Rückmeldung, ich war am Wochenende nicht zuhause.
Also um das klarzustellen: Ich kann keine Rechte verteilen (wie oben schon beschrieben), da es an allen möglichen Rechnern funktionieren muss, auf die ich keinen Zugriff habe.
Es sollen nur die eigenen Druckaufträge gelöscht werden und die Drucker können Lokal- oder Netzwerkdrucker sein.
 
Per Hand: Befehl wird durchgeführt, Konsole schließt sich, Druckauftrag bleibt in der Warteschlange.
Aus dem Programm: Konsole öffnet sich, Befehl wird ausgeführt -> Fehlermeldung: Keine Instanzen verfügbar (wird in der Konsole angezeigt).
 
Es funktionier jetzt soweit, jetzt sollen aber (wie beschrieben) nicht alle Druckaufträge, sondern nur die, des jeweiligen Nutzers gelöscht werden. Dieser muss in der WMIC jedoch angegeben werden aber ist ja immer ein anderer. Gibt es hierzu eine Lösung?
 
Vielen Dank euch allen, es funktioniert. Man kann mit Java den Benutzernamen ganz einfach auslesen.


try {
String user= System.getProperty("user.name");
Runtime.getRuntime().exec("cmd /c start wmic printjob where owner='" + user + "' delete");
}
catch(Exception ex)
{
System.out.println(ex);
}
 
Eine Frage hätte ich noch, ist es mit WMIC auch möglich nach Dokumentennamen zu überprüfen? Das würde die Sache um einiges eleganter machen. Nur müsste ich diesen irgendwie mit Java auslesen..
 
Der folgende Befehl listet die Dokumentnamen des aktuellen Benutzers auf:
Code:
wmic printjob where "owner='%USERNAME%'" get document
Man kann den Parameter document, wie jede Menge weiterer Parameter, auch in der where-Bedingung nutzen. and-Verknüpfungen und Abfragen mit like sind ebenfalls möglich. Man muß nur etwas die Syntax testen, bis es wirklich funktioniert.
Per Hand: Befehl wird durchgeführt, Konsole schließt sich, Druckauftrag bleibt in der Warteschlange.
Solche Tests würde ich lieber im bereits geöffneten Konsolenfenster starten, damit man die Ausgabe auch sieht (oder für die Testphase einen pause-Befehl an's Ende der Batch-Datei setzen).
Nur müsste ich diesen irgendwie mit Java auslesen.
Du könntest die Konsolenausgabe einlesen und weiter verarbeiten. Bin aber nicht sicher, ob das mit deiner aktuellen Aufrufmethode via "cmd /c" funktioniert. Falls nicht, kannst du dafür ja ProcessBuilder nutzen.
 
Die Idee mit dem Auslesen ist im Prinzip nicht schlecht, aber dann weiß ich ja immer noch nicht für welches Dokument der Druckauftrag beendet werden soll (falls mehrere geöffnet sind).
Aber Vielen Dank schon mal für die Informationen über WMIC, jetzt brauch ich nur noch den Dokumentennamen.
 
Die Idee mit dem Auslesen ist im Prinzip nicht schlecht, aber dann weiß ich ja immer noch nicht für welches Dokument der Druckauftrag beendet werden soll (falls mehrere geöffnet sind).
Verstehe ich nicht ganz. Hast du nicht danach gefragt, wie du die Dokumentnamen auslesen kannst? Ansonsten stimmt der Dokumentname des Druckjobs doch sicher mit dem Dateinamen des OpenOffice-Dokumentes überein.
 
Hab den Namen der Datei raus, aber die WMIC funktionier so nicht:
"cmd /c start wmic printjob where owner='" + user + "' and document='" + fileName + "' delete"
weiß jemand wieso? Wenn ich document="fileName" rausnehme, funktioniert es. 😵
Und der fileName ist auf jeden Fall richtig.
 

Zurück
Oben