使用非管理员帐户获取当前登录的用户 SID
Get current logged user SID with no-admin account
我正在开发 C# 应用程序。
要使应用程序运行,用户必须使用管理权限启动应用程序。
因此,如果没有管理员帐户的用户想要启动应用程序,他必须右键单击并选择 "Run as another user" 以使用管理员帐户进行身份验证。
问题是一旦用administrator账号登录,就无法取回no-admin用户的SID
当我这样做的时候:
WindowsIdentity.GetCurrent().User
是returns用户登陆的admin用户的SID,但是我想恢复administrator账号登陆的用户的SID
我找到了解决方案:)
我用Cassia找用户名:
ITerminalServicesManager manager = new TerminalServicesManager();
ITerminalServicesSession session = manager.CurrentSession;
和select all users匹配session.UserName
和session.DomainName
:
ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_Account where Name='" + session.UserName + "' AND Domain='" + session.DomainName + "'");
ManagementObjectCollection Users = mos.Get();
在 found the %appData% with user SID 之后:
// Get first user
ManagementObject[] arr = new ManagementObject[1];
Users.CopyTo(arr, 0);
ManagementObject User = arr[0];
// Found the %appData%
const string regValueLocalAppData = @"AppData";
const string regKeyShellFolders = @"HKEY_USERS$SID$\Software\Microsoft\Windows\" +
@"CurrentVersion\Explorer\Shell Folders";
var localAppDataPath = Microsoft.Win32.Registry.GetValue(regKeyShellFolders.Replace("$SID$", User["SID"].ToString()), regValueLocalAppData, null) as string;
// Check if %appData% is not empty// Le dossier %appData% existe
if (!string.IsNullOrWhiteSpace(localAppDataPath))
{
PathToRoaming = localAppDataPath;
}
也可以创建路径并检查它是否存在:
public string GetAppdataPath() {
string PathToRoaming = "";
ITerminalServicesManager manager = new TerminalServicesManager();
ITerminalServicesSession session = manager.CurrentSession;
// Get path to Users directory
Guid UserProfilesGuid = new Guid("0762D272-C50A-4BB0-A382-697DCD729B80");
IntPtr pPath;
SHGetKnownFolderPath(UserProfilesGuid, 0, IntPtr.Zero, out pPath);
string PathToUsers = System.Runtime.InteropServices.Marshal.PtrToStringUni(pPath);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(pPath);
// Build path
string PathToRoamingDir = String.Format("{0}\{1}\AppData\Roaming", PathToUsers, session.UserName);
if (Directory.Exists(PathToRoamingDir))
{
PathToRoaming = PathToRoamingDir;
}
}
[System.Runtime.InteropServices.DllImport("shell32.dll")]
static extern int SHGetKnownFolderPath([System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath);
我正在开发 C# 应用程序。
要使应用程序运行,用户必须使用管理权限启动应用程序。
因此,如果没有管理员帐户的用户想要启动应用程序,他必须右键单击并选择 "Run as another user" 以使用管理员帐户进行身份验证。 问题是一旦用administrator账号登录,就无法取回no-admin用户的SID
当我这样做的时候:
WindowsIdentity.GetCurrent().User
是returns用户登陆的admin用户的SID,但是我想恢复administrator账号登陆的用户的SID
我找到了解决方案:)
我用Cassia找用户名:
ITerminalServicesManager manager = new TerminalServicesManager();
ITerminalServicesSession session = manager.CurrentSession;
和select all users匹配session.UserName
和session.DomainName
:
ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_Account where Name='" + session.UserName + "' AND Domain='" + session.DomainName + "'");
ManagementObjectCollection Users = mos.Get();
在 found the %appData% with user SID 之后:
// Get first user
ManagementObject[] arr = new ManagementObject[1];
Users.CopyTo(arr, 0);
ManagementObject User = arr[0];
// Found the %appData%
const string regValueLocalAppData = @"AppData";
const string regKeyShellFolders = @"HKEY_USERS$SID$\Software\Microsoft\Windows\" +
@"CurrentVersion\Explorer\Shell Folders";
var localAppDataPath = Microsoft.Win32.Registry.GetValue(regKeyShellFolders.Replace("$SID$", User["SID"].ToString()), regValueLocalAppData, null) as string;
// Check if %appData% is not empty// Le dossier %appData% existe
if (!string.IsNullOrWhiteSpace(localAppDataPath))
{
PathToRoaming = localAppDataPath;
}
也可以创建路径并检查它是否存在:
public string GetAppdataPath() {
string PathToRoaming = "";
ITerminalServicesManager manager = new TerminalServicesManager();
ITerminalServicesSession session = manager.CurrentSession;
// Get path to Users directory
Guid UserProfilesGuid = new Guid("0762D272-C50A-4BB0-A382-697DCD729B80");
IntPtr pPath;
SHGetKnownFolderPath(UserProfilesGuid, 0, IntPtr.Zero, out pPath);
string PathToUsers = System.Runtime.InteropServices.Marshal.PtrToStringUni(pPath);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(pPath);
// Build path
string PathToRoamingDir = String.Format("{0}\{1}\AppData\Roaming", PathToUsers, session.UserName);
if (Directory.Exists(PathToRoamingDir))
{
PathToRoaming = PathToRoamingDir;
}
}
[System.Runtime.InteropServices.DllImport("shell32.dll")]
static extern int SHGetKnownFolderPath([System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath);