我尝试访问远程计算机上的虚拟磁盘服务(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。
谢谢!
答案 0 :(得分:0)
您需要登录到远程计算机并模拟具有相应权限的用户。为此,使用LogonUser
和LOGON32_LOGON_NEW_CREDENTIALS
登录类型,使用生成的令牌构建Windows标识并模拟它。参见例如这个问题Get impersonated user name是一个样本。