我有一个用于运行服务的 Windows 帐户(即,任何人都不能以该帐户登录)。结果发现其中一个服务需要访问位于不同 Windows 域中的计算机上的远程网络共享,因此需要提供远程凭据才能访问该共享。
现在如果我需要访问远程共享时,我只需打开凭据管理器并保存所需的凭据即可。但这不是我的做法,我对凭据管理器的理解是它只保存登录用户要使用的凭据。
我当然可以解决这个问题。我暂时提升服务帐户的权限以允许交互式登录,然后以该用户身份登录并使用凭据管理器存储正确的远程凭据。然后我删除交互式登录权限。但这感觉很不礼貌,不是我应该做的事情。
所以我的问题是:除了您登录的帐户之外,还有其他方法可以保存远程凭据吗?有没有更好的方法来解决我的问题。
答案1
如果您可以访问远程计算机,则可以将您的服务帐户添加到本地用户组,并将用户名/密码与您要使用的用户名/密码匹配。不要忘记授予它管理权限。
然后转到系统菜单中的远程登录选项卡,并将该用户添加为允许远程登录的用户。当我需要访问我们网络上的某些机器(但出于某种原因不属于域的一部分)时,我就会这样做。
答案2
虽然结果证明这与您的情况无关,但为了未来搜索者的利益,实际问题“管理其他用户的网络访问凭据”的答案是:
runas /user:serviceaccountname "%windir%\system32\cmdkey.exe /add:server.domain.com /user:username /pass:password"
serviceaccountname
这将在 的凭证库中创建一个凭证,以供server.domain.com
使用username
/ password
。
/user
还支持domain\username
和username@domain
风格。
答案3
为另一个用户设置凭据的最简单方法远程使用cmdkey
,创建一个计划任务,该任务在您想要通过 添加凭据的用户帐户下运行cmdkey
。
通过 使用管理员帐户 连接到相关机器Enter-PSSession -ComputerName target_machine
(或通过 运行命令Invoke-Command
)。
已SeBatchLogonRight
设置
如果您想要通过其添加凭据的用户帐户cmdkey
已经具有SeBatchLogonRight
设置(通常只有管理员),那么它相当简单:
$job = Register-ScheduledJob -ScriptBlock {
cmdkey /add:target_machine:target_port /user:target_domain\target_user /pass:target_user_password
} -Name "Add user credentials" -Credential (New-Object System.Management.Automation.PSCredential("source_domain\source_user", (ConvertTo-SecureString "source_user_password" -AsPlainText -Force))) -RunNow
Unregister-ScheduledJob -InputObject $job
沒有SeBatchLogonRight
已設定
如果您要通过其添加凭据的用户帐户cmdkey
尚未设置SeBatchLogonRight
,则需要(暂时)授予其权限。远程执行此操作的一种简单方法是使用 Tony Pombo 的 PowerShell 模块(原始ScriptCenter 位置不再可用,因此此脚本现在使用公共 GitHub 仓库):
Invoke-WebRequest https://raw.githubusercontent.com/MightyCrizo/cis-microsoft-windows-server-2016-benchmark-powershell/4294a356825a10afacf7da3969ba2f5edf761b21/UserRights.psm1 -OutFile UserRights.psm1
# You might need to setup at least the following execution policy, if you haven't already:
# Set-ExecutionPolicy AllSigned
Import-Module .\UserRights.psm1
Grant-UserRight -Account "source_machine\source_user" -Right SeBatchLogonRight
$job = Register-ScheduledJob -ScriptBlock {
cmdkey /add:target_machine:target_port /user:target_domain\target_user /pass:target_user_password
} -Name "Add user credentials" -Credential (New-Object System.Management.Automation.PSCredential("source_domain\source_user", (ConvertTo-SecureString "source_user_password" -AsPlainText -Force))) -RunNow
Unregister-ScheduledJob -InputObject $job
Revoke-UserRight -Account "source_machine\source_user" -Right SeBatchLogonRight
下列占位符已在上述脚本中使用:
source_domain
= 该域名source_user
属于。source_user
cmdkey
=将为其执行命令的用户(cmdkey
在该用户的上下文中运行)。source_user_password
= 账户的密码source_user
。target_machine
= 命令中使用的目标计算机cmdkey
。target_port
= 命令中使用的目标端口cmdkey
(可选)。(例如,1433
与 SQL Server 结合使用 Windows 身份验证。)target_domain
= 该域名target_user
属于。target_user
= 命令中使用的目标用户帐户cmdkey
。source_user
当连接到时,将模拟该用户target_machine
。target_user_password
= 账户的密码target_user
。
答案4
作为另一种选择,我使用执行程序:
psexec -u otheruser -p otheruserpassword cmdkey.exe /add:server.domain.com /user:username /pass:password