不,但这里有几个可能的因素:
一个是,如果/mapuser
在未指定的情况下指定-SetUPN
,ktpass
将更改相关帐户的 UPN 以匹配使用/Princ
命令中的参数指定的任何 SPN(在任何一种情况下,/mapuser
都会将请求的 SPN 注册给指定的用户,但它仅在不存在时更改该帐户的 UPN -SetUPN
)。
这显然是为了让 Linux 客户端可以使用此密钥表成功获取票证(因为从使用 的 Linux 客户端kinit
,如果我们尝试使用注册到帐户的 SPN 获取 Kerberos 票证,但不匹配任何帐户的 UPN,kinit 会告诉我们主体不存在)。Windows 客户端能够获取刚刚注册为 SPN 的 SPN 的票证,而无需服务帐户的 UPN 与所请求的 SPN 匹配。
因此,如果我们尝试使用帐户的“常规”UPN(它在运行之前的UPN ,ktpass
例如user@domain.com
-SetUPN
另一个问题是,当使用参数强制它提示输入密码时,ktpass
它似乎会“破坏”输入的密码。要么将密码设置为我们指定的密码(如果不包括在内),要么只使用我们指定的密码创建密钥表,并相信它是正确的(当然,如果密码无效,生成的密钥表将不起作用给出)。/Pass *
ktpass
-SetPass
根据我的测试,如果我们在命令本身中输入密码(例如/Pass P@ssw0rd
),keytab 将正常工作(假设密码正确)并且密码验证也应该工作,尽管只有当我们以DOMAIN\username
格式指定用户名或如果我们由于上述 UPN 问题,包含-SetUPN
在我们的命令中。ktpass
但是,当我们尝试使用该/Pass *
参数来避免必须在命令行上以明文形式输入密码时,问题就来了。在这种情况下,ktpass
提示我们输入密码,但它显然会修改我们以某种方式输入的任何值(幕后)。这将产生两种可能的结果,具体取决于我们在命令中指定的选项:
- 生成的密钥表文件将无效并且不起作用 - 如果我们包含
-SetPass
参数(告诉ktpass
不要更改帐户的密码)会发生这种情况,因为ktpass
即使“真实”密码在account 是我们在提示符下输入的值。
- 或者,帐户上的结果密码将被设置为未知值(而不是我们期望的值) - 即我们输入的密码的错误版本 - 如果我们不包含 会发生这种情况
-SetPass
,在这种情况下ktpass
会更改将帐户密码设置为它破坏我们输入的任何值。在这种情况下,keytab 将起作用,但是当我们尝试使用密码对该帐户进行身份验证时,我们将收到无效密码错误(因为帐户上的密码不是我们认为的密码 - 它不是我们输入的值在提示符下)。
我在 2008R2、2012 和 2012R2 上测试并确认了这种行为——我无法测试任何更新的东西。
总而言之 -如果您需要知道帐户的密码以便在生成 keytab 后使用任何一种方法(密码或 keytab)进行身份验证,那么您需要在 ktpass 命令本身中输入您的密码,而不是要求ktpass
提示输入密码(即使用/Pass P@ssw0rd
而不是/Pass *
)。只要确保您在安全的环境中执行此操作,就不会有人从您的肩膀上偷看或默默地监视您的屏幕(幸运的是,默认情况下 Windows 不会持久记录 cmd 历史记录)。
另一方面,如果您在创建 keytab 后不需要知道帐户的密码,那么最好只使用它+rndPass
- 这将强制ktpass
为帐户生成一个随机密码,并且 keytab 可以正常工作。
*编辑/更新:我在测试时发现的另一个怪癖是,如果使用已知密码创建了一个新帐户,并ktpass
运行该帐户以创建该帐户的密钥表,并在命令中指定密码,如上所述,但是使用该-SetPass
参数,生成的 keytab 将不起作用。如果我们ktpass
在没有 , 的情况下运行并指定密码-SetPass
,让ktpass
“重置”密码(与它已经存在的值相同 - 我们在创建帐户时设置的值),生成的 keytab 可以正常工作,密码验证也是如此。并且从那时起创建的任何后续密钥表都将起作用(即使使用 创建-SetPass
)。我没有对此行为的解释(在 Server 2012 和 2012R2 上观察到)。