【发布时间】:2020-03-16 04:09:31
【问题描述】:
我有一个用于安装应用程序的 PowerShell 脚本。
应用程序依赖于一个windows-service,它需要“LogonAsAService”-right。
我使用此代码设置权限:
Powershell:
function getUserName {
Param(
[Parameter(Mandatory=$true)]
[System.Net.NetworkCredential]
$credentials
)
if($credentials.Domain){
return $credentials.Domain + "\" + $credentials.UserName;
}
return $env:COMPUTERNAME + "\" + $credentials.UserName;
}
$serviceUserAccountName = getUsername($serverServiceAccount)
function Add-ServiceLogonRight([string] $Username) {
Write-Host "Enable ServiceLogonRight for $Username"
$tmp = New-TemporaryFile
secedit /export /cfg "$tmp.inf" | Out-Null
(gc -Encoding ascii "$tmp.inf") -replace '^SeServiceLogonRight .+', "`$0,$Username" | sc -Encoding ascii "$tmp.inf"
secedit /import /cfg "$tmp.inf" /db "$tmp.sdb" | Out-Null
secedit /configure /db "$tmp.sdb" /cfg "$tmp.inf" | Out-Null
rm $tmp* -ea 0
}
# Grant rights to the account
Write-Host "Granting logon-as-service user-rights"
Add-ServiceLogonRight $serviceUserAccountName
我也尝试了不同的方法,比如使用这个模块:https://gallery.technet.microsoft.com/scriptcenter/Grant-Revoke-Query-user-26e259b0
问题:
这些方法在理论上是有效的,我用它们都取得了积极的结果,但只是一次或两次尝试。在很多情况下系统(目前是 Windows Server 2016)会到达这一行(对于上面的代码示例,行为与模块相似,但输出看起来有点不同,问题似乎完全相同):
Write-Host "Enable ServiceLogonRight for $Username"
之后 PowerShell 不再响应。我所能做的就是退出整个 PowerShell。
问题似乎可以像这样重现:
- 启动系统
- 运行脚本
- 工作。
- 再次运行脚本
- 不再工作了
=> 似乎它只适用于新启动的系统。这对于环境来说是无法保证的。
我犯了一个错误吗?这是一个已知问题吗?我真的对这种行为感到困惑,似乎无法找到有关究竟是什么导致问题的更多信息。
【问题讨论】:
标签: powershell windows-server windows-server-2016