获取是否以管理员身份执行当前脚本Powershell(以管理员身份运行)

时间:2014-09-03 08:35:11

标签: c# powershell access-denied

我拥有Windows Service C#,其中包含用户UserInstallerMoss的凭据。

Windows服务使用凭据UserInstallerMoss执行EXE控制台Aplicaction C#。

EXE Con​​sole Aplicaction使用凭据UserInstallerMoss执行powershell.exe。

服务器是Windows Server 2012 Enterprise。 UAC已禁用。

UserinstallerMOss是本地管理员

Powershell函数返回$ true值:

$ok = IsCurrentUserAdmin
$ok = IsCurrentUserAdmin2

但脚本未能通过“拒绝访问”

  

nativehr:0x80070005 OWSSVR.DLL - 拒绝访问

如果以管理员身份运行当前脚本Powershell,我该怎么办?

如果脚本Powershell中的当前用户是管理员,我该如何获得?

我的函数返回true,但可能是错误的?

Powershell功能:

Function IsCurrentUserAdmin
{
    $ident = [Security.Principal.WindowsIdentity]::GetCurrent() 

    foreach ( $groupIdent in $ident.Groups ) 
    { 
        if ( $groupIdent.IsValidTargetType([Security.Principal.SecurityIdentifier]) ) 
        { 
            $groupSid = $groupIdent.Translate([Security.Principal.SecurityIdentifier]) 
            if ( $groupSid.IsWellKnown("AccountAdministratorSid") -or $groupSid.IsWellKnown("BuiltinAdministratorsSid"))
            { 
                return $TRUE 
            } 
        } 
    } 
    return $FALSE 
} 

Function IsCurrentUserAdmin2
{
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

1 个答案:

答案 0 :(得分:0)

如果要测试脚本是否正在运行提升:

function Test-RunningElevated{
    # returns True if running elevated, otherwise returns False
    $windowsIdentity=[System.Security.Principal.WindowsIdentity]::GetCurrent()
    $windowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($windowsIdentity)
    $adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
    Write-Output ($windowsPrincipal.IsInRole($adm))
}

如果要测试用户运行脚本是否为本地管理员组的成员:

function Test-LocalAdministrator{
    $currentUser = $env:USERNAME
    $currentComputer = $env:COMPUTERNAME
    $adminGroup = [ADSI]"WinNT://$currentComputer/Administrators"
    $adminGroup.Members() | ForEach-Object{
        $member = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)
        if($member -eq $currentUser){
            Write-Output $true
            break
        }
    }
    Write-Output $false
}

像这样使用它们:

if(Test-RunningElevated){
    # code to run goes here
}
else{
    Write-Warning 'This script needs to be run elevated!'
}

请注意,Test-LocalAdministrator仅检查直接成员资格。