如何使用jcifs库通过SAMR协议在Samba服务器创建用户?
通过JCIFS使用SAMR协议创建Samba域用户的Java最小示例
前置条件
你已经通过提供的docker-compose配置成功启动Samba DC服务,并且知晓管理员密码(对应配置中的secrets: samba-admin-password)。
引入依赖
如果使用Maven,在pom.xml中添加JCIFS依赖:
<dependency> <groupId>org.codelibs</groupId> <artifactId>jcifs</artifactId> <version>2.1.30</version> </dependency>
核心实现代码
以下是可复现的最小代码示例,实现通过SAMR协议创建域用户:
import jcifs.CIFSContext; import jcifs.context.BaseContext; import jcifs.dcerpc.DcerpcHandle; import jcifs.dcerpc.msrpc.MsrpcSamrConnect5; import jcifs.dcerpc.msrpc.MsrpcSamrCreateUser2; import jcifs.dcerpc.msrpc.MsrpcSamrOpenDomain; import jcifs.dcerpc.msrpc.SamrHandle; import jcifs.dcerpc.msrpc.SamrUserInfo2; import jcifs.smb.NtlmPasswordAuthentication; public class SamrUserCreator { public static void main(String[] args) throws Exception { // 配置参数,根据你的Samba环境调整 String dcHostname = "my.company"; // 对应docker-compose中的hostname String domainNetbios = "MY"; // 域NetBIOS名称,默认是REALM前缀大写,可在容器内用`net ads info`查询 String adminUser = "Administrator"; String adminPass = "你的管理员密码"; // 对应samba-admin-password的内容 String newUser = "test_user"; String newUserPass = "Test@Pass123"; // 需符合Samba密码复杂度要求 // 构建NTLM认证上下文 NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(domainNetbios, adminUser, adminPass); CIFSContext cifsContext = new BaseContext().withCredentials(auth); // 连接到SAMR管道服务 try (DcerpcHandle rpcHandle = cifsContext.getDcerpcHandle("ncacn_np:" + dcHostname + "[\\pipe\\samr]")) { // 建立SAMR服务器连接 SamrHandle serverHandle = new SamrHandle( rpcHandle, new MsrpcSamrConnect5(domainNetbios, MsrpcSamrConnect5.SAMR_ACCESS_ENUMERATE_DOMAINS) ); // 打开目标域,申请创建用户的权限 SamrHandle domainHandle = serverHandle.openDomain(MsrpcSamrOpenDomain.SAMR_ACCESS_CREATE_USER); // 配置新用户信息 SamrUserInfo2 userInfo = new SamrUserInfo2(); userInfo.accountName = newUser; userInfo.fullName = "Test User"; userInfo.password = newUserPass; userInfo.accountDisabled = false; userInfo.passwordMustChange = false; // 发送创建用户请求 MsrpcSamrCreateUser2 createRequest = new MsrpcSamrCreateUser2(domainHandle, userInfo); rpcHandle.sendrecv(createRequest); System.out.println("用户 " + newUser + " 已成功创建!"); } } }
关键注意事项
- 确保Java程序能访问Samba容器的
139和445端口(对应docker-compose中的端口映射) - 密码必须满足Samba的默认密码策略(包含大小写字母、数字、特殊字符,长度至少8位)
- 如果不确定域的NetBIOS名称,可进入Samba容器执行
net ads info查看Domain字段 - 代码中使用try-with-resources自动释放RPC连接和句柄,避免资源泄漏
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

