Я не могу прочитать определенные значения реестра с помощью PowerShell в C#. Вот код:Невозможно прочитать значение реестра с использованием PowerShell в C#
Вызов функции: определение
public static string UserDisplayName()
{
// PowerShell Command: (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData\1').LoggedOnDisplayName
return GetPowerShellOutputString(@"(Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData\1').LoggedOnDisplayName");
}
Функция:
private static string GetPowerShellOutputString(string PsCmd)
{
try
{
string PsOut = string.Empty;
Debug.Write("PsCmd: " + PsCmd + "; ");
Runspace rs = RunspaceFactory.CreateRunspace();
rs.Open();
Pipeline pipeline = rs.CreatePipeline();
pipeline.Commands.AddScript(PsCmd);
Collection<PSObject> results = pipeline.Invoke();
rs.Close();
foreach (PSObject obj in results)
if (obj != null) PsOut += obj.ToString() + ", ";
PsOut = (PsOut == string.Empty) ? strUnavailableString : PsOut.TrimEnd(',', ' ');
Debug.WriteLine("PsOut: " + PsOut);
return PsOut;
}
catch (Exception ex)
{
Debug.WriteLine("! " + ex.Message + ex.InnerException + "\n");
return strUnavailableString;
}
}
Однако такое же определение функции работает отлично, если я пытаюсь прочитать любое другое значение реестра, например:
public static string UserOUPath()
{
try
{
if (UserDomain() == SystemInformation.ComputerName) return strUnavailableString; // Non-domain account
//For consistant performance, grab OU from registry instead of AD.
string userSID = WindowsIdentity.GetCurrent().User.ToString();
string ouPath = @"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\" + userSID;
string ou = GetPowerShellOutputString("(Get-ItemProperty -Path '" + ouPath + "').'Distinguished-Name'");
ou = ou.Remove(0, ou.IndexOf(",", 0) + 1); // Drop leading CN stuff
ou = ou.Remove(ou.IndexOf(",DC=", 0), ou.Length - ou.IndexOf(",DC=", 0)); // Drop trailing DC stuff
ou = ou.Replace(",OU=", "/");
ou = ou.Replace("OU=", "/");
ou = FlipOU(ou);
if (ou == null) throw new NullReferenceException();
return ou;
}
catch
{
return strUnavailableString;
}
}
Для первого вызова (UserDisplayName()), когда я делал режим отладки, результаты объект возвращается null. Однако, если я запускаю ту же команду PowerShell в окне PowerShell, она дает значение.
Я наткнулся на это, поскольку я не могу понять, почему и что происходит?
* «прочитайте определенные значения реестра, используя PowerShell в C#» * Вы что? Зачем? Не можете ли вы прочитать значения реестра с помощью методов C#? – Tomalak
Я вижу это раз за разом здесь. Если вы работаете в C#, USE C# и это .net-классы. PowerShell медленный и сложный, и он использует те же .Net-классы, что вы можете получить доступ непосредственно к C# намного проще и быстрее. –
Зачем вам это делать !? Вы передаете * PowerShell * скрипт в * C# *, который * уже имеет * намного лучшую функциональность для чтения значений реестра! Вы слишком усложняете это. – tnw