gpt4 book ai didi

c# - Process.StartInfo.Username 为空

转载 作者:太空狗 更新时间:2023-10-29 21:07:45 26 4
gpt4 key购买 nike

我开始一个流程

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";
}

请你解释一下为什么会这样?

最佳答案

这是设计使然;通过例如请求有关 Process 的信息时。 GetProcessesByName 未检索/解析 UserName

GetProcessByName通过 the code 在内部检索其信息下面,从获得的 ProcesInfo 数据构造 Process 实例。

  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;
}


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;
}


private constructor Process 类接受此 ProcessInfo

因为没有设置ProcessStartInfo,它instantiates one在检索时,有一个 empty UserName .

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

关于GetProcessOwner代码;这是对 How do I determine the owner of a process in C#? 的回答的结果问题。

这是一个与 WMI 相关的主题;未收到任何所有者信息可能与评论中建议的权限有关。
对我来说,“它可以在我的机器上运行”......
最好为此单独提出一个问题。

关于c# - Process.StartInfo.Username 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53629389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com