如何在Java/Spring应用中通过SAMR协议对接Samba服务器?
Spring应用通过SAMR协议集成Samba DC的最小可复现示例
1. 依赖配置(Maven)
首先在pom.xml中添加JCIFS现代化分支的依赖,它对SAMR协议支持更完善:
<dependency> <groupId>org.codelibs</groupId> <artifactId>jcifs-ng</artifactId> <version>2.1.35</version> </dependency>
2. 核心SAMR操作组件
以下是Spring环境下可直接使用的组件,实现查询Samba域用户的基础功能:
import jcifs.CIFSContext; import jcifs.context.BaseContext; import jcifs.smb.SAMR; import jcifs.smb.SamrUserInfo; import jcifs.smb.SmbSession; import jcifs.smb.SmbTransport; import jcifs.smb.ntlmssp.NtlmPasswordAuthentication; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.List; @Component public class SambaSamrClient { // 对应docker-compose中配置的Samba DC地址,需在本地hosts映射127.0.0.1 my.company private static final String SAMBA_DC_HOST = "my.company"; // 域管理员账号 private static final String ADMIN_ACCOUNT = "Administrator"; // 对应docker-compose密钥中的管理员密码 private static final String ADMIN_PASSWORD = "your-admin-password"; // 对应docker-compose中的REALM配置 private static final String DOMAIN_REALM = "MY.COMPANY"; private CIFSContext cifsContext; @PostConstruct public void initCifsContext() { this.cifsContext = new BaseContext(); } public List<SamrUserInfo> fetchDomainUsers() throws Exception { // 构建NTLM认证对象 NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication( DOMAIN_REALM, ADMIN_ACCOUNT, ADMIN_PASSWORD ); // 建立到Samba DC的SMB连接 try (SmbTransport transport = cifsContext.getTransport(SAMBA_DC_HOST, 445)) { transport.connect(); SmbSession session = SmbSession.getInstance(transport, auth); // 初始化SAMR协议实例并执行查询 try (SAMR samr = new SAMR(session)) { int domainHandle = samr.openDomain(session.getRemoteHost(), DOMAIN_REALM); List<SamrUserInfo> userList = samr.queryUsers(domainHandle); samr.closeDomain(domainHandle); return userList; } } } }
3. 功能验证测试
编写Spring Boot测试类快速验证功能:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class SambaSamrClientTest { @Autowired private SambaSamrClient samrClient; @Test public void testFetchUsers() throws Exception { samrClient.fetchDomainUsers().forEach(user -> System.out.printf("账号名: %s, 全名: %s%n", user.getAccountName(), user.getFullName()) ); } }
4. 关键注意事项
- 本地域名解析:在本地
hosts文件添加127.0.0.1 my.company,确保Spring应用能访问到Docker中的Samba DC - 密钥配置:在docker-compose同目录创建
secrets/samba-admin-password文件,写入和代码中一致的管理员密码 - 端口权限:确保本地防火墙开放445、139等映射端口,避免连接被拦截
- 权限要求:SAMR协议操作需要域管理员权限,必须使用
Administrator账号执行
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

