You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:45:20