none
使用CreateProcessWithLogonW()函数后如何隐藏管理员密码? RRS feed

  • 问题

  • 我的代码如下:
    #include "stdafx.h"
    #include "windows.h"
    #include "stdio.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	DWORD dw = GetLastError();
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    	ZeroMemory(&si, sizeof(si));
    	si.cb = sizeof(si);
    	ZeroMemory(&pi, sizeof(pi));
    
    	if (!CreateProcessWithLogonW(
    		L"administrator",
    		NULL,
    		L"6inOve",
    		LOGON_WITH_PROFILE,
    		L"C:\\Program Files (x86)\\综合业务平台客户端\\企业客户端\\run.bat",   //以后修改这里为新的程序路径即可;
    		NULL,
    		CREATE_DEFAULT_ERROR_MODE,
    		NULL,
    		NULL,
    		&si,
    		&pi
    		))
    	{
    		printf((" failed \n"), dw);
    		return 1;
    	}
    	WaitForSingleObject(pi.hProcess, INFINITE);
    	CloseHandle(pi.hProcess);
    	CloseHandle(pi.hThread);
    	return 0;
    }
    
    

    能正常运行,但编译链接后的.exe文件,用记事本打开后能够看到明文的administrator 密码“6inOve”,请问怎样能避免此密码泄露?
    2016年11月28日 9:48

全部回复

  • 可考虑将密码放在服务器程序中,运行时获取密码,而不是将密码存在EXE文件中。

    或是考虑以密文的方式存储密码(CreateProcessWithLogonW中的参数用密文),运行时调用解密的方法。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年11月28日 13:51
  • Hi huangweistu80,

    感谢在MSDN论坛发帖。

    >>能正常运行,但编译链接后的.exe文件,用记事本打开后能够看到明文的administrator 密码“6inOve”,请问怎样能避免此密码泄露?

    建议你不要直接传入password明文做为参数。一般情况,我们会使用GetUserProfileDirectory函数获取当前登陆用户的信息。然后作为参数传入CreateProcessWithLogonW函数中。例如:

    if (!LogonUser(argv[1], NULL, argv[2], LOGON32_LOGON_INTERACTIVE, 
                LOGON32_PROVIDER_DEFAULT, &hToken))
        DisplayError(L"LogonUser");
    
    if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
        DisplayError(L"CreateEnvironmentBlock");
    
    dwSize = sizeof(szUserProfile)/sizeof(WCHAR);
    
    if (!GetUserProfileDirectory(hToken, szUserProfile, &dwSize))
        DisplayError(L"GetUserProfileDirectory");
    
    if (!CreateProcessWithLogonW(argv[1], NULL, argv[2], 
                LOGON_WITH_PROFILE, NULL, argv[3], 
                CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile, 
                &si, &pi))
        DisplayError(L"CreateProcessWithLogonW");
    
    if (!DestroyEnvironmentBlock(lpvEnv))
        DisplayError(L"DestroyEnvironmentBlock");

    详细示例,可以参考以下文档。

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms682431%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月29日 2:48
  • 一般是以命令行参数的方式传递进去~

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2016年11月29日 12:32
    版主
  • Hi huangweistu80,

    感谢在MSDN论坛发帖。

    >>能正常运行,但编译链接后的.exe文件,用记事本打开后能够看到明文的administrator 密码“6inOve”,请问怎样能避免此密码泄露?

    建议你不要直接传入password明文做为参数。一般情况,我们会使用GetUserProfileDirectory函数获取当前登陆用户的信息。然后作为参数传入CreateProcessWithLogonW函数中。

    感谢您的回复。因为我的目的是要让用domain user 身份登陆的用户,可以运行某些必须要administrator权限才能运行的程序,所以要在程序中切换成local administrator或domain administrator身份来启动程序(administrator 密码普通用户并不知道也不能让他们知道),所以请问如何能切换身份而不泄露密码呢?
    2016年12月1日 3:45
  • >>感谢您的回复。因为我的目的是要让用domain user 身份登陆的用户,可以运行某些必须要administrator权限才能运行的程序,所以要在程序中切换成local administrator或domain administrator身份来启动程序(administrator 密码普通用户并不知道也不能让他们知道),所以请问如何能切换身份而不泄露密码呢?

    可以使用LoginUser函数设置临时登陆的用户。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 Baron Bi 2016年12月2日 8:26
    2016年12月2日 8:26
  • >>感谢您的回复。因为我的目的是要让用domain user 身份登陆的用户,可以运行某些必须要administrator权限才能运行的程序,所以要在程序中切换成local administrator或domain administrator身份来启动程序(administrator 密码普通用户并不知道也不能让他们知道),所以请问如何能切换身份而不泄露密码呢?

    可以使用LoginUser函数设置临时登陆的用户。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    使用LoginUser 能隐藏administrator 密码么?我需要在隐藏administrator 密码的情况下切换身份到administrator或者以administrator 身份启动我需要的程序。
    2016年12月5日 10:29
  • Hi huangweistu80,

    >>使用LoginUser 能隐藏administrator 密码么?我需要在隐藏administrator 密码的情况下切换身份到administrator或者以administrator 身份启动我需要的程序。

    使用LogonUser函数是在程序内部实现用户之间的切换。密码不会被其他程序检测到。所以可以解决你的问题。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月13日 9:30