由于工作需要,在给公司做的一款小软件在启动后需要在所有客户机器上创建快捷方式
以便用户使用.由于公司内部机器的多样性,有台式机有笔记本,并且公司有域控,台式机大部分
加入到域中,但并不是所有台式机均加入到域.因此每台电脑的环境就有很大差距,权限也有很
大的不同.所以安装当前软件就需要为每台机器的所有用户创建快捷方式.
一般情况下为用户创建应用程序快捷方式使用的方式为
System.Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory)
此种方式返回当前用户的桌面路径.经过几番查找并未发现.net平台提供获取本机All User用户桌面路径
的方法.因此没有办法只能借助与一些windows自带的dll来进行操作.
在此我使用的是shfolder.dll 此dll在百度百科中的解释是"shfolder.dll是Windows特殊文件夹相关服
务模块,例如我的文档。属于: Microsoft Windows "
代码如下:
#region
说明
// CSIDL_COMMON_DESKTOPDIRECTORY、CSIDL_COMMON_STARTMENU、CSIDL_COMMON_STARTUP
// CSIDL_DESKTOPDIRECTORY、CSIDL_STARTMENU、CSIDL_STARTUP
// 上面分别为公共用户和当前用户的桌面、开始菜单、启动菜单的目录
// SHGetFolderPath方法根据参数"nFolder"不同值获取机器相应文件夹路径,值返回到参数"lpszPath"
#endregion
[DllImport( " shfolder.dll " , CharSet = CharSet.Auto)]
private static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, int dwFlags, StringBuilder lpszPath);
private const int MAX_PATH = 260 ;
private const int CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019 ;
private const int CSIDL_COMMON_STARTMENU = 0x0017 ;
/// <summary>
/// 获取本机All User桌面路径(C:\Documents and Settings\All Users\桌面)
/// </summary>
/// <returns></returns>
public static string GetAllUsersDesktopFolderPath()
{
StringBuilder sbPath = new StringBuilder(MAX_PATH);
SHGetFolderPath(IntPtr.Zero, CSIDL_COMMON_DESKTOPDIRECTORY, IntPtr.Zero, 0 , sbPath);
return sbPath.ToString();
}
/// <summary>
/// 获取本机All User开始程序路径(C:\Documents and Settings\All Users\「开始」菜单\程序)
/// </summary>
/// <returns></returns>
public static string GetAllUsersStartMenuPath()
{
StringBuilder sbPath = new StringBuilder(MAX_PATH);
SHGetFolderPath(IntPtr.Zero, CSIDL_COMMON_STARTMENU, IntPtr.Zero, 0 , sbPath);
return sbPath.ToString();
}
// CSIDL_COMMON_DESKTOPDIRECTORY、CSIDL_COMMON_STARTMENU、CSIDL_COMMON_STARTUP
// CSIDL_DESKTOPDIRECTORY、CSIDL_STARTMENU、CSIDL_STARTUP
// 上面分别为公共用户和当前用户的桌面、开始菜单、启动菜单的目录
// SHGetFolderPath方法根据参数"nFolder"不同值获取机器相应文件夹路径,值返回到参数"lpszPath"
#endregion
[DllImport( " shfolder.dll " , CharSet = CharSet.Auto)]
private static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, int dwFlags, StringBuilder lpszPath);
private const int MAX_PATH = 260 ;
private const int CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019 ;
private const int CSIDL_COMMON_STARTMENU = 0x0017 ;
/// <summary>
/// 获取本机All User桌面路径(C:\Documents and Settings\All Users\桌面)
/// </summary>
/// <returns></returns>
public static string GetAllUsersDesktopFolderPath()
{
StringBuilder sbPath = new StringBuilder(MAX_PATH);
SHGetFolderPath(IntPtr.Zero, CSIDL_COMMON_DESKTOPDIRECTORY, IntPtr.Zero, 0 , sbPath);
return sbPath.ToString();
}
/// <summary>
/// 获取本机All User开始程序路径(C:\Documents and Settings\All Users\「开始」菜单\程序)
/// </summary>
/// <returns></returns>
public static string GetAllUsersStartMenuPath()
{
StringBuilder sbPath = new StringBuilder(MAX_PATH);
SHGetFolderPath(IntPtr.Zero, CSIDL_COMMON_STARTMENU, IntPtr.Zero, 0 , sbPath);
return sbPath.ToString();
}
使用时直接调用相应方法GetAllUsersDesktopFolderPath()或 GetAllUsersStartMenuPath()
即可获得路径.