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

时间:2018-01-16 09:26:08

标签: java python smb

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

我需要支持所有SMB方言,并且能够从我的代码中完成。

代码大致如下:

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

我尝试了一些选项,例如smbjimpacketnmapsamba,但这些选项似乎都不符合我的要求。

有没有办法实现上述目标,使用Java,Python或任何可以从我的Java代码调用的Linux CLI?

4 个答案:

答案 0 :(得分:2)

我想它可以帮助你改进jcifs-ng。

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

//选项2 - SMB1和CIFS:

python
from matlab.engine import pythonengine
pythonengine.find_matlab()

答案 1 :(得分:0)

如果您运行的是Windows并且运行该程序的用户可以访问共享,则只需使用java.nio即可。 Java.nio允许您访问SMB共享。

Path path = Paths.get(<SharedFile>);
AclFileAttributeView aclAttribute = Files.getFileAttributeView(path, AclFileAttributeView.class);

然后,您可以使用aclAttribute.getAcls();来获取用户及其权限。

答案 2 :(得分:0)

我认为没有任何开源Java库可以满足您的所有需求。

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

此库支持所有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);

答案 3 :(得分:0)

我们遇到了同样的问题,并且发现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上,因此您必须自己克隆存储库并自行构建。