Process.StartInfo.Username пусто - PullRequest
       2

Process.StartInfo.Username пусто

0 голосов
/ 05 декабря 2018

Я запускаю процесс с помощью

Process app = new Process();
app.StartInfo.UseShellExecute = false;
app.StartInfo.FileName = path;
app.StartInfo.Domain = "Domain";
app.StartInfo.UserName = "userName";

string password = "Password";
System.Security.SecureString ssPwd = new System.Security.SecureString();

for (int x = 0; x < password.Length; x++)
{
    ssPwd.AppendChar(password[x]);
}

password = "";

app.StartInfo.Password = ssPwd;
app.Start();

Затем я подтверждаю, что он запущен:

private bool IsRunning(string name)
{
    Process[] processlist = Process.GetProcesses();

    if (Process.GetProcessesByName(name).Length > 0)
    {
        string user = Process.GetProcessesByName(name)[0].StartInfo.UserName; 
        log.Debug("Process " + name + " is running by : " + user);

        return true;
    }
    else
    {
        return false;
    }
}

Я возвращаюсь true и нахожу процесс, но UserNameпустой.Это почему?

Я также нашел некоторый код, чтобы получить владельца Процесса, но когда я его использую, владелец также становится пустым.

public string GetProcessOwner(int processId)
{
    string query = "SELECT * FROM Win32_Process WHERE ProcessID = " + processId;
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    ManagementObjectCollection processList = searcher.Get();

    foreach (ManagementObject obj in processList)
    {
        string[] argList = new string[] { string.Empty, string.Empty };
        int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList));

        if (returnVal == 0)
        {
            // return DOMAIN\user
            return argList[1] + "\\" + argList[0];
        }
    }

    return "NO OWNER";
}

Пожалуйста, объясните мне, почему это так?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Я пробовал использовать решение с использованием WinAPI

Вы получите "NO OWNER", когда приложение, которое вы пытаетесь получить владельцем, не запускается с правами администратора. Проверьте, запустив ваше приложение с правами администратора

0 голосов
/ 11 декабря 2018

Это по замыслу;при запросе информации о Process через, например.GetProcessesByName UserName не получается / разрешается.

GetProcessByName внутренне извлекает свою информацию через код ниже, создавая Process экземплярыиз полученных ProcesInfo данных.

  public static Process[] GetProcesses(string machineName) 
  {
        bool isRemoteMachine = ProcessManager.IsRemoteMachine(machineName);
        ProcessInfo[] processInfos = ProcessManager.GetProcessInfos(machineName);
        Process[] processes = new Process[processInfos.Length];
        for (int i = 0; i < processInfos.Length; i++) {
            ProcessInfo processInfo = processInfos[i];

            processes[i] = new Process(machineName, isRemoteMachine, processInfo.processId, processInfo);
        }

        return processes;
}


A ProcessInfo экземпляр не содержит никакой информации о пользователе / ​​владельце.

internal class ProcessInfo 
{
    public ArrayList threadInfoList = new ArrayList();
    public int basePriority;
    public string processName;
    public int processId;
    public int handleCount;
    public long poolPagedBytes;
    public long poolNonpagedBytes;
    public long virtualBytes;
    public long virtualBytesPeak;
    public long workingSetPeak;
    public long workingSet;
    public long pageFileBytesPeak;
    public long pageFileBytes;
    public long privateBytes;
    public int mainModuleId;
    public int sessionId;
}


закрытый конструктор класса Process принимает это ProcessInfo.

Поскольку ProcessStartInfo не было установлено, он создает единицу при извлечении, имея пусто UserName.

public string UserName {
    get { 
        if( userName == null) {
            return string.Empty;
        }
        else {        
            return userName;                     
        }
    } 
    set { userName = value; }
}

О коде GetProcessOwner;это вытекает из ответа на Как определить владельца процесса в C #? вопрос.

Это скорее другая WMI связанная тема;не получение информации о владельце может иметь отношение к разрешениям, как это предлагается в комментариях.
Для меня "это работает на моей машине" ...
Лучше начать отдельный вопрос для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...