使用 nsupdate 在 Microsoft DNS 中添加静态 DNS 条目

使用 nsupdate 在 Microsoft DNS 中添加静态 DNS 条目

我是我公司的 Microsoft DNS 管理员。Linux 管理员正在使用 nsupdate 向其服务器的 Microsoft DNS 添加多个 DNS A 和 PTR 记录。这些记录带有时间戳,DNS 清理会在我们配置的时间范围后删除它们。他如何运行命令以仅添加静态条目?

答案1

这是我们在管理 Web 服务器上使用的解决方案(不完全是您要求的解决方案,但我们认为在我们的案例中,这是唯一可行的解​​决方案)

重现步骤:

  1. 在一台 Windows 主机上配置 WinRM(我们使用 DHCP 服务器来实现这一点) https://support.microsoft.com/en-us/help/2019527/how-to-configure-winrm-for-https
  2. 安装 python 和pywinrm在您的主机上,或集中式主机上。我们将整个内部主机和 IP 管理托管在接管此角色的 Web 服务器上。
  3. 从有权操作 DNS 条目的用户帐户获取用户名和密码或 Kerberos Keytab 文件
  4. 充当 WinRM 端点的 Windows 主机计算机帐户需要启用 Kerberos 委派,才能将凭据转发到目标 DNS 服务器
  5. 有 Windows远程医疗安装后,dnscmd.exe 可在 WinRM 主机上使用。
  6. transport.py为了让 kerberos 与下面提供的脚本一起工作,我必须更改 pywinrm 提供的文件中的一行。(不幸的是,我似乎再也找不到这一行了……抱歉)(如果您想通过用户名和密码进行身份验证,可以跳过这一步。如果您必须向 DNS 服务器进行身份验证,仍然需要 Kerberos 委派。只有在 DNS 服务器上打开 winRM 时,您才能跳过这一步(不推荐!))
  7. 执行脚本如下:kinit -f -t /path/to/krb5.keytab -k username@DOMAIN ; LANG=\"C.UTF-8\" ; /the/script/provided/below.py -m mywinrmhost.example.org -c "dnscmd.exe dns dns server.example.org /recordadd example.org entire.example.org /CreatePTR newentrie 10.20.30.40"
#!/usr/bin/python3

#https://support.microsoft.com/en-us/help/2019527/how-to-configure-winrm-for-https

import winrm, sys, getpass, argparse
__author__ ='Daywalker (at least partially)'

parser = argparse.ArgumentParser(description='This is a basix winRM script')
parser.add_argument('-a','--auth',help='Authentication type (plaintext|kerberos)', default="kerberos", required=False)
parser.add_argument('-m','--host', help='Hostname or IP address of the target Windows machine',required=False)
parser.add_argument('-u','--user',help='Username for authentication', required=False)
parser.add_argument('-p','--password',help='Password for the given username', required=False)
parser.add_argument('-c','--command',help='Command to execute', required=False)

args = parser.parse_args()

hostname = args.host
user = args.user
pw = args.password
command = args.command
auth = args.auth;

if not hostname:
    hostname = "mytargetwinrmhost.example.org"
if args.auth != 'kerberos':
    if not user:
        user = input("Enter a username for the WinRM connection to " + hostname + ": ")

    if not pw:
        print("Enter password for " + user)
        pw = getpass.getpass()

    if not user:
        print("Username missing");
        sys.exit(1);

    if not pw:
        print("Empty passwords not allowed");
        sys.exit(1);

if not hostname:
    print("Hostname missing");
    sys.exit(1);

#s = winrm.Session(hostname,auth=(user,pw),transport='plaintext')
s = winrm.Session(hostname,auth=(user,pw),transport=auth)

if not command:
    command = input("Please enter the command to execute: ")

r = s.run_cmd(command)
#print(r.status_code)
print(r.std_out.decode('437'))
print(r.std_err.decode('437'))
quit()

相关内容