3

サービス アプリケーションからローカル Windows システム上のすべてのユーザーのデスクトップ フォルダーへのパスを列挙する必要があります。問題は、一部のユーザーがその時点でログインしていない可能性があることです。それで、それを行うためのAPIまたは他の方法はありますか?

EDIT1:最初の段落を読んでいない人のために繰り返します-ユーザーアカウントへのトークンを持っていないため、ユーザーはその時点でログインしていない可能性があります。

EDIT2:アプリケーションでサポートされている機能をオフにする前、またはアプリをアンインストールする前に、ユーザーのデスクトップからショートカットを削除するためにこれが必要です。

4

2 に答える 2

0

これが私がこれまでに思いついた最良の方法です。それで、英語以外のWindowsがインストールされている人がこれをチェックしてくれたら幸いです。

(簡潔にするために、疑似コードのみを投稿しています。)

1-以下のすべての手順は、ローカルサービスアプリケーションから実行されます。

2-すべてのユーザープロファイルへのパスを取得するには、キー内のサブフォルダーを列挙し、それらから値HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileListを読み取りProfileImagePathます。各ユーザーアカウントのプロファイルパスを提供します。

3-デスクトップのフォルダー名を取得するには、サービスアプリからキーからDesktop値を読み取りHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Foldersます(はい、HKCUは奇妙に聞こえますが、うまくいきました)。その後、%USERPROFILE%環境変数を使用して、環境変数のパスを取得します。 API。したがって、次のような2つのパスが得られます。

C:\Windows\system32\config\systemprofile\Desktop

C:\Windows\system32\config\systemprofile

次に、大文字と小文字を区別しない比較を使用して、2番目の文字列を1番目の文字列から分離すると、デスクトップのフォルダ名(この場合は「\ Desktop」)が取得されます。

4-デスクトップフォルダを手順2で取得したパスに追加して、そのユーザーのデスクトップフォルダへのフルパスを作成します。

于 2012-12-15T01:36:20.007 に答える
0

userenv.h から: GetProfilesDirectory (win2k+、iirc)

msdn.microsoft.com/en-us/library/windows/desktop/bb762278(v=vs.85).aspx

これを使用して、すべてのローカル ユーザー アカウント プロファイル ディレクトリを含むディレクトリを検索します。

デスクトップ フォルダを見つけるには:

Shlobj.h : SHGetKnownFolderPath (vista+)

msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx

既知のフォルダー ID として FOLDERID_Desktop が必要です。このシンボルは、Knownfolders.h で宣言されています。

msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx

これらを使用すると、レジストリを直接読み取らずに、目的に近づくことができます。もちろん、これは、GetProfilesDirectory 内のフォルダー リストから推測する以外に、ユーザーを列挙する洗練された方法には当てはまりません。おそらく、ローカル ユーザーを列挙するためのより API に適した方法があります。

第二に、これはサービスの目的によって異なりますが、おそらく「allusers」プロファイルを使用することで、ローカル ユーザーの現在のリストを知る必要がなくなります。

于 2012-12-15T02:27:57.233 に答える