#include "librpc/gen_ndr/ndr_lsa_c.h"
#include "libcli/util/clilsa.h"
#include "libcli/smb/smbXcli_base.h"
+#include "auth/credentials/credentials.h"
+#include "lib/param/param.h"
struct smblsa_state {
struct dcerpc_binding_handle *binding_handle;
*/
static NTSTATUS smblsa_connect(struct smbcli_state *cli)
{
+ const char *host = smbXcli_conn_remote_name(cli->transport->conn);
+ struct cli_credentials *anon_creds;
+ struct loadparm_context *lp_ctx;
struct smblsa_state *lsa;
struct dcerpc_pipe *lsa_pipe;
+ char *binding_str;
+ struct dcerpc_binding *binding;
NTSTATUS status;
struct lsa_OpenPolicy r;
uint16_t system_name = '\\';
return status;
}
lsa->ipc_tree->tid = tcon.tconx.out.tid;
+ smb1cli_tcon_set_id(lsa->ipc_tree->smbXcli, lsa->ipc_tree->tid);
if (tcon.tconx.out.options & SMB_EXTENDED_SIGNATURES) {
smb1cli_session_protect_session_key(cli->session->smbXcli);
}
- lsa_pipe = dcerpc_pipe_init(lsa, cli->transport->ev);
- if (lsa_pipe == NULL) {
+ anon_creds = cli_credentials_init_anon(lsa);
+ if (anon_creds == NULL) {
talloc_free(lsa);
return NT_STATUS_NO_MEMORY;
}
- /* open the LSA pipe */
- status = dcerpc_pipe_open_smb(lsa_pipe, lsa->ipc_tree, NDR_LSARPC_NAME);
+ lp_ctx = loadparm_init_global(true);
+ if (lp_ctx == NULL) {
+ talloc_free(lsa);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ binding_str = talloc_asprintf(lsa,
+ "ncacn_np:%s[%s]",
+ host, NDR_LSARPC_NAME);
+ if (binding_str == NULL) {
+ talloc_free(lsa);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ status = dcerpc_parse_binding(lsa, binding_str, &binding);
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(lsa);
+ return status;
+ }
+
+ status = dcerpc_binding_set_pointer_option(binding,
+ "connection",
+ struct smbXcli_conn,
+ cli->transport->conn);
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(lsa);
+ return status;
+ }
+
+ status = dcerpc_binding_set_pointer_option(binding,
+ "connection",
+ struct smbXcli_session,
+ cli->session->smbXcli);
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(lsa);
+ return status;
+ }
+
+ status = dcerpc_binding_set_pointer_option(binding,
+ "connection",
+ struct smbXcli_tcon,
+ lsa->ipc_tree->smbXcli);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(lsa);
return status;
}
- /* bind to the LSA pipe */
- status = dcerpc_bind_auth_none(lsa_pipe, &ndr_table_lsarpc);
+ status = dcerpc_pipe_connect_b(lsa, &lsa_pipe, binding,
+ &ndr_table_lsarpc, anon_creds,
+ cli->transport->ev, lp_ctx);
if (!NT_STATUS_IS_OK(status)) {
talloc_free(lsa);
return status;