C # WMI привилегии - PullRequest
       29

C # WMI привилегии

3 голосов
/ 30 июня 2011

Я искал многочисленные вопросы о том, как конвертировать VBS в C # и все такое хорошее.

Проблема, с которой я столкнулся, связана с кодом VBS (см. Ниже), когдапроцесс выполняется на удаленной машине, он запускается с учетной записью SYSTEM.
Когда я выполняю с C #, он запускается с моими учетными данными (или с кем бы то ни было, запускает программу C #).
VBS кажется более надежным в получении удаленных установокчтобы разобраться, для чего это мне нужно.

Я хотел переключиться на C #, чтобы я мог сделать более удобный графический интерфейс для программы.
Кто-нибудь знает, как заставить C # работатьWMI с учетной записью SYSTEM?

Код VBS:

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objScheduledJob = objWMIService.Get("Win32_ScheduledJob")
Set objSWbemDateTime = CreateObject("WbemScripting.SWbemDateTime")

'add the scheduled job to be run
objSWbemDateTime.SetVarDate(DateAdd(INTERVAL, MINUTES, Now()))
errReturn = objScheduledJob.Create(strCommand, objSWbemDateTime.Value, False, 0, 0, True, intJobID)

Код C #:

static public int RemoteAdmin(string remoteMachine, string runFile)
{
    try
    {
        ManagementPath run = new ManagementPath(@"\\" + remoteMachine + @"\root\cimv2:Win32_process");
        ManagementClass man = new ManagementClass(run);

        man.InvokeMethod("Create", new Object[] { runFile });
        return 0;
    }
    catch
    {
        MessageBox.Show("Error in remote execution");
        return 1;
    }
}

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

Вам необходимо настроить ConnectionOptions

ConnectionOptions wmiConnOpts = new ConnectionOptions();
wmiConnOpts.Impersonation = ImpersonationLevel.Impersonate;
wmiConnOpts.Authentication = System.Management.AuthenticationLevel.Default;
wmiConnOpts.EnablePrivileges = true;

ManagementScope wmiLoc = 
   new ManagementScope(String.Format(@"\\{0}\root\cimv2", remoteMachine ),
      wmiConnOpts);
ManagementPath wmiProcPath = new ManagementPath("Win32_ScheduledJob");
ManagementClass wmiProc = new ManagementClass(wmiLoc, wmiProcPath, null);
wmiProc.InvokeMethod("Create", new Object[] { runFile });
0 голосов
/ 11 июля 2011

Вероятно, это идиотская ошибка с моей стороны, но ошибка, которую я получал, заключалась в том, что я не указал время (в формате UTC) для запуска запланированного задания

    ConnectionOptions connOptions = new ConnectionOptions();
    connOptions.Impersonation = ImpersonationLevel.Impersonate;
    connOptions.Authentication = AuthenticationLevel.PacketPrivacy;
    connOptions.EnablePrivileges = true;
    ManagementScope manScope = new ManagementScope(String.Format(@"\\" + remoteMachine + @"\ROOT\CIMV2"), connOptions);
    manScope.Connect();
    ObjectGetOptions objectGetOptions = new ObjectGetOptions();
    ManagementPath managementPath = new ManagementPath("Win32_ScheduledJob");
    ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions);
    ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
    inParams["Command"] = runFile;
    string StartTime = DateTimetoUTC(DateTime.Now.AddMinutes(1));
    inParams["StartTime"] = StartTime;
    ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);   
...