2012-02-18 5 views
2

現在の実行中のWindowsの識別子GUIDには、ブート構成データストアからc#を使用してアクセスできる必要があります。これは、コマンドラインの実行から返されます。C#を使用してWindows 7のブート構成データにアクセスする

bcdedit /enum {current} /v 

私が持っている問題は、C#で、私は直接、私はは、bcdeditがないと言われています(プログラムは管理者として実行されているにもかかわらず)このコマンドを実行しようとするということです存在しない。私が使用しています:

ProcessStartInfo procStartInfo = new ProcessStartInfo("bcdedit.exe", "/enum {current} /v"); 

を私が研究している他の事は、WMIを使用しているが、そうすることに、私が持っている唯一の参照は非常に参考にされていないhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa362673(v=vs.85).aspxです。

私がbcdeditを使用する必要はなく、代わりにネイティブWMIクラスを使用できる最適な解決策があります。 C#を使用して現在のWindowsブートローダーIDをどのように見つけることができますか?

+0

'ProcessStartInfo procStartInfo =新しいProcessStartInfo(" cmd "、"/c "bcdedit/enum {現在}/v \" "))'。 –

+0

私もそれを試みましたが、cmdは管理者の代わりに通常のユーザーとして実行されるため、bcdeditが見つかりませんでした。私はコードにユーザー名とパスワードを入れて管理者として実行させることができましたが、それは私たちが望むものではありません。また、これはユーザー名とパスワードが異なる場合があるマシン全体で使用されます。 –

+0

質問からのコードで 'procStartInfo.UseShellExecute = true;'を試しましたか? –

答えて

8

そこには多くの問題に直接Bcdedit.exeをアクセスしているようだが、私はBcdStoreにアクセスするためにC#でWMIを使用する方法を見つけ出すことができました:

ConnectionOptions connectionOptions = new ConnectionOptions(); 
connectionOptions.Impersonation = ImpersonationLevel.Impersonate; 
connectionOptions.EnablePrivileges = true; 

// The ManagementScope is used to access the WMI info as Administrator 
ManagementScope managementScope = new ManagementScope(@"root\WMI", connectionOptions); 

// {9dea862c-5cdd-4e70-acc1-f32b344d4795} is the GUID of the System BcdStore 
ManagementObject privateLateBoundObject = new ManagementObject(managementScope, new ManagementPath("root\\WMI:BcdObject.Id=\"{9dea862c-5cdd-4e70-acc1-f32b344d4795}\",StoreFilePath=\"\""), null); 

ManagementBaseObject inParams = null; 
inParams = privateLateBoundObject.GetMethodParameters("GetElement"); 

// 0x24000001 is a BCD constant: BcdBootMgrObjectList_DisplayOrder 
inParams["Type"] = ((UInt32)0x24000001); 
ManagementBaseObject outParams = privateLateBoundObject.InvokeMethod("GetElement", inParams, null); 
ManagementBaseObject mboOut = ((ManagementBaseObject)(outParams.Properties["Element"].Value)); 

string[] osIdList = (string[]) mboOut.GetPropertyValue("Ids"); 

// Each osGuid is the GUID of one Boot Manager in the BcdStore 
foreach (string osGuid in osIdList) 
{ 
    ManagementObject currentManObj = new ManagementObject(managementScope, new ManagementPath("root\\WMI:BcdObject.Id=\"" + osGuid + "\",StoreFilePath=\"\""), null); 
      MessageBox.Show("" + currentManObj.GetPropertyValue("Id")); 
} 

これは、内のすべてのWindowsブートマネージャーのGUIDを取得しますBcdStoreを呼び出し、それらをMessageBoxに表示します。正しいConnectionOptionsが必要であり、このプログラムを管理者として実行する必要があることに注意してください。 (前述の定数を除く)BcdStoreで動作するようにC#コードのすべてを持っているhttp://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=19208:で、彼のプロジェクトのためのBCD定数を見つけるためにhttp://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=18233とトラン・ディンホップへ:

彼のプロジェクトのためのロス・ジョンストンのおかげで。

更新:

使用:

ManagementObject privateLateBoundObject = new ManagementObject(managementScope, new ManagementPath("root\\WMI:BcdObject.Id=\"{fa926493-6f1c-4193-a414-58f0b2456d1e}\",StoreFilePath=\"\""), null); 

は、現在、実行中のWindowsブートマネージャのためのBcdObjectを取得します。あなたが呼び出す場合:

currentManObj.GetPropertyValue("Id") 

を、あなたは異なっているWindowsブートマネージャを実行して、現在のGUIDを取得します「{fa926493-6f1c-4193-a414-58f0b2456d1e}」現在のブートへのリンクですマネージャー。

Microsoft Scripting Guysとそのプロジェクト:http://technet.microsoft.com/en-us/magazine/2008.07.heyscriptingguy.aspx?pr=blogのおかげで、現在のブートマネージャーにリンクするGUID定数を持つことができます。

+1

うわー、私はこのことに関する「インターウェブ」に関する情報がどれほど驚いているのですか?私はすべてを一緒に作ろうとしている。 これを使用して、安全モードから通常モードに切り替えることを試みています。どんな提案も大歓迎です。 私はコマンドラインbcdeditを使用したくないです。純粋にC#です。 – Vippy

+0

BCD WMIプロバイダを使用し、L-Williamsの助けを借りて、BCDを安全モードに設定する正確なコードが必要でした:http://stackoverflow.com/questions/25295117/use-c-sharp-bcd-wmi -provider-to-safeboot-windows – Vippy

+0

メソッド呼び出し後に簡単な印刷コードでPrintDocumentを使用するとエラーが発生します。 "デフォルトのプリンタが設定されていません。"そして、「プリンタはインストールされていません。 これを解決するには? – user2241289

5

%systemroot%\ system32には64ビットのbcdedit.exeしかありません。あなたのアプリが32ビットの場合、WOW64層がsystem32 \ディレクトリをsyswow64に再マップするので、64ビットbcdeditを起動することはできません。間違いなくWMIインターフェイスを使用することをお勧めします。

関連する問題