访问远程计算机上的虚拟磁盘服务 - UnauthorizedAccessException

Posted

技术标签:

【中文标题】访问远程计算机上的虚拟磁盘服务 - UnauthorizedAccessException【英文标题】:Accessing Virtual Disk Service on remote machine - UnauthorizedAccessException 【发布时间】:2012-04-20 15:04:31 【问题描述】:

我尝试访问远程计算机上的虚拟磁盘服务 (VDS)。在解决了一些与缺少 Windows 防火墙规则(RPC 不可用)相关的问题后,我在查询服务时遇到了 UnauthorizedAccessException (E_ACCESSDENIED)。

这是我的代码:

        // Create the service loader
        VdsServiceLoader loaderClass = new VdsServiceLoader();
        IVdsServiceLoader loader = (IVdsServiceLoader)loaderClass;            
        Console.WriteLine("Got Loader");

        // Load the vds service
        try
        
            loader.LoadService(<Hostname>, out service);
        
        catch (UnauthorizedAccessException)
        
            // E_ACCESSDENIED
            Console.WriteLine("Need admin rights");
            return;
        

如果我访问本地服务,当我没有以管理员权限执行时会引发此异常。如果我以管理员权限执行,一切都很好,我可以毫无问题地获取本地 VDS 信息。

我想我必须在某处指定用户名/密码才能访问该服务,但我不知道在哪里。或者在远程机器上授予对该服务的访问权限。

我也像这样尝试了建议的 ImpersonateUser

if (ImpersonationAPI.LogonUser(pUsername, pDomain, pPassword, LogonType.LOGON32_LOGON_NEW_CREDENTIALS, LogonProvider.LOGON32_PROVIDER_WINNT50, ref token) != 0)

    if (ImpersonationAPI.DuplicateToken(token, SecurityImpersonationLevel.SecurityImpersonation, ref tokenDuplicate) != 0)
    
         tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
         LoadUserProfile(tokenDuplicate, pUsername);
         m_ImpersonationContext = tempWindowsIdentity.Impersonate();
         ...
     

我还尝试了标志 LOGON32_LOGON_INTERACTIVE、LOGON32_LOGON_NETWORK、LOGON32_LOGON_NETWORK_CLEARTEXT 和 LOGON32_LOGON_SERVICE。

两台机器都运行 Win 7。

谢谢!

【问题讨论】:

【参考方案1】:

您需要登录到远程计算机并在该计算机上模拟具有适当权限的用户。为此,使用LogonUserLOGON32_LOGON_NEW_CREDENTIALS 登录类型,使用生成的令牌构造Windows 标识并模拟它。参见例如这个问题Get impersonated user name 的示例。

【讨论】:

我发现了这个:初始化 DCOM 安全和模拟...... 原因是 DCOM 安全由 CLR 初始化(通过调用 CoInitializeSecurity)默认使用进程凭据。所以它失败的原因是因为调用 COM/DCOM 时使用了默认进程安全毯,如果你不想为进程应用不同的安全设置,你必须在进程的早期调用 CoInitializeSecurity(至少在您第一次调用 COM/DCOM 之前)。 我再次尝试了您的建议,因为该应用程序现在作为服务在 nt-authority\system-account 下运行。我模拟了“新凭据”标志(也使用其他标志作为测试)并指定了管理员用户的凭据。尝试连接到服务时,我仍然收到 E_ACCESSDENIED

以上是关于访问远程计算机上的虚拟磁盘服务 - UnauthorizedAccessException的主要内容,如果未能解决你的问题,请参考以下文章

搭建FTP服务

什么是虚拟目录

python之网络编程

远程访问虚拟主机[关闭]

为何用了锐起客户端,虚拟磁盘无法访问

远程桌面是什么 Windows电脑用什么远程桌面工具