因此,我理解,如果没有管理员权限,则无法在 C:\ 驱动器中创建或删除文件。我的问题是这样的:如果进入 C:\ 驱动器中的目录... 说程序文件那么那里不应该可以写入文件吗?
我创建了一个程序,可以删除整个文件夹中的空目录(即包括子文件夹)
我知道 C:\ 驱动器需要权限,但一旦我的程序发现 Program Files 是一个“非空”目录,它就会进入 Program Files 但仍然被拒绝写入权限。我知道这一点是因为我确保程序列出了它在给定路径中发现的每个目录。因此,C:\ 驱动器中存在的每个文件夹都会被打印出来。但没有文件夹被删除。
而当我将路径直接设置为 C:\Program Files 时,它会根据代码执行删除空目录的任务。
为什么会这样?
我编写了一个批处理文件,并以管理员身份运行。你可能已经猜到了,没有成功。我尝试在管理员模式下通过 cmd 运行它,但还是没有结果。有没有办法可以更改代码的 .class 文件以使用管理员权限运行?或者有没有办法在 cmd 中使用管理员权限运行它?说
java emptyFoldersRemover -runAsAdmin
类似这样的事?
或者我必须制作一个可执行文件?
编辑
我再次强调这一点。有没有办法在cmd中以管理员权限运行java.exe,以便程序以管理员权限处理?
String absolutePath=p;
try {
path=new File(absolutePath);
File listOfFolders[] = path.listFiles();
for(int i=0;i<listOfFolders.length;i++)
if(listOfFolders[i].isDirectory())
System.out.println(listOfFolders[i]);
for (int i = 0; i < listOfFolders.length; i++)
{
if (listOfFolders[i].isDirectory())
{
if(listOfFolders[i].list().length>0) {
/* if(listOfFolders[i].getName().equalsIgnoreCase("Program Files"))
{
for(int j=0;j<listOfFolders[i].list().length;j++)
{
System.out.println(listOfFolders[i].list());
}
}*/
run(listOfFolders[i].getAbsolutePath());
}
else
{
noOfFolders++;
System.out.println(noOfFolders);
listOfFolders[i].delete();
}
}
}
}
catch(Exception e)
{
//e.printStackTrace();
}
return(noOfFolders);
答案1
您要问的是是否有办法以“提升”权限运行您的应用程序。为此,您可以右键单击用于启动应用程序的 cmd,然后选择以管理员身份运行。
如果您想要始终以提升权限启动应用程序,请右键单击 cmd 文件、属性、兼容性,然后选中“始终以管理员身份运行”复选框。
从你的问题的评论来看,听起来你已经尝试过了,但没有效果——但它肯定做有效,所以让我们关注一下为什么它可能对你不起作用 - 你是否被允许提升权限?你是否禁用了 UAC 通知?用户通常认为通过禁用 UAC 通知,他们就是在禁用 UAC 本身 - 事实并非如此。禁用通知只会让操作系统无法提示你提升权限,因此它会默默地导致提升失败。
答案2
我用过提升运行特权 Java 程序,效果很好。你只需确保 elevate.exe 实用程序在 PATH 上,然后在原始命令前加上前缀elevate
:
C:\Program Files >elevate java emptyFoldersRemover
这将触发 UAC 提示。如果您选择允许,您的程序将以提升的权限运行。确保您使用的“提升”二进制文件的体系结构与您使用的 JRE 的体系结构相匹配(例如,如果您使用的是 64 位 java.exe,请确保使用 64 位版本的提升来提升它)。
请注意,一些防病毒/反恶意软件程序会检测 elevate.exe 的可疑行为并会自动隔离或删除它。
答案3
我只能给出一个方向(我认为),因为我几十年前写过一个碎片整理程序,我遇到了一个问题,即使在“提升”模式下运行,也无法访问某些文件夹。我记不清具体细节了,但我的工具需要获得“SE_RESTORE_NAME”权限,请参阅https://learn.microsoft.com/en-us/windows/win32/secauthz/privilege-constants#example。
一旦我弄清楚了这一点,我基本上就可以访问任何内容并对文件进行任何我想要的操作。
SE_RESTORE_NAME TEXT(“SeRestorePrivilege”)
执行恢复操作所需。此权限使系统授予对任何文件的所有写入访问控制权,而不管为文件指定的 ACL 如何。除写入之外的任何访问请求仍将使用 ACL 进行评估。此外,此权限使您可以将任何有效的用户或组 SID 设置为文件的所有者。RegLoadKey 函数需要此权限。
如果拥有此特权,则授予以下访问权限:
写入 DAC
写所有者
访问系统安全
文件_通用_写入
文件添加
文件添加子目录
删除
抱歉,正如我所说,我记不清具体细节,但希望它能帮助你找到正确的方向。
答案4
对于你的第二点
以管理员身份打开 dos 提示符,然后运行 java.exe 或任何其他 exe。
它将以管理员身份运行