Подключиться к именованному каналу в той же сети без прав администратора - PullRequest
0 голосов
/ 14 октября 2018

Я создал сервер именованных каналов и предоставил всем пользователям права на полный доступ.Я попытался подключиться к серверу именованных каналов с другой машины в той же сети, но получаю сообщение об ошибке, в котором говорится, что вход не выполнен - ​​ERROR_LOGON_FAILURE.

Я прочитал о NullSessionPipes и скомпилировал пример из MSDN.Однако мне нужно административное право для регистрации NullSessionPipe в реестре, которого я пытаюсь избежать.

Как CreateFile фактически выполняет вход в удаленный именованный канал?Нужно ли запускать мой клиент в определенном контексте, чтобы это работало?(например, Гость).

код сервера:

DWORD dwRes, dwDisposition;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld =
    SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
SECURITY_ATTRIBUTES sa;
LONG lRes;
HKEY hkSub = NULL;

// Create a well-known SID for the Everyone group.
if (!AllocateAndInitializeSid(&SIDAuthWorld, 1,
    SECURITY_WORLD_RID,
    0, 0, 0, 0, 0, 0, 0,
    &pEveryoneSID))
{
    return false;

}

// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, 1 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = 0xFFFFFFFF;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance = NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID;

// Create a new ACL that contains the new ACEs.
dwRes = SetEntriesInAcl(1, ea, NULL, &pACL);
if (ERROR_SUCCESS != dwRes)
{
    return false;
}

// Initialize a security descriptor.  
pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,
    SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD)
{
    return false;

}

if (!InitializeSecurityDescriptor(pSD,
    SECURITY_DESCRIPTOR_REVISION))
{
    return false;
}

// Add the ACL to the security descriptor. 
if (!SetSecurityDescriptorDacl(pSD,
    TRUE,     // bDaclPresent flag   
    pACL,
    FALSE))   // not a default DACL 
{
    return false;
}

// Initialize a security attributes structure.
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;

// create named pipe
auto NamedPipe = CreateNamedPipeA(namedPipeName,
                                    PIPE_ACCESS_DUPLEX,
                                    PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT | PIPE_ACCEPT_REMOTE_CLIENTS,
                                    PIPE_UNLIMITED_INSTANCES,
                                    NAMED_PIPE_SIZE,
                                    NAMED_PIPE_SIZE,
                                    NMPWAIT_USE_DEFAULT_WAIT, 
                                    &sa);

1 Ответ

0 голосов
/ 14 октября 2018

как выполнить эту задачу, описанную в Как создать анонимный канал, который дает доступ каждому

Ошибка ERROR_LOGON_FAILURE говорит о том, что клиентский код не устанавливает соединение с сетевым ресурсом.действительно нужно вызвать WNetAddConnection2 (или аналоговый API перед вызовом CreateFile на удаленном канале)

Клиент открывает канал с помощью вызова функции CreateFile.Если происходит ошибка, клиент проверяет, является ли это ошибкой входа в систему, ошибкой в ​​доступе или ошибкой неверного пароля.Если возникает ошибка, выполните анонимный вход в систему, вызвав функцию WNetAddConnection2 и передав пустую строку в качестве имени пользователя и пароля.Когда нулевой сеанс установлен, клиент снова вызывает функцию CreateFile.

, поэтому код клиента должен выглядеть так:

    NETRESOURCE nr = {};
    nr.dwUsage = RESOURCEUSAGE_CONNECTABLE|RESOURCEUSAGE_CONTAINER;
    nr.lpRemoteName = L"\\\\server\\IPC$";

    WNetAddConnection2W(&nr, L"", L"",0);

    HANDLE hFile = CreateFileW(L"\\\\?\\UNC\\server\\PIPE\\MyPipe",
        FILE_GENERIC_READ|FILE_GENERIC_WRITE, 
        0, 0, OPEN_EXISTING, 0, 0);

со стороны сервера должен не только устанавливать 0на месте DACL (это разрешить любой доступ) или разрешить добавление ACE для WinAnonymousSid (это! = WinWorldSid aka каждый ), но также установить ненадежные обязательные метки.это проскальзывает в примере кода, потому что я думаю, что код еще не до конца.

    SECURITY_DESCRIPTOR sd;
    BOOL fOk = InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) &&
        SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE);

    if (fOk)
    {
        RTL_OSVERSIONINFOW ovi = { sizeof(ovi) };
        if (0 > RtlGetVersion(&ovi))
        {
            fOk = FALSE;
        }
        else
        {
            if (ovi.dwMajorVersion > 5)
            {
                fOk = FALSE;
                ULONG cb = GetSidLengthRequired(1);
                PSID UntrustedLabelSid = alloca(cb);
                if (CreateWellKnownSid(WinUntrustedLabelSid, 0, UntrustedLabelSid, &cb))
                {
                    PACL Sacl = (PACL)alloca(cb += sizeof(ACL) + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
                    fOk = InitializeAcl(Sacl, cb, ACL_REVISION) &&
                        AddMandatoryAce(Sacl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, UntrustedLabelSid) &&
                        SetSecurityDescriptorSacl(&sd, TRUE, Sacl, FALSE);
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...