1

「 HKLM\Software\Microsoft\Ole\DefaultLaunchPermission 」の REG_BINARY 値をデコードして、どのユーザーがデフォルトで権限を持っているかを確認する方法を見つけようとしています。可能であれば、他のユーザーをユーザー名で追加できる方法.

仕事では DCOM を使用し、ほとんどの場合、常に同じユーザーに許可を与えますが、場合によっては、クライアントに対応し、ニーズに合わせてカスタム ユーザー/グループを追加する必要があります。残念ながら、追加する必要があるカスタム ユーザーはランダムなユーザー名であるため、95% の確率で使用するデフォルト ユーザーで行ったように、すべてのユーザーを追加してキーから値をコピーすることはできません。

現在、事前定義されたユーザーのアクセス許可を設定するコマンドがあるコマンドライン実行可能アプリケーションに取り組んでいますが、カスタム ユーザーを追加してデフォルトのアクセス許可に追加するオプションも追加できるようにしたいと考えています。事前定義されたデフォルトのユーザー リストとともに。

現在、アプリケーションでデフォルトのユーザー リストを設定するには、次のように入力します。

MyTool.exe ポリシー

しかし、もう少し冗長にして、Windows ユーザーが NET コマンドを使用する方法に近づけたいと思います。たとえば、次のようになります。

MyTool.exe ポリシー /ADD:"MyCustomUsername"

問題は、REG_BINARY 値に格納されているデータを簡単にデコードできないように見えることです。Python で 16 進部分をデコードできましたが、最初にどのようなエンコーディングが使用されたのかさえわからないため、どうすればよいか分からないある種のバイナリ データが残っています。それをデコードするために何を使用するかを知っています。:P

私はかなりのグーグルをしましたが、このトピックに関する用語を理解していないために、答えが何であるかを認識せずに答えを見落としている可能性があると思います.

私の最初の本当の質問は、16進数からデコードされた後、上記のキーにどのようなエンコードが使用されているかということであると思いますか?

さらに良いことに、キーの値をプログラムで取得/変更して、現在設定されているユーザーのリストを取得し、必要に応じて追加のユーザー/グループを追加することもできますか?

可能であれば、このアプリケーションを厳密に Python (または WMI/WMIC) で記述したままにしておくことをお勧めしますが、必要に応じて、他のタイプのコードを Python アプリケーションに実装することを試みることができます。また、このアプリケーションは主に Windows XP Professional とほとんどの Windows Server バージョンで使用されていることを言及しておくと便利だと思います。そのため、考えられる解決策が以前の Windows OS バージョンと互換性がないかどうかは心配していません。

このトピックに慣れるための支援、コード、または簡単なヘルプをいただければ幸いです。

あなたが提供できる助けを前もってありがとう!! :D

4

2 に答える 2

2

.NET サービスによってホストされている COM サーバーをインストールするときに、同様の問題に遭遇しました。つまり、インストール ロジックの COM ACL をプログラムで変更したかったのです。クラスを使用して.NETで操作できるのは、バイナリACL形式にすぎないことがわかると思います。

System.Security.AccessControl.CommonSecurityDescriptor

申し訳ありませんが、Python ソリューションを取得するお手伝いができませんが、壁に背を向けて .NET を管理できる場合、サンプル コードは次のようになります。

int launchMask = (int) (COM_RIGHTS.EXECUTE | COM_RIGHTS.EXECUTE_LOCAL | COM_RIGHTS.ACTIVATE_LOCAL);

SecurityIdentifier sidAdmins = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
SecurityIdentifier sidInteractive = new SecurityIdentifier(WellKnownSidType.InteractiveSid, null);

DiscretionaryAcl launchAcl = new DiscretionaryAcl(false, false, 3);
launchAcl.AddAccess(AccessControlType.Allow, sidAdmins, launchMask, InheritanceFlags.None, PropagationFlags.None);
launchAcl.AddAccess(AccessControlType.Allow, sidInteractive, launchMask, InheritanceFlags.None, PropagationFlags.None);

CommonSecurityDescriptor launchSD = new CommonSecurityDescriptor(false,
                                                                    false,
                                                                    ControlFlags.DiscretionaryAclPresent | ControlFlags.SelfRelative,
                                                                    sidAdmins,
                                                                    sidAdmins,
                                                                    null,
                                                                    launchAcl);


byte[] launchPermission = new byte[launchSD.BinaryLength];
launchSD.GetBinaryForm(launchPermission, 0);

次に、起動許可のバイト配列を取得してレジストリに書き込みます。.NET がスターターでない場合は、少なくとも .NET クラスがどのように機能するかを見て、それらが使用する win32 関数を確認できます。リフレクターツールを使用して関連するアセンブリを確認するか、MSFT で実際に .NET ソースを公開することができます。

于 2009-04-22T02:04:35.517 に答える
0

REG_BINARY は特定の形式ではなく、データがカスタム バイナリ形式であることをレジストリに伝える方法にすぎません。ですから、そこに何が入っているかを知る必要があるというのは正しいです。

また、データを16進数から変換するとはどういう意味ですか? 開梱していますか?そもそもそこに何が保存されているかを知るまで、正しく解釈しているとは思えません。

そのレジストリ フィールドに何が入っているかがわかれば、python の struct モジュールが頼りになるでしょう。

http://docs.python.org/library/struct.html

さらに読む(おそらくすでにこれらを見たことがあるでしょう)

于 2009-04-22T01:39:33.737 に答える