1

C# で PowerShell を使用して特定のレジストリ値を読み取ることができません。コードは次のとおりです。

呼び出し機能:

    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 コマンドを実行すると、値が表示されます。

なぜ、何が起こっているのかわからないので、これに出くわしましたか?

4

1 に答える 1