# Batch datei öffnen und als Admin ausführen



## jonasxxmoe (14. Jul 2016)

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?

```
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


----------



## Cromewell (14. Jul 2016)

Ich glaube, es reicht, wenn du die Java-App als Admin startest, oder?


----------



## Flown (14. Jul 2016)

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).


----------



## jonasxxmoe (14. Jul 2016)

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.


----------



## Flown (14. Jul 2016)

Ä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!


----------



## jonasxxmoe (14. Jul 2016)

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).


----------



## Flown (14. Jul 2016)

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.


----------



## thecain (14. Jul 2016)

Du kannst doch einfach in den windows druckereinstellungen die user berechtigen, das sie löschen dürfen.


----------



## jonasxxmoe (14. Jul 2016)

Der Druckauftrag soll durch benutzung eines Makros abgebrochen werden.


----------



## VfL_Freak (14. Jul 2016)

jonasxxmoe hat gesagt.:


> Der Druckauftrag soll durch benutzung eines Makros abgebrochen werden


Was meinst Du denn in diesem Zusammenhang mit _Makro_ ???


----------



## jonasxxmoe (14. Jul 2016)

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.


----------



## KeVoZ_ (14. Jul 2016)

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:

```
start %~dp0[DEIN PROGRAMM]
```


----------



## jonasxxmoe (14. Jul 2016)

Hey 
also die Batch muss als Admin ausgeführt werden, damit sie die Druckaufträge löschen darf.


----------



## KeVoZ_ (14. Jul 2016)

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


----------



## thecain (14. Jul 2016)

Quatsch. Das korrekte berechtige  des druckers ist die lösung. Eine admin cmd zu öffnen kann nicht das ziel sein, zumal das ohne admin pw wie schon erwähnt wurde nicht möglich ist


----------



## Meniskusschaden (14. Jul 2016)

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.


----------



## Meniskusschaden (14. Jul 2016)

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:

```
wmic printjob where owner='user' delete
```


----------



## jonasxxmoe (15. Jul 2016)

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..


----------



## Meniskusschaden (15. Jul 2016)

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.


----------



## jonasxxmoe (15. Jul 2016)

wmic funktioniert nicht, bekomme jedes mal die Meldung "keine Instanzen verfügbar", obwohl ein Auftrag in der Warteschlange ist.


----------



## jonasxxmoe (15. Jul 2016)

https://www.openoffice.org/api/docs/common/ref/com/sun/star/view/PrintOptions.html
https://www.openoffice.org/api/docs/common/ref/com/sun/star/view/XPrintable.html
Leider auch hier nichts aufgeführt zum Thema löschen.. Alles andere scheint möglich zu sein, außer löschen


----------



## thecain (15. Jul 2016)

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.


----------



## Meniskusschaden (15. Jul 2016)

jonasxxmoe hat gesagt.:


> 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.


----------



## Neumi5694 (16. Jul 2016)

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.


----------



## JStein52 (16. Jul 2016)

Neumi5694 hat gesagt.:


> sonst könnten die meisten User mit ihrem Rechner nicht viel anfangen.


Wieso ? Die bearbeiten doch alle ihre eigenen Druckaufträge und das dürfen sie ohne Admin-Rechte. Im übrigen ist mir aus den Ausführungen von @jonasxxmoe immer noch nicht klargeworden ob er Druckaufträge des aktuellen Benutzers abbrechen will oder auch welche von anderen Benutzern ?


----------



## Neumi5694 (17. Jul 2016)

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.


----------



## JStein52 (17. Jul 2016)

Neumi5694 hat gesagt.:


> 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.


----------



## Meniskusschaden (17. Jul 2016)

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.


----------



## jonasxxmoe (18. Jul 2016)

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.


----------



## JStein52 (18. Jul 2016)

Dann sollte die wmic-Lösung von @Meniskusschaden aber funktionieren. Bei mir tut sie das jedenfalls.


----------



## jonasxxmoe (18. Jul 2016)

Also nur diese eine Zeile in die Batch-Datei und diese dann aus dem Java Programm aufrufen?


----------



## jonasxxmoe (18. Jul 2016)

Da bleibt der Druckauftrag in meiner Warteschlange stehen


----------



## JStein52 (18. Jul 2016)

Hast du es mal per Hand aufgerufen ? Was passiert dann ?


----------



## jonasxxmoe (18. Jul 2016)

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).


----------



## jonasxxmoe (18. Jul 2016)

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?


----------



## jonasxxmoe (18. Jul 2016)

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);
     }


----------



## jonasxxmoe (18. Jul 2016)

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..


----------



## Meniskusschaden (18. Jul 2016)

Der folgende Befehl listet die Dokumentnamen des aktuellen Benutzers auf:
	
	
	
	





```
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.


jonasxxmoe hat gesagt.:


> 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).


jonasxxmoe hat gesagt.:


> 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.


----------



## jonasxxmoe (18. Jul 2016)

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.


----------



## Meniskusschaden (18. Jul 2016)

jonasxxmoe hat gesagt.:


> 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.


----------



## jonasxxmoe (18. Jul 2016)

Entschuldige, falls ich mich falsch ausgedrückt hab. Ja ich muss irgendwie den Dateinamen des OpenOffice Dokuments auslesen und das mit Java.


----------



## jonasxxmoe (18. Jul 2016)

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.


----------



## Meniskusschaden (18. Jul 2016)

Folgendes Beispiel funktioniert auf der Kommandozeile:
	
	
	
	





```
wmic printjob where "owner='%USERNAME%' and document='Testseite'" delete
```


----------



## jonasxxmoe (18. Jul 2016)

Vielen herzlichen Dank @Meniskusschaden und allen anderen


----------

