2012-01-19 12 views
4

システムのすべての管理者のために、自分のアプリケーションにデスクトップショートカットを作成する必要があります。 次のコードを使用してユーザーリストを取得しています。C#のすべての管理者のデスクトップパスを取得する

 var identifier = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null); 
     GroupPrincipal group = GroupPrincipal.FindByIdentity(new PrincipalContext(ContextType.Machine), identifier.Value); 

     foreach (Principal principal in group.Members) 
     { 
      Console.WriteLine(principal.Name); 
     } 

私は何とか各ユーザーのデスクトップパスを取得する必要があります。解決策を教えていただけますか?どうもありがとう。

+0

マシン上のすべてのユーザーを前もって反復する必要がありますか、ユーザーがログインするときにショートカットを動的に作成できますか? –

+0

アプリをインストールした後に誰かがAdministratorsグループに追加されるとどうなりますか?ショートカットはいつ作成されますか?代わりに、パブリックデスクトップフォルダにショートカットを追加して(すべてのユーザーが参照できるように)、マニフェストを使用して管理者権限を必要とする(Vista以降を前提とする)。 – shambulator

+0

動的ではなく、反復してショートカットを作成するだけです。 – rapt0r

答えて

0

あなたは、あなたがしているユーザーを表すアクセストークンを渡すことができますSHGetFolderLocation機能を(http://msdn.microsoft.com/en-us/library/bb762180.aspx)のPInvokeしたいと思います

どれくらい難しいかわかりません。

+0

私はちょうどこの機能を尋ねて、ユーザートークンを取得する方法を見つけようとしています。 – rapt0r

+2

パスワードまたは既存の偽装コンテキストを持たないユーザートークンを取得する唯一の方法は、LsaLogonUser関数を呼び出すことです。正当な理由から、SeTcbPrivilege(これはオペレーティングシステムの一部として機能する)を持っていなければなりません。デフォルトではLocalSystemとして実行されます(このルートをダウンすることを決定する前に非常に注意深く考えてください)。 SHGetKnownFolderPathとそれ以前の従兄弟も、ユーザーのレジストリハイブをロードする必要があることを指定します。これは、トークンを必要とする別の操作であるLoadUserProfileを呼び出すことを意味します。私は本当に公開のショートカットと管理マニフェストに行くだろう。 – shambulator

-3

どのようにしたいかによって、いくつかのオプションがあります。

オプションA:

ハードコーディングされたが、それはデフォルトのシステム・セットアップ

var userDirectory = Path.Combine("C:\Users\", principal.Name, "\Desktop"); 

オプションBのために働く:

var currentUser = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); 
var newUser = currentUser.Replace("MyUser", principal.Name); 
それをスワップアウトした後、現在のユーザーの検索

オプションBは完全にテストされていませんが、動作するはずです。

+0

これはデフォルトのデスクトップの場所でのみ動作しますが、デスクトップパスをD:\ MyDesktopなどに変更できます。 – rapt0r

+0

2行目のオプションBが必要な理由を理解していませんか? –

+0

オプションBは、特別なフォルダを移動したユーザーに対しては機能しません。私は非システムボリュームに私のすべてを移動しました。なぜならそれが私の自由空間の大部分であるからです。 – shambulator

関連する問題