当前位置: 首页 > 知识库问答 >
问题:

获取Java中的SMB共享文件名和权限

从光启
2023-03-14

我想连接到SMB服务器,浏览其文件,并为给定的路径,能够检索文件和文件夹的列表,名称和权限。

我需要支持所有SMB方言,并且能够从我的代码中做到这一点。

代码大致如下所示:

smbClient.connect(serverInfo);
info = smbClient.getShare(shareName);
for(File file : info.getFiles) {
    List<permission> permissions = file.getPermissions();
    //do something
}

我尝试了一些选项,如smbj、impacket、nmap、samba,但它们似乎都不能满足我上面的要求。

是否有任何方法可以通过使用Java、Python或我可以从Java代码中调用的任何linux CLI来实现上述目标?

共有3个答案

皇甫高阳
2023-03-14

我们也遇到了同样的问题,并找到了jcifs-ng来最好地满足我们使用java的需求(虽然我们只在v1和v2上测试了它,但最新版本也对v3有一些支持)。您的代码看起来像:

Configuration config = new PropertyConfiguration(new Properties());
CIFSContext context = new BaseContext(config);
context = context.withCredentials(new NtlmPasswordAuthentication(null, domain, userName, password));
String share = "smb://HOSTNAME/SHARENAME/";
try (SmbFile share = new SmbFile(url, context)) {
    for (SmbFile file : share.listFiles()) {
        ACE[] groups = file.getSecurity();
        // Do something..
    }
}

其中ACE是一个访问控制条目,它是一个控制或监视对对象的访问(简称权限)的元素。

请注意,最新版本可能还没有在Maven或Gradle上,所以您必须克隆回购并自己构建它。

湛宜春
2023-03-14

我不认为有任何开源Java库支持您所需要的一切。

有一个名为jNQ的非开源库,名为“Visuality Systems”

此库支持所有SMB方言(SMB1到SMB3.1.1)

在链接中有一个代码示例用于浏览(并且您可以获得列表中每个文件的安全描述符):

PasswordCredentials cr = new PasswordCredentials("userName", "password", "domain");
Mount mt = new Mount("IpAddress","ShareName", cr);
Directory dir = new Directory(mt, "dir1");
Directory.Entry entry;
System.out.println(DIR + " scan:");
do {
    entry = dir.next();
    if (null != entry)
        System.out.println(entry.name + " : size = " + entry.info.eof);
} while (entry != null);
陶修洁
2023-03-14

我想它可以帮助你提高jcifs ng。

**// Option 1 - SMB2 and SMB3:**
Properties prop = new Properties();
prop.put( "jcifs.smb.client.enableSMB2", "true");
prop.put( "jcifs.smb.client.disableSMB1", "false");
prop.put( "jcifs.traceResources", "true" );
Configuration config = new PropertyConfiguration(prop);
CIFSContext baseContext = new BaseContext(config);
CIFSContext contextWithCred = baseContext.withCredentials(new NtlmPasswordAuthentication(baseContext, domain, fileSystemInfo.getUsername(), fileSystemInfo.getPassword()));
SmbFile share = new SmbFile(fullPath.replace('\', '/'), contextWithCred);
if (!share.exists())
{
    share.mkdirs();
}
share.close();

//选项2-SMB1和CIFS:

SingletonContext context = SingletonContext.getInstance();
CIFSContext testCtx = context.withCredentials(
    new NtlmPasswordAuthentication(
        context, domain, fileSystemInfo.getUsername(), fileSystemInfo.getPassword()
    )
);
SmbFile smbFile = new SmbFile(fullPath.replace('\', '/'), testCtx);
if (!smbFile.exists())
{
    smbFile.mkdirs();
}
smbFile.close();
 类似资料:
  • 我必须更新一个旧的文件共享软件,该软件使用JCIFS for Windows Server 2012。出于安全目的,我们必须禁用SMB 1.0/CIFS兼容性。有人知道可以在Java中使用的变通方法或修复程序或JCIFS的替代方案吗?

  • 我在/mnt/SMB/下挂载了一个SMB共享文件夹,我可以访问这些文件。当我使用命令卸载此共享文件夹时:

  • 我有一台Windows CE 5.0计算机,该计算机具有文件的smb共享。 此文件是由批处理脚本创建的,该脚本将另一个exe的stderr重定向到该文件:。 考虑到在运行时,我无法在Windows CE计算机上使用打开,这一操作非常有效。如果我尝试,NotepadCE将显示一个共享冲突错误。 同一文件可以由其smb共享同时读取,不会出现任何问题。 是否有一种方法可以使Windows CE计算机上的

  • 我正在寻找从连接到共享的Windows计算机导出SMB/CIFS共享的ACL(不要与NTFS ACL混淆)的方法。到目前为止,我可以在共享的高级安全属性中看到权限,但除了AutoIT怪物之外,无法导出或解析它们。 我想以我可以解析的格式获取这些信息,无论是CSV、JSON、XML等。 我已经检查了这个问题,该问题建议使用Powershell的:使用Powershell检索远程文件共享“共享权限”,

  • 我在使用Docker容器时遇到了一个有点烦人的问题(我使用的是Ubuntu,所以没有像VMWare或b2d这样的虚拟化)。我已经构建了我的映像,并且有一个正在运行的容器,其中有一个来自主机的共享(装入)目录和一个来自主机的共享(装入)文件。以下是命令的全文: 注意:许多用于编辑文件的工具,包括vi和sed--in-place可能会导致inode更改。从Docker V1.1.0开始,这将产生一个错

  • 问题内容: 我有一个提供文件(包括文件名)的绝对路径的文件。我只想获取文件名。最简单的方法是什么? 必须尽可能地笼统,因为我无法事先知道该URL是什么。我不能简单地创建一个URL对象并使用-尽管所有可能的情况都是理想的- 因为它不一定是前缀,它可以是c:/或类似的东西。 问题答案: 要么 请注意,第一个解决方案取决于系统。它仅考虑系统的路径分隔符。因此,如果您的代码在Unix系统上运行并接收Win