Веб-сервис выполняется на удаленном компьютере - PullRequest
0 голосов
/ 18 января 2010

Я использую веб-сервис asmx для блокировки папки на удаленном компьютере!

Когда я запускаю веб-сервис на локальной машине, все работает нормально, но когда я запускаю его на удаленном компьютере, ничего не происходит, папка на удаленном компьютере остается разблокированной!

Я полагаю, что мне нужно установить разрешение безопасности для этого веб-сервиса на удаленном компьютере, но я не знаю, где!

Итак, что мне нужно, чтобы запустить эту службу на удаленном компьютере?

Ответы [ 5 ]

0 голосов
/ 21 января 2010

Ну, вы всегда можете запустить пул приложений веб-службы, как с учетной записью администратора! Не рекомендуется делать это в производстве, но если это работает, по крайней мере, у вас есть отправная точка. Удачи.

0 голосов
/ 18 января 2010

Поскольку это ASMX, я думаю, что он относится к правилам олицетворения ASP.NET. Поскольку программно нет функции входа в систему, вы должны использовать неуправляемый API.

Допустим, вам нужно что-то делать в контексте олицетворения (под учетной записью пользователя на удаленном компьютере, у которого есть доступ в нужном вам месте).

Impersonation.Execute(myEntity.NasUser, myEntity.NasPassword, () =>    
{     
//Copy File to UNC Path for example
   File.Copy(sourceFile, Path.Combine(myEntity.UploadPath, Path.GetFileName(sourceFile)), true);     
});

Импорт неуправляемых API:

    [DllImport("advapi32.dll", SetLastError = true)]     
    public static extern bool LogonUser(     
        string lpszUsername,     
        string lpszDomain,     
        string lpszPassword,     
        int dwLogonType,     
        int dwLogonProvider,     
        out IntPtr phToken     
        );    
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]     
    public extern static bool CloseHandle(IntPtr handle);     

Вышеупомянутое выполнение может быть примерно таким:

public static void Execute(string userName, string domain, string password, Action action)    
    {     
        try     
        {     
            bool bImpersonated = LogonUser(     
                userName,     
                domain,     
                password,     
                logon32LogonInteractive,     
                logon32ProviderDefault,     
                out tokenHandle);     
            if (bImpersonated == false)     
            {     
                throw new Win32Exception(Marshal.GetLastWin32Error());     
            }     
            WindowsIdentity newId = new WindowsIdentity(tokenHandle);     
            impersonatedUser = newId.Impersonate();     
            action();     
        }     
        catch (Exception ex)     
        {     
            throw ex;     
        }     
        finally     
        {     
            if (impersonation != null)     
                impersonation.Dispose();     
        }     
    }

Вы не должны забывать отменить олицетворение и вернуться в предыдущее состояние windowscredentials:

public void Dispose()    
{     
    // Stop impersonating the user.     
    if (impersonatedUser != null)     
        impersonatedUser.Undo();     
    // close handle     
    if (tokenHandle != IntPtr.Zero)     
        CloseHandle(tokenHandle);     
}
0 голосов
/ 18 января 2010

Я подозреваю, что это разрешения, сетевой сервис имеет доступ на чтение / запись к папке?

Может быть, вы можете попробовать личность подражать.

<system.web>
<identity impersonate="true" userName="WindowsDomain\YourUserName" password="YourPassword" />
</system.web> 

РЕДАКТИРОВАТЬ Я бы начал с проверки того, что папка на сервере имеет разрешения на запись для сетевой службы. Если безопасность папки не может быть изменена, используйте личность, выдаваемую за себя в веб-конфигурации, и сопоставьте ее с пользователем на сервере.

РЕДАКТИРОВАТЬ 2 Получается ли какая-либо ошибка при попытке кода заблокировать папку?

0 голосов
/ 18 января 2010

Это функция, которая удаляет разрешение пользователя на определенную папку:

Public Function RemoveAllowPermission(ByVal filePath As String, ByVal username As String, ByVal power As String) 

        Dim dirinfo As DirectoryInfo = New DirectoryInfo(filePath)

        Dim dirsecurity As DirectorySecurity = dirinfo.GetAccessControl()
        dirsecurity.SetAccessRuleProtection(True, True)
        Select Case power

            Case "FullControl"

                dirsecurity.RemoveAccessRuleAll(New FileSystemAccessRule(username, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow))

                dirsecurity.RemoveAccessRuleAll(New FileSystemAccessRule(username, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow))

                dirsecurity.RemoveAccessRuleAll(New FileSystemAccessRule(username, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow))

            Case "ReadOnly"

                dirsecurity.RemoveAccessRuleAll(New FileSystemAccessRule(username, FileSystemRights.Read, AccessControlType.Allow))

            Case "Write"

                dirsecurity.RemoveAccessRuleAll(New FileSystemAccessRule(username, FileSystemRights.Write, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow))

                dirsecurity.RemoveAccessRuleAll(New FileSystemAccessRule(username, FileSystemRights.Write, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow))

                dirsecurity.RemoveAccessRuleAll(New FileSystemAccessRule(username, FileSystemRights.Write, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow))

            Case "Modify"

                dirsecurity.RemoveAccessRuleAll(New FileSystemAccessRule(username, FileSystemRights.Modify, AccessControlType.Allow))

        End Select

        dirinfo.SetAccessControl(dirsecurity)

    End function

В следующей функции я вызываю функцию RemoveAllowPermission:

 <WebMethod()> _
    Public Function ChangePermission()
        Dim file As String = "C:\Pictures"
        Dim fs As FileSecurity = System.IO.File.GetAccessControl(file)
        Dim owner As NTAccount = CType(fs.GetOwner(GetType(NTAccount)), NTAccount)

        Dim usergroup As AuthorizationRuleCollection = fs.GetAccessRules(True, True, (GetType(System.Security.Principal.NTAccount)))
        Try
            For Each Rule As FileSystemAccessRule In usergroup
                RemoveAllowPermission(file, Rule.IdentityReference.Value, "FullControl")
              Next
        Catch ex As Exception
Return ("Error")
        End Try
    End Sub
Return 0
End Class

Поэтому, когда я запускаю службу на удаленном компьютере, моя функция ChangePermission перехватывает исключение и возвращает сообщение об ошибке Ошибка!

0 голосов
/ 18 января 2010

Под какими учетными данными работает удаленный asmx? Имеет ли он права на выполнение операций в файловой системе вне своей структуры папок?

...