我正在编写一个帮助程序脚本,它将通过服务器列表并验证它们是否与NTP同步。脚本应根据设施操作员的请求作为普通脚本运行,并且如果目标不同步,则应请求管理员凭据。遗憾的是,我们目前无法更改NTP配置,因此我们必须进行解决方法。
我现在拥有的(如果脚本以管理员身份运行,它可以很好地工作)是一个命令(远程计算机的“w32tm / query / status”),它通过“Invoke-Command”执行,所以我可以通过它管理员凭据。
我的想法是避免使用WinRM,因为主机名解析在我们的系统中无法正常工作(它需要一些痛苦的主机到IP和回到正确的主机名解析),这使得WinRM无用。
命令w32tm可以获取远程计算机的状态,但需要以管理员身份运行它。
在这两种情况下(以管理员身份运行并以普通用户身份运行,稍后提供凭据),$脚本以域\管理员身份执行(通过检查管理员角色和“WhoAmI”命令确认)但状态仅为以管理员身份执行整个脚本时获取。 对于普通用户的执行,我收到错误:
The following error occurred: Access is denied. (0x80070005)
我使用的所有机器显然都允许远程执行,因为它适用于管理员用户。
所以基本上我的问题是,如果用户的角色适合任务(它是管理员角色),为什么在$脚本中不允许使用“w32tm ...”命令?
我无法解决的脚本部分:
function synchronize_remote_machine ($target, $username, $cred)
{
$script = {
param( [String] $compName )
$user = [Security.Principal.WindowsIdentity]::GetCurrent();
$userIsAdmin = (New-Object Security.Principal.WindowsPrincipal $user).`
IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
if (-not $userIsAdmin)
{
Write-Warning "You do not have Administrator rights to run this script!`n
Please re-run this script as an Administrator!"
}
else
{
whoAmI
w32tm /query /status /computer:$compName
#w32tm /resync /rediscover /computer:$compName
}
}
# resync via WinRM
try
{
#execute_resync_command $target $username $cred
if ($username -eq 'Administrator')
{
# when run as admin
invoke-command -ScriptBlock $script -ArgumentList $target;
}
else
{
# for normal user the initalized credential cals is used
invoke-command -computername "localhost" -Credential $cred -ScriptBlock $script -ArgumentList $target
}
}
catch
{
Write-Error "Error executing resync command on host $target."# -foregroundcolor "red"
throw
}
}
答案 0 :(得分:2)
我没有(重新)使用提升的权限运行脚本,而是在这些服务器上授予运营商组SeSystemtimePrivilege
。您可以使用组策略或从每台服务器上的Server 2003 Resource Kit Tools运行ntrights.exe
来执行此操作:
ntrights +r SeSystemtimePrivilege -u DOMAIN\operators
答案 1 :(得分:1)
即使您以管理员身份执行,也可以尝试在提升的流程中运行脚本吗?
您可以使用Start-Process
CmdLet来实现这一目标。
start-process 'c:\system32\WindowsPowerShell\v1.0\powershell.exe' -verb runas -argumentlist "-file YourScript.ps1"