2012-04-20 137 views
0

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

这是我的代码:

 // 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。

运行Windows 7,这两款机器

谢谢!

回答

0

您需要登录到远程计算机并在那里模拟具有适当权限的用户。为此,请使用LogonUserLOGON32_LOGON_NEW_CREDENTIALS登录类型,使用生成的令牌构建Windows身份并假冒它。见例如这个问题Get impersonated user name的样本。

+0

谢谢,我会试一试 – torno 2012-04-23 07:20:47

+0

我发现这个:初始化DCOM安全性和模拟... <是不同的>原因是DCOM 安全性由CLR(通过调用CoInitializeSecurity)来初始化以使用默认情况下,流程凭证为 。所以它失败的原因是因为 调用COM/DCOM时使用默认的进程安全区域,如果你想要为进程应用不同的安全装置,你将必须在过程的早期调用CoInitializeSecurity (至少在您的 首次调用COM/DCOM之前)。 – torno 2012-04-23 09:49:18

+0

我再次尝试了您的建议,因为该应用现在作为nt-authority \ system-account下的服务运行。我冒充了“新凭据”标志(还使用其他标志作为测试)以及管理员用户的指定凭证。尝试连接到服务时,我仍然收到E_ACCESSDENIED – torno 2012-07-23 13:51:32

相关问题