Tengo una aplicación Java. ¿De todos modos puedo decir si el proceso se ejecutó con privilegios de administrador en Windows 7.Detectar si la aplicación Java se ejecutó como administrador de Windows
Respuesta
Encontré este fragmento de código en línea, creo que hará el trabajo por usted.
public static boolean isAdmin() {
String groups[] = (new com.sun.security.auth.module.NTSystem()).getGroupIDs();
for (String group : groups) {
if (group.equals("S-1-5-32-544"))
return true;
}
return false;
}
SÓLO funciona en Windows, y viene integrado en el paquete principal de Java. Acabo de probar este código y funciona. Me sorprendió, pero lo hace.
El SID S-1-5-32-544 es la identificación del grupo Administrador en el sistema operativo Windows.
Here is the link para obtener más información sobre cómo funciona.
S-1-5-32-544, por supuesto, LMFAO: D –
Good ol 'S-1-5-32-544. Debería haber pensado en eso. – Tom
... Y solo con Sun JVM debido a clases privadas. –
No existe tal recurso disponible en Java Runtime Environment, pero podría estar en una rutina nativa dependiente de la plataforma. Tenga en cuenta que, por lo general, la mejor manera de estar seguro es tratar de hacerlo, y ver si falla.
Solo al intentar una operación que requiera tal acceso (como vincular un puerto de bajo número, o abrir un archivo que se sabe protegido).
Gracias. Eso funcionó para mí. Intenté crear un archivo de prueba en archivos de programa y atrapé IOException (Acceso denegado) ... nuevo archivo (System.getenv ("programfiles") + "/ test.tst"). CreateNewFile() –
¡Sólo Windows, por supuesto! –
O usted podría hacer esto:
System.getenv().get("USER")
Y ver qué usuario inició el proceso.
Cuando lo ejecuto como yo obtengo "goran", cuando lo ejecuto con sudo obtengo "root". Funciona en Linux. Probablemente lo que se necesitaba.
Hmm, esto es interesante, déjame probar esto y ver qué hace en Windows. Si dice "admin", esto funcionará. – user489041
Y, por favor, publique sus resultados. Realmente me gustaría saber si esto es independiente del sistema operativo –
En Windows 7, obtengo un valor nulo si ejecuto este código. Sin embargo, si ejecuto System.getProperty ("nombre.usuario"), obtengo mi nombre de usuario. Pero, esto todavía no dice si soy administrador o no. – Codemwnci
El método de la respuesta marcada mejor funcionó bien para mí hasta el momento en que tuve que construir el código en Jenkins en una máquina Linux. com.sun.security.auth.module.NTSystem() no está disponible allí y el uso de paquetes de sol generalmente se considera una mala práctica: link
Tome la "rt.jar" de su máquina de Windows. Agréguelo a la ruta de clase en su máquina Linux. Luego, tenga un código dentro de su aplicación que pueda ver si es una PC con Windows, ejecute la respuesta aceptada, si es Linux, ejecute las respuestas de Linux a partir de esta pregunta. La primera solución que viene a la mente. Para mí, solo necesitaba hacer esto en Windows, así que no tuve este problema. Es una de esas cosas en las que Java es una mierda. Solo una nota al margen, debe agregar esto como un comentario. – user489041
¡Gracias por la pista sobre el rt.jar! Voy a darle una oportunidad. PD: Sé que esto debería haber sido un comentario, pero desafortunadamente, debido a la forma algo extraña de stackoverflow otorga permisos, con mi reputación actual solo puedo comentar mis propias respuestas/preguntas =) –
He encontrado una solución diferente que parece ser independiente de la plataforma. Intenta escribir preferencias del sistema. Si eso falla, el usuario podría no ser un administrador.
public static boolean isAdmin(){
Preferences prefs = Preferences.systemRoot();
try{
prefs.put("foo", "bar"); // SecurityException on Windows
prefs.remove("foo");
prefs.flush(); // BackingStoreException on Linux
return true;
}catch(Exception e){
return false;
}
}
Como Tomáš Zato sugerido, es posible que desee suprimir mensajes de error causados por este método. Puede hacerlo configurando System.err:
public static boolean isAdmin(){
Preferences prefs = Preferences.systemRoot();
PrintStream systemErr = System.err;
synchronized(systemErr){ // better synchroize to avoid problems with other threads that access System.err
System.setErr(null);
try{
prefs.put("foo", "bar"); // SecurityException on Windows
prefs.remove("foo");
prefs.flush(); // BackingStoreException on Linux
return true;
}catch(Exception e){
return false;
}finally{
System.setErr(systemErr);
}
}
}
Bueno, pero sugiero que almacena en caché el estado en una variable estática privada. No va a cambiar dentro de una instancia del programa. –
@ TomášZato Definitivamente tienes razón en que no va a cambiar, pero quería que el ejemplo de código fuera lo más corto posible – MyPasswordIsLasercats
Una cosa más: la función sigue generando resultados, como 'Kvě 07, 2015 1:49: 14 ODP. java.util.prefs.WindowsPreferences
- 1. C# Comprobar si se ejecuta como administrador
- 2. Java: ejecute como administrador
- 3. Ejecuta la aplicación .NET como administrador
- 4. Cómo ejecutar otra aplicación como administrador en Windows XP
- 5. Detectar si se desinstaló una aplicación
- 6. Averiguar si una aplicación necesita privilegios de administrador
- 7. Detectar si la aplicación se descargó de Android Market
- 8. ¿Cómo puedo detectar si Python se está ejecutando como una aplicación de 64 bits?
- 9. Detectar si la aplicación se inició como servidor HTTP o no (tarea de rake, rconsole, etc.)
- 10. android: detectar si la aplicación se descargó del mercado
- 11. Directorio de inicio del archivo de proceso por lotes de Windows cuando se ejecuta como administrador
- 12. Cómo detectar si Windows se está cerrando o reiniciando
- 13. Detectando si Visual Studio ejecutó un programa, en lugar de ejecutarlo desde el Explorador de Windows
- 14. Solicitud de privilegios de administrador para la aplicación Java en Windows Vista
- 15. ¿La aplicación de detección se colgó durante la carga/la última vez que se ejecutó?
- 16. Detecta si se está ejecutando con privilegios de administrador en Windows XP
- 17. detectar si una clase OCX se ha registrado en Windows
- 18. detectar si componente Swing de Java se ha ocultado
- 19. ¿Cómo detectar a través de Java si un proceso en particular se está ejecutando en Windows?
- 20. ¿Cuántas veces se ejecutó el programa? C#
- 21. ¿Cómo se ejecuta un comando como administrador desde la línea de comandos de Windows?
- 22. ¿Por qué Android no retiene el estado de la aplicación después de presionar el botón Inicio si la aplicación se ejecutó en primer lugar desde App Manager?
- 23. ¿EventMachine genera close_notify en close_connection si se ejecutó tls_start?
- 24. ¿Cómo saber si el script de Python se ejecutó utilizando la opción -m del intérprete?
- 25. ¿Cómo se puede detectar mediante programación si javascript está habilitado/deshabilitado en una aplicación de escritorio de Windows? (Control WebBrowser)
- 26. Detectar si el programa se está ejecutando con todos los derechos de administrador
- 27. python: cómo saber si el archivo se ejecutó como importación frente a script principal?
- 28. Detectar si la aplicación se está ejecutando en la computadora portátil
- 29. ¿Busca el código Delphi 7 para detectar si un programa se inicia con derechos de administrador?
- 30. ¿Cuál es la mejor manera de detectar si una aplicación se inicia con Webstart
que sistema operativo? – thejh
SO es Windows 7 – user489041
He probado mi respuesta en Linux. Probablemente no dependa del sistema operativo, pero no puedo decirlo. –