我有一个Java应用程序。无论如何,我可以判断该进程是否在Windows 7上以管理员权限运行。
答案 0 :(得分:30)
我找到了一个似乎与平台无关的不同解决方案。它试图编写系统偏好。如果失败,则用户可能不是管理员。
建议Tomáš Zato,您可能希望禁止此方法导致的错误消息。您可以通过设置System.err
:
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.prefs.Preferences;
import static java.lang.System.setErr;
import static java.util.prefs.Preferences.systemRoot;
public class AdministratorChecker
{
public static final boolean IS_RUNNING_AS_ADMINISTRATOR;
static
{
IS_RUNNING_AS_ADMINISTRATOR = isRunningAsAdministrator();
}
private static boolean isRunningAsAdministrator()
{
Preferences preferences = systemRoot();
synchronized (System.err)
{
setErr(new PrintStream(new OutputStream()
{
@Override
public void write(int b)
{
}
}));
try
{
preferences.put("foo", "bar"); // SecurityException on Windows
preferences.remove("foo");
preferences.flush(); // BackingStoreException on Linux
return true;
} catch (Exception exception)
{
return false;
} finally
{
setErr(System.err);
}
}
}
}
答案 1 :(得分:21)
我在网上找到了这段代码片段,我认为它会为你完成这项工作。
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;
}
它仅适用于Windows,并内置于核心Java包中。我刚刚测试了这段代码,它确实有效。它让我感到惊讶,但确实如此。
SID S-1-5-32-544是Windows操作系统中Administrator组的ID。
Here is the link了解其工作原理的详细信息。
答案 2 :(得分:5)
Java Runtime Environment中没有这样的工具,但可能是依赖于平台的本机例程。请注意,通常最好的方法是确实尝试这样做,看看它是否失败。
答案 3 :(得分:3)
仅通过尝试需要此类访问的操作(例如绑定低编号端口或打开已知的受保护文件)。
答案 4 :(得分:2)
标记为最佳的答案中的方法对我来说很有效,直到我必须在Linux机器上的Jenkins中构建代码。 com.sun.security.auth.module.NTSystem()在那里不可用,并且使用sun包通常被认为是一种不好的做法: link
答案 5 :(得分:0)
或者你可以这样做:
System.getenv().get("USER")
查看哪个用户启动了该过程。
当我像我一样运行它时,我得到了“goran”,当我用sudo运行它时,我得到了“root”。适用于Linux。 可能需要什么。
答案 6 :(得分:0)
这是Windows 10上的解决方案,我想它也可以在其他Windows操作系统上正常运行。
PasteSpecial(xlPasteValues).PasteSpecial(xlPasteFormats)
答案 7 :(得分:0)
以下代码为我完成了
命令提示符命令
net user
Java代码
public static boolean isAdmin() {
StringBuilder outputbuilder = new StringBuilder();
try {
ProcessBuilder builder = new ProcessBuilder(
"cmd.exe","/c" ,"net user");
builder.redirectErrorStream(true);
Process p = builder.start();
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while (true) {
line = r.readLine();
if (line == null) { break; }
outputbuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
System.out.println(outputbuilder.toString());
return outputbuilder.toString().contains("Administrator");
}