利用WMI及C#的支援,如果取得遠端電腦的具有權限的帳號,即可在不用登入的情況下,執行遠端電腦的程式。
//先加入System.Management的參考
Using System.Management;//引用
/// <summary>
/// 建立遠端連線選項
/// </summary>
/// <param></param>
/// <param></param>
/// <returns></returns>
static ConnectionOptions GetOptions(string username, string pwd)
{
// 建立遠端連線選項
ConnectionOptions options = new ConnectionOptions();
options.Username = username; // 使用者名稱
options.Password = pwd; // 使用者密碼
options.Authentication = AuthenticationLevel.Default; // 認證模式設定 (採用預設)
options.Impersonation = ImpersonationLevel.Impersonate; // 設定 COM 模擬等級
options.EnablePrivileges = true; // 是否需要使用者的權限才能啟動命令
//options.Authority = "ntdlmdomain:DOMAIN";
return options;
}
//啟動某個命令
static uint
ExecuteCommand(string Command, string RemoteNameIP, string
username, string pwd)
{
uint intProcessID = 0;//等等要取得的ProcessID
ConnectionOptions options = GetOptions(username, pwd);//建立遠端的帳密
//啟動命令的作業範圍
ManagementScope scope = new ManagementScope(string.Format(@"\\{0}\root\cimv2", RemoteNameIP), options);
scope.Connect();//啟動連線,如果是本機,可以不需要options的參數
if (scope.IsConnected)//因為WMI可以手動關閉,所以要偵測連線
{
//指定WMI
ManagementPath MP = new ManagementPath("Win32_Process");//要先知道命令的大類
//實體化
using (ManagementClass classObj = new ManagementClass(scope, MP, null))
{
//取得方法的參數
ManagementBaseObject inputArgs = classObj.GetMethodParameters("Create");//方法的名稱可事前用classObj.Methods.GetEnumerator()方法得知
inputArgs["CommandLine"] = Command;
//inputArgs["CurrentDirectory"] = string.Empty;
//inputArgs["ProcessStartupInformation"] = string.Empty;
//觸發命令
ManagementBaseObject outParams = classObj.InvokeMethod("Create", inputArgs, null);
object ProcessId = outParams.Properties["ProcessId"].Value;
object ReturnValue = outParams.Properties["ReturnValue"].Value;
intProcessID = (uint)(ProcessId);
}
}
return intProcessID;
}
static uint TerminateProcess(uint ProcessID, string RemoteNameIP, string username, string pwd)
{
uint uintReturnValue = 0;
ConnectionOptions options = GetOptions(username, pwd);
//啟動命令的作業範圍
ManagementScope scope = new ManagementScope(string.Format(@"\\{0}\root\cimv2", RemoteNameIP), options);
scope.Connect();
if (scope.IsConnected)
{
//指定WMI
ObjectQuery objectquery = new ObjectQuery(string.Format("SELECT * From Win32_Process Where ProcessID = '{0}'", ProcessID));
ManagementObjectSearcher query = new ManagementObjectSearcher(scope, objectquery);
ManagementObjectCollection queryCollection = query.Get();
foreach (ManagementObject mo in query.Get())
{
object ReturnValue = mo.InvokeMethod("Terminate", null);
if (ReturnValue != null)
uintReturnValue = (uint)ReturnValue;
}
}
return uintReturnValue;
}
參考資料:
中文
- WMI 101 2006 年 3 月 15 日 http://www.microsoft.com/taiwan/technet/columns/profwin/24-wmi.mspx#EBB
- WMI Code Creator自動產生WMI的程式碼 http://www.dotblogs.com.tw/jeff-yeh/archive/2009/11/11/11530.aspx
英文
- WMI Start Page http://msdn.microsoft.com/en-us/library/aa394582.aspx
- WMI Code Creator v1.0 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en
留言列表