我目前正在尝试使用C#中的WMI在远程计算机上启动进程。该进程读取和写入存储在单独服务器上的文件。
当我手动登录到远程计算机时,我可以运行该过程并且一切正常。
但是,当我尝试使用WMI从本地计算机上启动远程进程时,出现以下错误:
System.UnauthorizedAccessException: Access to the path '\\server\path\input.txt' is denied.
我尝试了多种连接选项,但我不确定如何重新创建我手动登录时似乎拥有的权限...我需要做什么?
本地机器代码
static void LaunchRemoteProcess(string remoteMachine, string command)
{
ConnectionOptions connectionOptions = new ConnectionOptions
{
Impersonation = ImpersonationLevel.Impersonate,
EnablePrivileges = true
};
var managementScope = new ManagementScope(string.Format(@"\\{0}\root\cimv2", remoteMachine), connectionOptions);
managementScope.Connect();
var managementPath = new ManagementPath("Win32_Process");
var objectGetOptions = new ObjectGetOptions();
var managementClass = new ManagementClass(managementScope, managementPath, objectGetOptions);
// Launch the command asynchronously
var inParams = managementClass.GetMethodParameters("Create");
inParams["CommandLine"] = command;
var outParams = managementClass.InvokeMethod("Create", inParams, null);
}
远程机器代码
string networkPath = @"\\server\path";
string inputFile = "input.txt";
string inputText = File.ReadAllText(Path.Combine(networkPath, inputFile));
string outputFile = "output.txt";
File.WriteAllText(Path.Combine(networkPath, outputFile), inputText);
修改1
如果我手动登录到远程计算机并且进程仍然失败并且出现相同的错误,我已经尝试使用该进程有效的用户凭据:
ConnectionOptions connectionOptions = new ConnectionOptions
{
Username = "username",
Password = "password",
Authority = "ntlmdomain:COMPANYNAME.CO.UK,
EnablePrivileges = true
};
我遗漏了与Authority
,Authentication
或Impersonation
属性有关的内容吗?
答案 0 :(得分:2)
模拟与委派
您的WMI代码使用模拟,因此服务器端在调用客户端代码的用户的安全上下文中运行。但这仅在服务器本身有效,而不是用于访问例如远程CIFS共享(如您的情况)。
你必须使用委托。
首先,改变
Impersonation = ImpersonationLevel.Impersonate,
到
Impersonation = ImpersonationLevel.Delegate,
如果您收到例外,则委派尚未在您的环境中运行。
检查:
呼叫用户帐户:"帐户敏感,无法委派"不得在用户属性(Active Directory用户和计算机)
服务器计算机帐户:"信任此计算机以便委派任何服务..."必须检查
服务器上的本地安全策略:"使计算机和用户帐户可信任以进行委派"必须包括主叫用户。
见
https://msdn.microsoft.com/en-us/library/aa389288%28VS.85%29.aspx
有关此主题的更多信息。
补充:(见下面的评论):
如果Delegate
不适用于您的环境(例如,群组政策不允许这样做,并且您无权更改它们),您可以检查其他一些替代方法。
你可能听说过psexec。
或者,几年前我做过的,多年来在一些服务器上的企业环境中生产的非常成功:
我创建了一个计划任务,启动程序并为此任务设置技术用户+密码。该任务已配置为"在2200年运行一次: - )"。
然后我在队列中编写命令(我使用了一个简单的命令文件)并从远程计算机启动任务。
这样做,不需要委派,因为计划任务本身以技术用户帐户登录("登录为批处理"需要委托)。
答案 1 :(得分:0)
正如原因所述,您在PC上使用的用户ID似乎无法访问另一台计算机的位置(虽然它是服务器,但它是其他计算机)。
您可以访问您的用户ID或使用模拟来使用已有权访问该位置的用户ID。
在此处查找更多详情:https://msdn.microsoft.com/en-us/library/w070t6ka%28v=vs.110%29.aspx
已编辑:也添加用户名密码。这可能有所帮助。